使用 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:2031.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;
}