15

我目前正在使用 NPOI 根据我的 asp.net mvc 应用程序中的数据库生成 Excel 文件。我几乎完成了代码,除了在尝试将日期写入 Excel 时不断遇到的一个小问题。

在数据库(MS SQL Server)中,我将日期保存为 41883、41913 等……在 C# 中,我可以使用它转换为 DataTime 对象

DateTime dt = DateTime.FromOADate(Convert.ToDouble(41883));

我用来将日期写入 Excel 的代码看起来是这样的:

var cell = excelRow.CreateCell(columnIndex);
IDataFormat format = workbook.CreateDataFormat();
short dateFormat = format.GetFormat("dd/MM/yyyy");
cell.SetCellValue(DateTime.FromOADate(Convert.ToDouble(dbDateValue)));
ICellStyle cellStyle = workbook.CreateCellStyle();
cellStyle.DataFormat = dateFormat;
cell.CellStyle = cellStyle;

这只是我的代码示例(正在编写日期的部分)。这段代码的问题在于,只有部分日期单元格实际上被格式化为日期,对于所有其他人,我仍然可以看到数据库中的值 41883、41913 等,当然我可以选择并应用短日期/ Excel 中的日期格式(但我不希望这样)。

谁能让我知道为什么会出现这种行为(格式化仅适用于部分单元格)......我什至尝试使用 HSSFDataFormat.GetBuiltinFormat("Date") 但在这种情况下没有一个单元格被格式化。

在此处输入图像描述

上图更好地解释了我的问题......当我选择第一列中的第一个单元格时,我看到单元格被格式化为“自定义”......对于所有其他未格式化的值,它是通用的。选择单元格后,我可以毫无问题地将其格式化为 Excel 中的日期。这很奇怪,因为对所有日期单元格执行相同的代码,但只有一些得到正确的格式......

4

1 回答 1

11

无需转换任何东西。您必须创建一个样式并将其应用于您的单元格

        var newDataFormat = workbook.CreateDataFormat();
        var style = workbook.CreateCellStyle();
        style.BorderBottom = BorderStyle.Thin;
        style.BorderLeft = BorderStyle.Thin;
        style.BorderTop = BorderStyle.Thin;
        style.BorderRight = BorderStyle.Thin;
        style.DataFormat = newDataFormat.GetFormat("MM/dd/yyyy HH:mm:ss");

        foreach (var objArticles in tempArticles)
        {
            //Create a new Row
            var row = sheet.CreateRow(rowNumber++);

            //Set the Values for Cells
            row.CreateCell(0).SetCellValue(objArticles.ProjectId);
            row.CreateCell(1).SetCellValue(objArticles.ProjectName);
            row.CreateCell(2).SetCellValue(objArticles.MetricDescription);
            row.CreateCell(3).SetCellValue(objArticles.MetricValue);             
            var cell = row.CreateCell(4);
            cell.SetCellValue(objArticles.BuildDate);
            cell.CellStyle = style; 
            var cell5 = row.CreateCell(5);
            cell5.SetCellValue(objArticles.CreateDate);
            cell5.CellStyle = style;
        }
于 2016-05-09T14:04:28.633 回答