使用 c# 使用 Open XML 2.0 来解析大型 excel 文件。我遇到的问题是我正在解析的单元格没有 DataType 我然后检查 NumberFormatId 以确定它是十进制、数字还是日期。我正在寻找数字/小数与日期的确切 NumberFormatId 范围。它们似乎无处不在,一些数字/小数的格式为 189,212,214,305,日期的值为 185、194、278 等。有谁知道规范是否定义了这些范围?
已编辑 - 更多信息
下面是 xl 文件夹中 style.xml 文件中数字格式 194 的示例。
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
编辑
在我更新的帖子中,我忘记发布在 style.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"