NPOI以相同的方式格式化所有单元格

时间:2016-10-28 15:47:29

标签: c# excel npoi

请查看以下代码段。我只需打开excel文件myfile.xlsx,然后从List<Account>类型的对象中添加行(我的Account对象只有DateAccount和{{ 1}}属性),并存储名为Amount的文件。我希望我写日期的单元格具有日期格式,而我所拥有的单元格则具有数字格式。但是,如果我尝试下面的代码,所有单元格都采用myoutputfile.xlsx格式(日期也是如此)格式化。我已经尝试了一切,有人可以告诉我发生了什么吗?我正在使用NPOI。

#.00

1 个答案:

答案 0 :(得分:5)

这就是为什么它不起作用:默认情况下,您创建的单元格共享对同一CellStyle对象的引用。在循环内部,您将该样式实例上的DataFormat设置为"dd/MM/yyyy",然后将相同的DataFormat设置为"#.00"。最后一个获胜,因此最终所有数字单元格(日期在Excel中被视为数字值)将被格式化为"#.00"

您需要做的是为日期单元格和金额单元格创建单独的单元格样式,在这些样式上设置DataFormats,然后将每个创建的单元格的CellStyle属性设置为适当的样式

试试这样:

    IDataFormat format = wb.CreateDataFormat();

    ICellStyle dateStyle = wb.CreateCellStyle();
    dateStyle.DataFormat = format.GetFormat("dd/MM/yyyy");

    ICellStyle amountStyle = wb.CreateCellStyle();
    amountStyle.DataFormat = format.GetFormat("#.00");

    XSSFSheet sheet = (XSSFSheet)wb.GetSheetAt(0);
    for (int i = 0; i < accountRecs.Count(); ++i)
    {
        var rec = accountRecs[i];
        var row = sheet.CreateRow(i);
        var dateCell = row.CreateCell(3);
        dateCell.SetCellValue(rec.Date);
        dateCell.CellStyle = dateStyle;
        var accountCell = row.CreateCell(4);
        accountCell.SetCellValue(rec.Account);
        var totalValueCell = row.CreateCell(16);
        totalValueCell.SetCellValue(rec.Amount);
        totalValueCell.CellStyle = amountStyle;
    }