使用NPOI向Excel文件写入日期的问题

时间:2014-10-23 13:30:33

标签: c# asp.net-mvc excel npoi hssf

我目前正在使用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")但没有在这种情况下格式化了格式。

enter image description here

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

1 个答案:

答案 0 :(得分:6)

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

        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;
        }