使用 OpenXML 解析 excel 时获取不正确的单元格值
Getting incorrect cell value while parsing excel with OpenXML
我正在尝试解析 excel 并使用 C# 和 openxml 在数据表中获取结果。
下面是我的代码片段。
value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText;
}
return value;
但如果单元格值为 80.3600,则它会被解析为 80.36。
此外,如果值为 03-Jan-2018,则它会被解析为 43103。
问题是,我试图解析的 excel 是动态生成的,在 运行 时我不知道哪一列是日期,哪一列是数字。
有什么方法可以按原样获取值或将每个值作为字符串获取,即没有格式?
我注意到,数字和日期时间单元格的值具有不同的 styleIndex 值。
您可以通过 doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.
中的 styleIndex 获取单元格格式
var doc = SpreadsheetDocument.Open(File.Open("D:\123.xlsx", FileMode.Open), false);
var sheet = doc.WorkbookPart.Workbook.Descendants<Sheet>().FirstOrDefault();
WorksheetPart wsPart = (WorksheetPart)(doc.WorkbookPart.GetPartById(sheet.Id));
var cells = wsPart.Worksheet.Descendants<Cell>().ToList();
var numberingFormats = doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.ToList();
var stringTable = doc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
foreach (var cell in cells)
{
if (cell.DataType == null)
{
//DateTime
if (cell.StyleIndex != null)
{
var numerFormat = numberingFormats.ElementAt((int) cell.StyleIndex.Value - 1) as NumberingFormat;
if (numerFormat.FormatCode.Value == "[$-409]mmmm\ d\,\ yyyy;@")
{
Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("MMMM dd,yyyy"));
}
else if (numerFormat.FormatCode.Value == "[$-409]dd\-mmm\-yy;@")
{
Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("dd-MMM-yy"));
}
}
else
{
//Numeric
Console.WriteLine(int.Parse(cell.InnerText));
}
}
else if (cell.DataType.Value == CellValues.SharedString)
{
Console.WriteLine(stringTable.SharedStringTable.ElementAt(int.Parse(cell.InnerText)).InnerText);
}
}
也可以看这篇:Excel Interop cell formatting of Dates
我正在尝试解析 excel 并使用 C# 和 openxml 在数据表中获取结果。 下面是我的代码片段。
value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText;
}
return value;
但如果单元格值为 80.3600,则它会被解析为 80.36。 此外,如果值为 03-Jan-2018,则它会被解析为 43103。 问题是,我试图解析的 excel 是动态生成的,在 运行 时我不知道哪一列是日期,哪一列是数字。 有什么方法可以按原样获取值或将每个值作为字符串获取,即没有格式?
我注意到,数字和日期时间单元格的值具有不同的 styleIndex 值。 您可以通过 doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.
中的 styleIndex 获取单元格格式 var doc = SpreadsheetDocument.Open(File.Open("D:\123.xlsx", FileMode.Open), false);
var sheet = doc.WorkbookPart.Workbook.Descendants<Sheet>().FirstOrDefault();
WorksheetPart wsPart = (WorksheetPart)(doc.WorkbookPart.GetPartById(sheet.Id));
var cells = wsPart.Worksheet.Descendants<Cell>().ToList();
var numberingFormats = doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.ToList();
var stringTable = doc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
foreach (var cell in cells)
{
if (cell.DataType == null)
{
//DateTime
if (cell.StyleIndex != null)
{
var numerFormat = numberingFormats.ElementAt((int) cell.StyleIndex.Value - 1) as NumberingFormat;
if (numerFormat.FormatCode.Value == "[$-409]mmmm\ d\,\ yyyy;@")
{
Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("MMMM dd,yyyy"));
}
else if (numerFormat.FormatCode.Value == "[$-409]dd\-mmm\-yy;@")
{
Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("dd-MMM-yy"));
}
}
else
{
//Numeric
Console.WriteLine(int.Parse(cell.InnerText));
}
}
else if (cell.DataType.Value == CellValues.SharedString)
{
Console.WriteLine(stringTable.SharedStringTable.ElementAt(int.Parse(cell.InnerText)).InnerText);
}
}
也可以看这篇:Excel Interop cell formatting of Dates