Ответ 1
Списки значений идентификаторов форматов
Ниже приведен список параметров формата (источник)
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, формат с идентификационным значением менее 164 встроен. Вы также можете найти более длинный список форматов.
Проверка значений идентификаторов форматов в файле xlsx
Для форматов с большими значениями ID вы можете найти их определения внутри самого файла. Чтобы увидеть их, вы должны открыть его с помощью архива zip-архива и найти файл styles.xml в каталоге xl. В качестве альтернативы откройте этот файл xlsx с помощью Open XML SDK 2.0 Productivity Tools и перейдите к этому файлу /xl/styles.xml/x:StyleSheet node.
В этом разделе вы должны иметь возможность видеть форматы, определенные в документе, вместе с присвоенными им значениями идентификаторов. Часть с форматами должна выглядеть примерно так:
...
<x:numFmts count="1">
<x:numFmt numFmtId="166" formatCode="yy/mm/dd;@" />
</x:numFmts>
...
Если посмотреть на форматы, сохраненные здесь, кажется, что id vlaues может быть специфичным для файла xlsx, поэтому, возможно, одно и то же значение ID может использоваться для определения разных форматов в двух разных файлах xlsx. Однако для встроенных форматов они предопределены, поэтому они должны быть одинаковыми во всех файлах.
Если вам нужна помощь в поиске этих форматов в вашем файле или дополнительной информации, сообщите мне.
ИЗМЕНИТЬ
Вы также можете найти дополнительную информацию о форматах чисел в этом документе: http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx.
EDIT II
Вы можете использовать этот код для получения словаря, содержащего все форматы, определенные в файле xlsx:
private Dictionary<uint, String> BuildFormatMappingsFromXlsx(String fileName)
{
Dictionary<uint, String> formatMappings = new Dictionary<uint, String>();
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, true))
{
var stylePart = document.WorkbookPart.WorkbookStylesPart;
var numFormatsParentNodes = stylePart.Stylesheet.ChildElements.OfType<NumberingFormats>();
foreach (var numFormatParentNode in numFormatsParentNodes)
{
var formatNodes = numFormatParentNode.ChildElements.OfType<NumberingFormat>();
foreach (var formatNode in formatNodes)
{
formatMappings.Add(formatNode.NumberFormatId.Value, formatNode.FormatCode);
}
}
}
return formatMappings;
}
Если вы хотите проверить, является ли какая-либо из них датой, я предполагаю, что простой способ проверки того, является ли формат кода (значение в словаре, созданным методом, который я опубликовал), содержит мм и yy.