星期日晚上來寫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年的渣打馬拉松,也許就是需要多一點執著才能叫醒自己。快醒!
參考
安裝Visual Basic for Applications