【发布时间】:2012-08-02 15:48:38
【问题描述】:
使用 C# 使用 Open XML 2.0 来解析大型 excel 文件。我遇到的问题是我正在解析的单元格没有 DataType 我然后检查 NumberFormatId 以确定它是十进制、数字还是日期。我正在寻找数字/小数与日期的确切 NumberFormatId 范围。它们似乎无处不在,一些数字/小数的格式为 189,212,214,305,日期的值为 185、194、278 等。有人知道规范是否定义了这些范围吗?
已编辑 - 更多信息
下面是 xl 文件夹中 style.xml 文件中 194 的数字格式示例。
Excel 表格来自世界不同地区,所以我认为数字格式不同,但它们是否重叠? numFmtId 194 会不是不同文化背景下的日期吗?
下面是我如何将“40574”之类的 c.CellValues 转换为日期,但问题是我如何知道“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 并对其进行解析以确定它是否是日期?
下面是数字格式 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"
【问题讨论】:
-
查看那些包含整数值和相应格式的表格的页面:closedxml.codeplex.com/… 或lateral8.com/articles/2010/6/11/…。
-
您是否需要更多帮助,或者这些链接足以解决您的问题?如果是这样,我可以将其作为解决方案发布:)。如果您想了解更多信息或正在寻找不同的东西,请告诉我,我会尽力提供帮助。
-
需要更多信息。提供的链接不涵盖我在问题 189,212,214,305 等中列出的格式。我正在寻找所有日期与数字/小数或字符串的范围。
-
能否请您发布您正在解析的代码 sn-p 的 xls 文件的 xml,显示您如何检查
NumberFormatId属性?这可能会有所帮助。 -
我刚刚更新了我之前的帖子,提供了更多信息。
标签: c# openxml openxml-sdk