使用 EPPlus 从 Excel 中读取超过 24 小时的持续时间
Reading a duration over 24h from Excel using EPPlus
我正在尝试从 excel 中读取特定单元格的文本值。所讨论的值是一个对多个单元格求和的公式。
到目前为止我尝试过的:
worksheet.Cells["E42"].Style.Numberformat.Format = "hh:mm"; //and [hh]:mm
result = worksheet.Cells["E42"].Text;
使用 FromAoDate 将 worksheet.Cells["E42"].Value
转换为 DateTime 对我也不起作用。
最好的结果是 08:20,比实际值小 24 小时。
编辑:
来自建议的结果
worksheet.Cells["E42"].Style.Numberformat.Format = "[hh]:mm";
result = worksheet.Cells["E42"].Text; //returns "08"
worksheet.Cells["E42"].Style.Numberformat.Format = "hh:mm";
result = worksheet.Cells["E42"].Text; //returns "08:20"
worksheet.Cells["E42"].Style.Numberformat.Format = "hh:mm";
result = worksheet.Cells["E42"].Text;
result = TimeSpan.TryParse((string)result, out TimeSpan tres); //returns 08:20:00
worksheet.Cells["E42"].Style.Numberformat.Format = "[hh]:mm";
result = worksheet.Cells["E42"].Text;
result = TimeSpan.TryParse((string)result, out TimeSpan tres); //returns 8.00:00:00
//converting to DateTime has similar results
result = DateTime.FromOADate(Convert.ToDouble(worksheet.Cells["E42"].Value));
//returns 31.12.1899 08:20:00
这将为您提供一个应该满足您需要的 TimeSpan 对象。
string result = worksheet.Cells["E42"].Text;
TimeSpan timeResult;
string[] split = result.Split(':');
timeResult = new TimeSpan(int.Parse(split[0]), int.Parse(split[1]), 0);
我还没有找到合适的解决方案,但是有办法。
var worksheet = package.Workbook.Worksheets[2];
var value = worksheet.Cells["E42"].GetValue<DateTime>(); //the cell contains 32:20 in excel
//returns 31.12.1899 08:20:00
var value2 = worksheet.Cells["E39"].GetValue<DateTime>(); //the cell contains 00:00 in excel
// which returns 30.12.1899 00:00:00
var t = value.Subtract(value2); //returns 1.08:20:00, which translates to 32:20:00
00:00
日期似乎转换为 DateTime.Parse("30.12.1899 00:00:00");
和 33:20
到 31.12.1899 08:20:00
,所以通过减去我们可以恢复实际时间跨度。
这是一个示例实现:
//Only works for single values
private bool TryGetTimeSpan(ExcelWorksheet sheet, string address, out TimeSpan? result)
{
var excelMinDate = DateTime.Parse("30.12.1899 00:00:00");
try
{
var time = sheet.Cells[address].GetValue<DateTime>();
result = time.Subtract(excelMinDate);
}
catch (FormatException)
{
result = null;
return false;
}
return true;
}
我正在尝试从 excel 中读取特定单元格的文本值。所讨论的值是一个对多个单元格求和的公式。
到目前为止我尝试过的:
worksheet.Cells["E42"].Style.Numberformat.Format = "hh:mm"; //and [hh]:mm
result = worksheet.Cells["E42"].Text;
使用 FromAoDate 将 worksheet.Cells["E42"].Value
转换为 DateTime 对我也不起作用。
最好的结果是 08:20,比实际值小 24 小时。
编辑: 来自建议的结果
worksheet.Cells["E42"].Style.Numberformat.Format = "[hh]:mm";
result = worksheet.Cells["E42"].Text; //returns "08"
worksheet.Cells["E42"].Style.Numberformat.Format = "hh:mm";
result = worksheet.Cells["E42"].Text; //returns "08:20"
worksheet.Cells["E42"].Style.Numberformat.Format = "hh:mm";
result = worksheet.Cells["E42"].Text;
result = TimeSpan.TryParse((string)result, out TimeSpan tres); //returns 08:20:00
worksheet.Cells["E42"].Style.Numberformat.Format = "[hh]:mm";
result = worksheet.Cells["E42"].Text;
result = TimeSpan.TryParse((string)result, out TimeSpan tres); //returns 8.00:00:00
//converting to DateTime has similar results
result = DateTime.FromOADate(Convert.ToDouble(worksheet.Cells["E42"].Value));
//returns 31.12.1899 08:20:00
这将为您提供一个应该满足您需要的 TimeSpan 对象。
string result = worksheet.Cells["E42"].Text;
TimeSpan timeResult;
string[] split = result.Split(':');
timeResult = new TimeSpan(int.Parse(split[0]), int.Parse(split[1]), 0);
我还没有找到合适的解决方案,但是有办法。
var worksheet = package.Workbook.Worksheets[2];
var value = worksheet.Cells["E42"].GetValue<DateTime>(); //the cell contains 32:20 in excel
//returns 31.12.1899 08:20:00
var value2 = worksheet.Cells["E39"].GetValue<DateTime>(); //the cell contains 00:00 in excel
// which returns 30.12.1899 00:00:00
var t = value.Subtract(value2); //returns 1.08:20:00, which translates to 32:20:00
00:00
日期似乎转换为 DateTime.Parse("30.12.1899 00:00:00");
和 33:20
到 31.12.1899 08:20:00
,所以通过减去我们可以恢复实际时间跨度。
这是一个示例实现:
//Only works for single values
private bool TryGetTimeSpan(ExcelWorksheet sheet, string address, out TimeSpan? result)
{
var excelMinDate = DateTime.Parse("30.12.1899 00:00:00");
try
{
var time = sheet.Cells[address].GetValue<DateTime>();
result = time.Subtract(excelMinDate);
}
catch (FormatException)
{
result = null;
return false;
}
return true;
}