我正在使用 EPPlus 读取 Excel 工作表并将数据加载到数据表中以执行进一步的操作,然后将修改后的数据保存回 Excel 文件。
下面的代码检查单元格值是否为浮点值,然后将浮点值转换为日期时间。
当单元格值为日期时,代码可以正常工作,例如: Invoice Date = 42009 ,但它将非日期值(例如: amount = 10 )转换为日期。
EPPlus 库中有什么方法可以确定单元格的格式(即常规/日期/数字等)?
float floatValue;
if (float.TryParse(Convert.ToString(oSheet.Cells[i, j].Value), out floatValue)
&& Convert.ToString(oSheet.Cells[i, j].Style.Numberformat.Format).Contains("[$-409]d\\-mmm\\-yy;@"))
{
dr[j - 1] = String.Format("{0:d-MMM-yy}", DateTime.FromOADate(floatValue));
}
else
{
DateTime date;
if (DateTime.TryParse(Convert.ToString(oSheet.Cells[i, j].Value), out date))
{
dr[j - 1] = String.Format("{0:d-MMM-yy}", date);
}
else
{
dr[j - 1] = Convert.ToString(oSheet.Cells[i, j].Value).Trim();
}
}
简而言之,如果 Excel 中的数据被格式化为“正确的”日期字段(其格式设置为日期并且单元格角上没有三角形),EPPlus 将确定这一点并自动将其转换为细胞存储。
Excel 将此信息存储在 XLSX xml 文件中,例如sheet1.xml 和 styles.xml,您可以通过将文件扩展名更改为 .ZIP 并作为压缩文件夹打开来看到它们。因此 EPPlus 将读取 XML 标志并自动将字段值转换为 DateTime。如果您想了解其详细信息,请下载 EPPlus 源代码并查看该函数private void SetValueFromXml(XmlTextReader xr, string type, int styleID, int row, int col)
在 ExcelWorksheet 类中。
我创建了一个工作表,添加了一个日期值,并将该值复制粘贴到单元格 B2,然后将格式设置为数字。然后,我将 B2 复制到 B3,但通过在值前面放置 ' 使 B3 中的值成为字符串。像这样:
当我运行这个单元测试时,一切都通过了:
[TestMethod]
public void Date_Number_Test()
{
//http://stackoverflow.com/questions/28591763/epplus-how-to-know-the-format-of-the-worksheet-cell
var existingFile = new FileInfo(@"c:\temp\datetest.xlsx");
using (var package2 = new ExcelPackage(existingFile))
{
var ws = package2.Workbook.Worksheets["Sheet1"];
var cell = ws.Cells["B1"];
Assert.IsTrue(cell.Value is DateTime);
cell = ws.Cells["B2"];
Assert.IsTrue(cell.Value is double);
cell = ws.Cells["B3"];
Assert.IsTrue(cell.Value is string);
}
}
但是,如果您正在处理格式超出您控制范围的工作表,那么我认为您的方法是正确的,因为您必须确定数字的“意图”是什么,而不是能够依赖 EPPlus(真正的 Excel)正在报告他们作为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)