.NET ClosedXML - 强制Excel工作表识别格式

时间:2018-03-01 14:30:46

标签: .net excel date-formatting closedxml

(将附加编辑重新发布到this question here

我正在通过添加数据集来构建Excel工作簿,然后将格式添加到特定列。代码示例:

    var wb = new XLWorkbook();
    wb.Worksheets.Add(ds);
    foreach (IXLWorksheet ws in wb.Worksheets)
    {
        if (value == 1)
        {
            ws.Column(16).Style.DateFormat.Format = "yyyy-MM-dd";
            ws.Column(17).Style.DateFormat.Format = "yyyy-MM-dd";
        }
        else
        { }
    }

    return wb;

当我查看最终文档时,日期仍显示为详细信息 - 12/7/2017 12:00:00 AM - 但文档格式为IS。如果我执行手册“点击进入单元格并退出”,则格式化更新,就像将文本添加到列中一样。

当然,我不想这样做,我希望格式化能够立即采用。

我认为问题在于我首先添加数据并将其格式化,就像常规工作表一样。但是那里有一个命令来刷新/应用/你有什么格式?我担心,因为在Excel中没有这样的命令(任何为什么不能,稍微离题)这里可能没有,但是值得检查。

1 个答案:

答案 0 :(得分:0)

GitHub所述,我无法用您的代码复制您的问题。

这是一个在我的机器上完美运行的代码示例:

using ClosedXML.Excel;
using System;
using System.Data;
using System.Linq;

public class Program
{
    public static void Main()
    {
        using (var wb = new XLWorkbook())
        {
            var dataSet = GetDataSet();

            // Add all DataTables in the DataSet as a worksheets
            wb.Worksheets.Add(dataSet);

            var ws = wb.Worksheets.First();

            ws.Column(4).Style.DateFormat.Format = "d MMMM yyyy";

            wb.SaveAs("outputfile.xlsx");
        }
    }

    private static DataSet GetDataSet()
    {
        var ds = new DataSet();
        ds.Tables.Add(GetTable("Patients"));
        ds.Tables.Add(GetTable("Employees"));
        ds.Tables.Add(GetTable("Information"));
        return ds;
    }

    private static DataTable GetTable(String tableName)
    {
        DataTable table = new DataTable();
        table.TableName = tableName;
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1));
        table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2));
        table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3));
        table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4));
        table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5));
        return table;
    }
}