[.NET][C#]NPOI產生Excel報表(二)分頁列印(xlsx)

星期日晚上來寫blog,上一篇先解決了列印時的表頭資訊,這一篇來解決同事其他的需求:依照資料筆數分頁列印、小計等。順邊筆記2的十次方分頁問題

 

依照資料筆數分頁列印、小計筆數

這個需求簡單,執行sheet.SetRowBreak(應該要分頁的列數位置),就行了。

依照我們上一篇的程式碼,只要處理完每一筆資料列後,依序加上小計及分頁的程式碼。

 public void Generate<T>(string TemplatePath, string ReportPath, List<T> entities, int Offset, int PageSize)
 {
     using (FileStream fileStream = new FileStream(TemplatePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
     {
         IWorkbook workbook = WorkbookFactory.Create(fileStream);
         ISheet sheet = workbook.GetSheetAt(0);

         List<ICell> TemplateCells = new List<ICell>();
         for (int i = 0; i < sheet.GetRow(Offset).Cells.Count; i++)
         {
             TemplateCells.Add(sheet.GetRow(Offset).GetCell(i));
         }

         int DataRow = 1;
         PropertyInfo[] properties = typeof(T).GetProperties();
         foreach (var entity in entities)
         {
             sheet.CreateRow(Offset);
             int CellInRow = 0;
             foreach (var property in properties)
             {
                 ICell cell = sheet.GetRow(Offset).CreateCell(CellInRow);
                 cell.CellStyle = TemplateCells[CellInRow].CellStyle;
                 cell.SetCellType(TemplateCells[CellInRow].CellType);
                 if (TemplateCells[CellInRow].CellType.Equals(CellType.Numeric))
                 {
                     cell.SetCellValue(Convert.ToDouble(property.GetValue(entity, null)));
                 }
                 else
                 {
                     cell.SetCellValue(Convert.ToString(property.GetValue(entity, null)));
                 }
                 CellInRow++;
             }
             if (DataRow % 20 == 0)
             {
                 Offset++;
                 sheet.CreateRow(Offset).CreateCell(0).SetCellValue($"小計:{DataRow}/{entities.Count}");
                 sheet.SetRowBreak(Offset);
             }
             DataRow++;
             Offset++;
         }
         using (FileStream fileOut = new FileStream(ReportPath, FileMode.Create))
         {
             workbook.Write(fileOut);
         }
     }
 }

列印結果: 

  每頁20筆資料,共4頁。

第一頁: 

最後一頁: 

 


過多分頁可能的問題

自己在測試大量資料產表分頁時,產完報表檔開啟Excel報表會出現以下錯誤的訊息。

您要我們盡可能嘗試復原嗎?如果您信任此活頁簿的來源,請按一下[是]

用英文來說

We found a problem with some content in 'Pokers.xlsx'.Do you want us to try to recover as much as we can? If you trust the source of this workbook, Click Yes

按下[是],接著出現修復的log

使用終極密碼的二分搜尋法來逼近,發現分頁數超過2的10次方,也就是1024之後,才會出現這個問題

解決問題的方式就是環保救地球,當分頁數超過 >= 1024之後,就不再執行SetRowBreak。

 


小結

環保救地球。

 

瑞士艾格,僧侶,少女峰

最近老闆指派史丹利去救援陌生領域的專案,應該是自己高度不夠,到現在還是想不明白。

今天加班,沒參加連續跑了4年的渣打馬拉松,也許就是需要多一點執著才能叫醒自己。快醒!

 


參考

https://npoi.codeplex.com/

安裝Visual Basic for Applications

https://answers.microsoft.com/en-us/office/forum/office_2007-excel/excel-found-unreadable-content-in-xls-do-you-want/5bc64db0-e4d6-44d8-9409-c6035da6033e

https://social.technet.microsoft.com/Forums/ie/en-US/f217048b-aa7c-4b6e-a346-59e0445543f6/we-found-a-problem-with-some-content-in-filenamexlsxdo-you-want-us-to-try-to-recover-as-much-as?forum=excel