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

请看下面的代码片段。 我只需打开excel文件myfile.xlsx然后从List<Account>types的对象(其中, Account对象只有DateAccountAmount属性)中添加行,然后使用名称myoutputfile.xlsx存储该文件。 我希望我写date的单元格具有date格式,而我所拥有的单元格的数量是数字格式。 但是,如果我尝试下面的代码,所有单元格格式化为#.00格式(date以及)。 我已经尝试了一切,有人可以告诉我发生了什么事吗? 我正在使用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(); } 

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

你需要做的是为你的date单元格和数量单元格创build单独的单元格样式,对这些样式设置DataFormats ,然后将每个创build的单元格的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; }