繁体   English   中英

将 Excel 单元格设置为 TimeSpan 值

[英]Set Excel cell to TimeSpan value

我需要创建一个 Excel 文件,其中包含一个包含时间值( TimeSpan对象)的列。

我正在使用GemBox.Spreadsheet ,我可以使用ExcelCell.Value属性或ExcelCell.SetValue方法创建一个包含日期值( DateTime对象)的列:

var workbook = new ExcelFile();
var worksheet = workbook.Worksheets.Add("Sheet1");

worksheet.Cells["A1"].Value = "Start Dates";

// Set cell value to DateTime with Value property.
worksheet.Cells["A2"].Value = DateTime.Today;

// Set cell value to DateTime with SetValue method.
worksheet.Cells["A3"].SetValue(DateTime.Today);

workbook.Save("output.xlsx");

但这些都不适用于TimeSpan
正确使用时,我得到NotSupportedException ,而在使用该方法时,我得到编译器错误。

令我困惑的是,我可以加载现有的 Excel 文件,其中包含包含时间值的单元格并读取它们。
所以,一定有办法让我也能写出来,对吧?

Excel 文件没有单独的日期和时间类型。

在读取这些具有时间值的单元格时,您可能会注意到它们的ExcelCell.ValueType设置为CellValueType.DateTime 换句话说, ExcelCell.Value包含DateTime object。

此外,如果您检查ExcelCell.Style.NumberFormat ,您会注意到它定义了一些时间格式,例如“h:mm:ss”。

无论如何,尝试使用这个SetValue扩展方法:

public static class GemBoxHelper
{
    public static void SetValue(this ExcelCell cell, TimeSpan span, string format = "[h]:mm:ss")
    {
        DateTime start = cell.Worksheet.Parent.Use1904DateSystem ?
            new DateTime(1904, 1, 1) :
            new DateTime(1899, 12, 30);

        DateTime date = start.Add(span);
        DateTime leapYearBug = new DateTime(1900, 3, 1);

        if (date < leapYearBug)
            date = date.AddDays(1);

        cell.SetValue(date);
        cell.Style.NumberFormat = format;
    }
}

此外,这是一个展示如何使用它的示例:

var workbook = new ExcelFile();
var worksheet = workbook.Worksheets.Add("Sheet1");

worksheet.Cells["A1"].SetValue(new TimeSpan(12, 30, 00));
worksheet.Cells["A2"].SetValue(new TimeSpan(999, 59, 59));

workbook.Save("output.xlsx");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM