write read poi leer create java excel apache-poi xssf

java - read - Problema de estilo de celda de Excel



leer excel java (1)

Estoy usando el siguiente código para obtener el valor de fecha del archivo XLSX. Esto está funcionando absolutamente bien para algunos archivos xlsx . Pero no está dando el formato de fecha exacto que está en el archivo xlsx. Este problema es para algún archivo.

p.ej; Tengo una fecha como esta 21/01/2016 (dd/mm/yyyy) pero después de leer, da la fecha como 01/21/16(mm/dd/yy)

¿Hay alguna otra forma de obtener cellstyle?

¿Es cuestión de archivo xlsx?

String dateFmt = cell.getCellStyle().getDataFormatString(); if (DateUtil.isCellDateFormatted(cell)) { double val = cell.getNumericCellValue(); Date date = DateUtil.getJavaDate(val); String dateFmt = cell.getCellStyle().getDataFormatString(); System.out.println("dateFmt "+dateFmt); value = new CellDateFormatter(dateFmt).format(date); System.out.println("Date "+value); }


Si la celda, que contiene la fecha, está formateada como el formato de fecha predeterminado ( Short Date ), entonces solo el ID de formato 0xE (14) se almacena en el archivo. Ver https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html . El archivo *.xlsx contiene solo

<xf numFmtId="14" ... applyNumberFormat="1"/>

en styles.xml . No hay un formatCode especial guardado para este numFmtId .

Entonces, cómo se mostrará esto en Excel depende de la configuración regional del sistema.

Por ejemplo, con mi sistema de Windows alemán, numFmtId="14" se mostrará como TT.MM.JJJJ como se establece en la configuración de Region and Language :

En los sistemas de Windows de Gran Bretaña en inglés, esto será DD/MM/YYYY por defecto.

Pero si cambia la configuración de Short Date en la configuración del sistema, a JJJJ-MM-TT por ejemplo, este formato también se mostrará en Excel con numFmtId="14" .

Entonces, para saber cómo exactamente Excel mostrará la fecha con numFmtId="14" , es necesario conocer la configuración exacta del sistema de Windows en Region and Language .

Entonces, Apache POI no puede saber cómo se debe mostrar esto sin conocer la configuración regional del sistema, ya que el archivo no contiene información sobre esto. Por lo tanto, asumirá la configuración regional en-us . Esto lleva a m/d/yy para la fecha.

Puede verificar si se usa la identificación de formato 14 y, de ser así, definir su propio formato de fecha predeterminado.

if (DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); System.out.println(date); String dateFmt = ""; if (cell.getCellStyle().getDataFormat() == 14) { //default short date without explicit formatting dateFmt = "dd/mm/yyyy"; //default date format for this } else { //other data formats with explicit formatting dateFmt = cell.getCellStyle().getDataFormatString(); } System.out.println("dateFmt " + dateFmt); String value = new CellDateFormatter(dateFmt).format(date); System.out.println("Date " + value); }

Para ser claro: todo esto es solo con numFmtId="14" cell.getCellStyle().getDataFormat() == 14 . Todos los demás formatos de fecha tendrán cadenas de formato de datos explícitas cell.getCellStyle().getDataFormatString() y, por lo tanto, POI puede mostrarlas exactamente como en Excel.

Consulte PDI DataFormatter devuelve 2 dígitos al año en lugar de 4 dígitos al año para las celdas de fechas para DataFormatter cómo usar DataFormatter para DataFormatter este problema.