gpt4 book ai didi

c# - OpenXML - Cell.DateType 为空

转载 作者:太空狗 更新时间:2023-10-29 23:06:01 24 4
gpt4 key购买 nike

我无法确定 Cell 何时是日期。

Date DataType Cell

我注意到 DataType 为空,所以我无法区分它是否是日期数字。

我正在使用下一个代码来提取单元格:

WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(worksheetId);
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
Row[] rows = worksheetPart.Worksheet.Descendants<Row>().ToArray();
for (int i = 0; i < rows.Length; i++)
{
List<Cell> cells = rows[i].Elements<Cell>().ToList();
foreach (var cell in cells)
{
if (cell.DataType != null && cell.DataType.Value == CellValues.Date)
//this line is not hit for some reason
}
}
}

我错过了什么吗?

最佳答案

简而言之,它是 null,因为它应该用于数字和日期类型。

关于 msdn 的 OpenXML 文档

The value of the DataType property is null for numeric and date types.It contains the value CellValues.SharedString for strings, andCellValues.Boolean for Boolean values.

有一种方法可以使用 CellFormat 上的 NumberFormatId 来区分日期和数字单元格格式。诀窍是找到什么 id 映射到什么格式。您可以通过创建新的 excel 文件并将单元格设置为相关格式(即日期)来找出要使用的格式:

enter image description here

然后使用 7zip 提取 excel 文件并查看 xl/styles.xml 文件:

enter image description here

在上图中,您可以看到 formatId 14 转换为短日期。有关格式的完整列表,请参阅 ECMA-376 documentation for Office Open XML formats (数字格式表应该埋在 第 4 部分 的某处。他们将其移至第 18.8.30 节的第 1 部分)。

我为最常见的 formatIds 创建了一个枚举:

private enum Formats
{
General = 0,
Number = 1,
Decimal = 2,
Currency = 164,
Accounting = 44,
DateShort = 14,
DateLong = 165,
Time = 166,
Percentage = 10,
Fraction = 12,
Scientific = 11,
Text = 49
}

然后您可以创建一个辅助函数,它将按照您希望的方式为您获取格式化值:

private static string GetFormattedCellValue(WorkbookPart workbookPart, Cell cell)
{
if (cell == null)
{
return null;
}

string value = "";
if (cell.DataType == null) // number & dates
{
int styleIndex = (int)cell.StyleIndex.Value;
CellFormat cellFormat = (CellFormat)workbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(styleIndex);
uint formatId = cellFormat.NumberFormatId.Value;

if (formatId == (uint)Formats.DateShort || formatId == (uint)Formats.DateLong)
{
double oaDate;
if (double.TryParse(cell.InnerText, out oaDate))
{
value = DateTime.FromOADate(oaDate).ToShortDateString();
}
}
else
{
value = cell.InnerText;
}
}
else // Shared string or boolean
{
switch (cell.DataType.Value)
{
case CellValues.SharedString:
SharedStringItem ssi = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(cell.CellValue.InnerText));
value = ssi.Text.Text;
break;
case CellValues.Boolean:
value = cell.CellValue.InnerText == "0" ? "false" : "true";
break;
default:
value = cell.CellValue.InnerText;
break;
}
}

return value;
}

关于c# - OpenXML - Cell.DateType 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36670768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com