我正在使用EPPlus读取Excel工作表并将数据加载到datatable中以执行进一步操作,然后将修改后的数据保存到excel文件中。
下面的代码检查单元格值是否为浮点值,然后将浮点值转换为datetime。
当单元格值是日期时,代码正常工作,例如: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();
}
}
答案 0 :(得分:2)
简短的回答是,如果Excel中的数据被格式化为"正确的"日期字段(其格式设置为日期,并且单元格角中没有三角形)EPPlus将确定并自动将其转换为单元存储中的日期。
Excel将此信息存储在XLSX xml文件中,例如sheet1.xml和styles.xml,您可以通过将文件扩展名更改为.ZIP并打开为压缩文件夹来查看。因此,EPPlus将读取XML标志并自动将字段值转换为DateTime。如果你想看到它的血腥细节下载EPPlus源代码并查看ExcelWorksheet类中的函数private void SetValueFromXml(XmlTextReader xr, string type, int styleID, int row, int col)
。
我创建了一个工作表,添加了一个日期值,并将该值复制粘贴到单元格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(真的很好)报告他们。
答案 1 :(得分:1)
如果您想了解当前的单元格格式,为什么不使用 ExcelNumberFormat 类?
var style=oSheet.Cells[i, j].style;
string format=style.Numberformat.Format;
这将为您提供当前的单元格格式,即“YYYY-MM-dddd”,“%#。##”等。