我目前正在使用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中的日期,没有任何问题。这很奇怪,因为对所有日期单元执行相同的代码,但只有一些得到正确的格式...
答案 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;
}