2016-10-28 154 views
2

請看下面的代碼片段。我只需打開Excel文件myfile.xlsx,然後添加List<Account>類型的對象(其中我的Account對象只具有Date,AccountAmount屬性),並將名稱爲myoutputfile.xlsx的文件存儲起來。我希望我寫日期的單元格具有日期格式,而我所擁有的單元格具有數字格式。但是,如果我嘗試下面的代碼,所有單元格格式化爲#.00格式(日期也是如此)。我試過了一切,有人可以告訴我發生了什麼事嗎?我正在使用NPOI。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(); 
    } 
+0

可能與http://stackoverflow.com/a/3603750/619252。嘗試使用「dd/MM/yyyy」的內置格式。 –

回答

2

這是爲什麼它不工作:您要創建的細胞通過默認共享一個參照同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; 
    } 
+0

非常感謝Brian。你給了我解釋和答案。它正在工作。有一個好的 – edd

+0

很高興我能幫上忙。 –

相關問題