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

本文关键字:格式化 单元格 方式 NPOI | 更新日期: 2023-09-27 18:15:35

请看下面的代码片段。我只是打开excel文件myfile.xlsx,我从类型List<Account>的对象添加行(我的Account对象只有Date, AccountAmount属性),并以名称myoutputfile.xlsx存储文件。我希望写日期的单元格具有日期格式,而写金额的单元格具有数字格式。但是,如果我尝试下面的代码,所有单元格都被格式化为#.00格式(日期也是如此)。我什么都试过了,谁能告诉我是怎么回事?我正在使用NPOI。

    XSSFWorkbook wb;
    var fileName = "C:/tmp/myfile.xlsx";
    var outputFileName = "C:/tmp/myoutputfile.xlsx";
    using (var file = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
    {
        wb = new XSSFWorkbook(file);
    }
    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.DataFormat = wb.CreateDataFormat().GetFormat("dd/MM/yyyy");
        var accountCell = row.CreateCell(4);
        accountCell.SetCellValue(rec.Account);
        var totalValueCell = row.CreateCell(16);
        totalValueCell.SetCellValue(rec.Amount);
        totalValueCell.CellStyle.DataFormat = wb.CreateDataFormat().GetFormat("#.00");
    }
    using (var file = new FileStream(outputFileName, FileMode.Create, FileAccess.Write))
    {
        wb.Write(file);
        file.Close();
    }

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

这就是它不工作的原因:您正在创建的单元格默认情况下共享对相同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;
    }