Trabajar con Open XML 2.0 usando C# para analizar grandes archivos de Excel. Problema que me estoy encontrando es que la celda que estoy analizando no tiene un DataType. Luego verifico NumberFormatId para determinar si es decimal, número o fecha. Estoy buscando el rango exacto NumberFormatId para números/decimales contra fechas. Parecen estar por todos lados, algunos números/decimales tienen formatos de 189,212,214,305 y fechas con valores de 185, 194, 278, etc. ¿Alguien sabe si la especificación define estos rangos?C# Open XML 2.0 NumberFormatId rango
Editado - Más información
A continuación se muestra un ejemplo del formato de número de 194 a partir del archivo style.xml dentro de la carpeta xl.
Las hojas de Excel son de diferentes regiones del mundo, así que estoy pensando que los formatos de los números son diferentes, pero ¿se superponen? ¿Será numFmtId 194 algo diferente a una fecha en diferentes configuraciones de cultura?
A continuación se muestra cómo estoy convirtiendo c.CellValues como "40574" a las fechas, pero el problema es ¿cómo sé si "40574" es una fecha y no un número?
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
Actualmente estoy haciendo esto comprobando si no hay un Tipo de datos de comprobar el CellFormat pero hay problemas cuando algunos de los IdFormatoNumerico no están en mi cheque.
private Object FormatCellValue(Cell c, SharedStringTable ssTable, CellFormats cellFormats)
{
if (c.CellValue != null)
{
// If there is no data type, this must be a string that has been formatted as a number
if (c.DataType == null)
{
CellFormat cf;
if (c.StyleIndex == null)
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(0);
}
else
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(Convert.ToInt32(c.StyleIndex.Value));
}
if ((cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22) ||
(cf.NumberFormatId >= 165 && cf.NumberFormatId <= 180) ||
cf.NumberFormatId == 278 || cf.NumberFormatId == 185 || cf.NumberFormatId == 196 ||
cf.NumberFormatId == 217 || cf.NumberFormatId == 326) // Dates
{
try
{
DateTime dt;
dt = DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
...CODE CONTINUES
Editar
En mi post actualizado que se olvidó de publicar el valor que encontré en el archivo style.xml:
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
Así que con esto mi pregunta sería ¿cómo puedo obtener el formatCode y analizarlo para determinar si se trata de una fecha?
A continuación se muestra la salida de la ventana de depuración inmediata del NumberFormat 323
{DocumentFormat.OpenXml.Spreadsheet.CellFormat}
base {DocumentFormat.OpenXml.OpenXmlCompositeElement}: {DocumentFormat.OpenXml.Spreadsheet.CellFormat}
Alignment: {DocumentFormat.OpenXml.Spreadsheet.Alignment}
ApplyAlignment: "1"
ApplyBorder: "1"
ApplyFill: "1"
ApplyFont: "1"
ApplyNumberFormat: "1"
ApplyProtection: "1"
BorderId: "64"
ExtensionList: null
FillId: "0"
FontId: "83"
FormatId: "37992"
LocalName: "xf"
NumberFormatId: "323"
PivotButton: null
Protection: {DocumentFormat.OpenXml.Spreadsheet.Protection}
QuotePrefix: "1"
Eche un vistazo a las páginas que contienen una tabla con valores enteros y los formatos correspondientes: http://closedxml.codeplex.com/wikipage?title=NumberFormatId%20Lookup%20Table o http://lateral8.com/articles/2010 /6/11/openxml-sdk-20-formatting-excel-values.aspx. –
¿Desea más ayuda sobre esto o esos enlaces fueron suficientes para resolver su problema? Si es así, podría publicarlo como una solución :). Si desea obtener más información o está buscando algo diferente, hágamelo saber e intentaré ayudarlo. –
Necesita más información sobre esto. Los enlaces proporcionados no cubren los formatos que he enumerado en mi pregunta 189,212,214,305, etc. Estoy buscando un rango para todas las fechas frente a los números/decimales o cadenas. – maguy