Работа с Open XML 2.0 с использованием С# для анализа больших файлов excel. Проблема, с которой я столкнулась, - это ядро, которое я обрабатываю, не имеет DataType. Затем я проверяю NumberFormatId, чтобы определить, является ли оно десятичным, числом или датой. Я ищу точный диапазон NumberFormatId для чисел/десятичных знаков и дат. Они, кажется, повсюду, некоторые числа/десятичные знаки имеют форматы 189,212,214,305 и даты, имеющие значения 185, 194, 278 и т.д. Кто-нибудь знает, определяет ли спецификация этих диапазонов?
Отредактировано - Дополнительная информация
Ниже приведен пример формата чисел 194 из файла style.xml внутри папки xl.
Листы excel из разных регионов мира, поэтому я думаю, что числовые форматы разные, но перекрываются ли они? Будет ли numFmtId 194 быть чем-то иным, чем дата в разных настройках культуры?
Ниже показано, как я конвертирую c.CellValues как "40574" в даты, но проблема в том, как узнать, является ли "40574" датой, а не цифрой?
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
В настоящее время я делаю это, проверяя, нет ли DataType, чем проверка 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
Edit
В моем обновленном сообщении я забыл опубликовать значение, которое я нашел в файле style.xml:
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
Итак, с этим мой вопрос будет в том, как я могу получить formatCode и проанализировать его, чтобы определить, является ли это датой?
Ниже приведен вывод из окна немедленного отладки в формате format 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"