我正在尝试使用EPPlus读取.xlsx文件。
我可以加载工作表并读取除保留日期的单元格以外的所有单元格,这些单元格返回十进制数字而不是单元格中的值。
FileInfo fileInfo = new FileInfo(filePath);
using (ExcelPackage excel = new ExcelPackage(fileInfo))
{
var worksheet = excel.Workbook.Worksheets.First();
string cellName = worksheet.Cells[i, colDate].ToString(); // = "A2"- correct cell
string cellValue= worksheet.Cells[i, colDate].Value.ToString(); // = "42874.6666666667"
}
该表的Cell [“A2”]的预期返回值是“5/19/2017 4:00:00 PM”,但我收到“42874.6666666667”。
获取该单元旁边的单元格中的数字值可以正常工作,因此我加载了正确的文件和工作表。
如何获取该单元格的日期(或至少是字符串并解析它)?
Excel将日期存储为自1900年1月1日(或Mac上的1904年)以来的天数,使用编程语言中的某种时间库,创建日期为1900年1月1日,并在每个单元格中添加任何值 - 在您的例如 - 42874.6666666667天。从理论上讲,这应该是在单元格中给出日期。
你需要使用MemoryStream
byte[] bin = File.ReadAllBytes(file);
using (MemoryStream stream = new MemoryStream(bin))
{
using (ExcelPackage excel = new ExcelPackage(stream))
{
var worksheet = excel.Workbook.Worksheets.First();
string cellValue = worksheet.Cells[2, 1].Value.ToString(); // A2 Cell value
}
}
将其中一个命名样式应用于具有值的单元格。
Excel实际上只有2(2.5?)种类型的单元格数据:
因此,日期实际上是浮点数的一个特例,应用了一种风格(“ShortDate”,“mmm dd yyyy”或其他)。
将样式应用于单元格确定它是如何呈现的,是的,EPPlus已经设置了在其样式字典中使用的Excel内置样式。
将样式应用于单元格的EPPlus方式与您在VBA中的方式非常相似:
'''VBA示例,使用内置样式'''如果是工作表(“Sheet1”)。范围(“B4”)。样式=“正常”然后是工作表(“Sheet1”)。范围(“B4”)。样式=“百分比”结束如果
在MSDN的某处,有一个C#/ VBA程序员的内置Excel样式的所有枚举/名称/定义的列表。这些样式也在EPPlus样式字典中设置。
您还可以将自己的样式定义添加到EPPlus代码中的样式字典中。在EPPlus中打开.XLSX文件时,以前在.XLSX文件中定义的任何自定义样式都可用。