C# Open XML 2.0 NumberFormatId диапазон

работа с Open XML 2.0 с помощью c# для анализа больших файлов excel. Проблема я бегу в это клетка я анализ не имеет данных я тогда проверяем NumberFormatId, чтобы определить, если это десятичное, число или дата. Я ищу точный диапазон NumberFormatId для чисел / десятичных знаков против дат. Они, похоже, повсюду, некоторые числа/десятичные дроби имеют форматы 189,212,214,305 и даты со значениями 185, 194, 278 и т. д. Кто-нибудь знает, определяет ли спецификация эти диапазоны?

Редактировать - Дополнительная Информация

Ниже приведен пример числового формата 194 из стиля.xml-файл в папке xl.

листы excel из разных регионов мира, поэтому я думаю, что числовые форматы разные, но они перекрываются? Будет ли numFmtId 194 чем-то иным, чем дата в разных настройках культуры?

ниже показано, как я конвертирую c.CellValues, как "40574" на даты, но проблема откуда мне знать, что" 40574 " - это дата, а не число?

 DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));

В настоящее время я делаю это, проверяя, нет ли типа данных, чем проверить CellFormat, но есть проблемы, когда некоторые из NumberFormatId не находятся в моей проверке.

    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

редактировать

в моем обновленном сообщении я забыл опубликовать значение, которое я нашел в стиле.xml-файл:

<numFmt numFmtId="323" formatCode="mmm/yy;@"/>

Итак, с этим моим вопросом будет как мне получить formatCode и проанализировать его определить, если это дата?

Ниже приведен вывод из окна немедленной отладки 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"

1 ответов


списки форматов значений ID

Ниже приведен список вариантов форматирования (источник)

ID  Format Code
0   General
1   0
2   0.00
3   #,##0
4   #,##0.00
9   0%
10  0.00%
11  0.00E+00
12  # ?/?
13  # ??/??
14  d/m/yyyy
15  d-mmm-yy
16  d-mmm
17  mmm-yy
18  h:mm tt
19  h:mm:ss tt
20  H:mm
21  H:mm:ss
22  m/d/yyyy H:mm
37  #,##0 ;(#,##0)
38  #,##0 ;[Red](#,##0)
39  #,##0.00;(#,##0.00)
40  #,##0.00;[Red](#,##0.00)
45  mm:ss
46  [h]:mm:ss
47  mmss.0
48  ##0.0E+0
49  @

Hower, этот список указывает только несколько форматов. Согласно этому сообщению:чтение дат из файлов OpenXML Excel, формат со значением ID менее 164 встроены. Вы также можете найти более длинный список форматов.

проверка значений идентификаторов форматов в xlsx-файле

для форматов с большими значениями ID, вы можете найти их определения внутри самого файла. Чтобы увидеть их, вы должны открыть его с помощью браузера zip-архива и найти стили.в XML на xl