【发布时间】:2020-02-07 17:11:03
【问题描述】:
我使用EPPlus excelpackage 和c# 从spreadsheet 获取值。电子表格有两个单独的列Date 和Time。问题是日期值是2/4/2020,但它返回为2/4/2020 12:00:00 AM。时间值为12:21 AM,但它返回12/30/1899 12:21:00 PM。我想要的结果是返回spreadsheet 中的值。我不清楚为什么会发生这种情况或如何根据我的需要解决问题。
using (ExcelPackage package = new ExcelPackage(fs))
{
ExcelWorkbook excelWorkBook = package.Workbook;
ExcelWorksheet ws = excelWorkBook.Worksheets.First();
int rowCount = 0;
rowCount = ws.Dimension.End.Row;
for (int r = 2; r <= rowCount; r++)
{
string status = ws.Cells[r, 11].Value?.ToString();
string deliveredDate = ws.Cells[r, 15].Value?.ToString();
string deliveredTime = ws.Cells[r, 17].Value?.ToString();
}
fs.Close();
}
}
【问题讨论】:
-
没有错。 Excel 将日期存储为 OADate 值 - 本质上是具有特定含义的两倍。 Epplus 理解 OADates 并将
DateTime值存储为 OADates。日期或时间的显示方式取决于单元格的样式。如果修改字符串,则会破坏日期。 不要触摸值,改为修改单元格样式 -
我不清楚你的建议。如果您的意思是修改电子表格中的单元格样式,我没有权限这样做。我应该解析出我需要的值吗?
-
使用例如
ws.Cells[r, 11].Style.Numberformat.Format = "yyyy-mm-dd";或ws.Cells[r, 11].Style.Numberformat.Format = "mm/dd/yyyy";仅将值显示为日期。hh:mm时间等 -
您已经在尝试修改电子表格。问题在于 错误 样式。你必须修复它。值没有问题,问题是style。
-
DateTime.ToOADate 文档解释了 OADate 是什么,end 解释了基准实际上是 1899 年 12 月 30 日。因此,如果时间值被格式化为 date,它将显示为
12/30/1899 12:21:00 PM
标签: c# excel excelpackage