我正在尝试使用EPPlus读取.xlsx文件。
我可以加载工作表并读取除包含日期的单元格之外的所有其他单元格,这些单元格返回一个十进制数字而不是单元格中的值。
<DsCyclicLoading xmlns="http://tempuri.org/DsCyclicLoading.xsd">
<CyclicLoading>
<ComponentID>3</ComponentID>
<ComponentName>GHI</ComponentName>
<Standard>789</Standard>
<CaseName>Normal Very Hot Start</CaseName>
</CyclicLoading>
<CyclicLoading>
<ComponentID>1</ComponentID>
<ComponentName>ABC</ComponentName>
<Standard>123</Standard>
<CaseName>Normal Cold Start</CaseName>
</CyclicLoading>
<CyclicLoading>
<ComponentID>2</ComponentID>
<ComponentName>DEF</ComponentName>
<Standard>456</Standard>
<CaseName>Normal Warm Start</CaseName>
</CyclicLoading>
</DsCyclicLoading>
该工作表的Cell [“ A2”]的预期返回值为“ 5/19/2017 4:00:00 PM”,但我收到的是“ 42874.6666666667”。
在该单元格旁边的单元格中获取数字值可以正常工作,因此我加载了正确的文件和工作表。
如何获取该单元格的日期(或至少要解析字符串)?
答案 0 :(得分:2)
Excel存储日期为自1900年1月1日以来的天数(在Mac上可能为1904年), 使用您的编程语言中的某种时间库,创建一个1900年1月1日的日期,并添加每个单元格中的任何值-在您的示例中-42874.6666666667天。从理论上讲,这应该为您提供单元格中的日期。
答案 1 :(得分:0)
您需要使用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
}
}
答案 2 :(得分:0)
将其中一种命名样式应用于其中包含值的单元格。
Excel实际上只有两种(2.5?)类型的单元格数据:
因此,日期实际上是浮点数的一种特殊情况,其上应用了一种样式(“ ShortDate”,“ mmm dd yyyy”或其他)。
将样式应用于单元格可以确定样式的显示方式,是的,EPPlus已将Excel内置样式设置为在样式字典中使用。
EPPlus将样式应用于单元格的方式与您在VBA中的方式非常相似:
'''''VBA示例,使用内置样式''' 如果Worksheets(“ Sheet1”)。Range(“ B4”)。Style =“ Normal”然后 Worksheets(“ Sheet1”)。Range(“ B4”)。Style =“ Percent” 如果结束
在MSDN中的某个地方,列出了C#/ VBA程序员内置Excel样式的所有枚举/名称/定义。这些样式也在EPPlus样式字典中设置。
您还可以在EPPlus代码中将自己的样式定义添加到样式字典中。当您在EPPlus中打开.XLSX文件时,以前在.XLSX文件中定义的任何自定义样式也将可用。