c# – OpenXML – Cell.DateType为null
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – OpenXML – Cell.DateType为null,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2531字,纯文字阅读大概需要4分钟。
内容图文
![c# – OpenXML – Cell.DateType为null](/upload/InfoBanner/zyjiaocheng/827/f260c1e851f142a4a300f51ba09919b6.jpg)
我无法确定Cell是一个约会.
我注意到DataType为null所以我无法区分它是否是一个日期的数字.
我正在使用下一个代码来提取单元格:
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, and
CellValues.Boolean for Boolean values.
有一种方法可以使用CellFormat上的NumberFormatId来区分日期和数字单元格格式.诀窍是找到什么id映射到什么格式.您可以通过创建新的Excel文件并将单元格设置为相关格式(即日期)来找出要使用的格式:
然后使用7zip提取excel文件并查看xl / styles.xml文件:
在上图中,您可以看到此格式Id 14转换为短日期.有关格式的完整列表,请参阅ECMA-376 documentation for Office Open XML formats(表格应隐藏在第4部分的某处).
我为最常见的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为null全部内容,希望文章能够帮你解决c# – OpenXML – Cell.DateType为null所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。