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.