Рассмотрим ячейку общего формата, имеющую значение 39,95. Когда я извлекаю CellFormat ячейки, он возвращает неправильную ячейку format-
CellFormat thisCellFormat = ((CellFormat)cellFmts.ChildElements[(int)thisCell.StyleIndex.Value]);
int fmtId = Convert.ToInt32(thisCellFormat.FormatId.Value);
Возвращаемое значение fmtId равно 1, а в некоторых случаях - 38, где должно быть 2 или 39.
Эта проблема относится только к ячейкам общего формата, я получаю правильный идентификатор для ячеек формата Number.
Ниже приведены стандартные форматы файлов форматов Office ECMA-376 Office с установленными наборами явных форматов ячеек для reference-
Код формата ID
0 Общие
1 0
2 0,00
3 #, ## 0
4 #, ## 0.00
9 0%
10 0,00%
11 0.00E + 00
12 #?/?
13 #??/??
14 мм-дд-гг
15 д-ммм-гг
16 д-ммм
17 мм-м
18 ч: мм AM/PM
19 ч: мм: сс AM/PM
20 ч: мм
21 ч: мм: сс
22 м/д/гг час: мм
37 #, ## 0; (#, ## 0)
38 #, ## 0; Красный
39 #, ## 0.00; (#, ## 0.00)
40 #, ## 0.00; Красный
45 мм: сс
46 [ч]: мм: сс
47 ммss.0
48 ## 0.0E + 0
49 @
Форматы, о которых вы говорите, определяются как стили, и когда Cell создается индекс стиля, устанавливается соответственно с помощью индекса стиля. Формат number format
встроен в эти стили, ссылаясь на NumberFormatId
Пример: создание CellFormats в Open XML, примечание разницы
CellFormat cellformat0 = new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 }; // default
CellFormat cellformat1 = new CellFormat() { NumberFormatId = 0 };
CellFormat cellformat2 = new CellFormat() { NumberFormatId = 49 };
Теперь cellformat1
может использоваться для общих ячеек, а cellformat2
может использоваться для принудительных строк строки.
Поэтому, когда вы пытаетесь извлечь код форматирования в общей ячейке, он может возвращать значение null, поскольку NumberFormatId
не установлен или 0, если формат номера установлен на общий тип.
Это объясняет, почему вы получаете правильный идентификатор для отформатированных чисел, но не для общих ячеек.