实现用户自定义Excel模板
2019獨角獸企業重金招聘Python工程師標準>>>
需求背景:?在Excel的實際使用過程中,動態生成報表、導出報表等都是最終用戶常常使用的功能,使用常規的方式針對模板中具體的每個單元格編程,動態的插入數據庫中數據到Excel報表模板的每一個單元格,就可以實現動態報表功能。但是很多時候用戶報表的樣式不是一成不變的,如某公司2015年的產品報表希望在2014年的產品報表基礎上,進行一些報表文本顏色、數據顯示位置等方面的調整,2014年報表模板中“合計”數據原來位于單元格:A50,調整后,2015年報表模板中的“合計”數據單元格位于:A80。由于生成報表的程序代碼是針對報表模板中的每一個具體的單元格編程的,模板中數據項所在單元格的位置發生了改變,就需要同步修改填充數據的程序代碼,原來給A50單元格填充數據的代碼需要修改為操作A80單元格。若是每次Excel模板的調整都需要開發人員重新修改代碼來實現的話,那就是一項永遠不會完成的工作了。
編輯Excel模板:定義名稱
定義名稱:Excel中有一個特別好的工具就是“定義名稱”,顧名思義,就是為一個單元格或者區域定義一個名稱,這樣的話,我們在之后的程序控制時可以很方便的用所定義的名稱進行代碼編寫。
下面以給一個區域定義名稱為例介紹一下Excel定義名稱的操作步驟:
PageOffice操作Excel模板中定義了名稱的單元格和區域
在PageOffice開發平臺下,為了更好的在Excel模板中動態的、靈活的填充數據,專門開發了相應的程序接口,提供了完美解決上述問題的方法——openCellByDefinedName()和openTableByDefinedName()。在代碼實現過程中,通過靈活的運用這兩個方法,即可完美的實現在不修改代碼的情況下,滿足最終用戶自定義修改Excel模板的需求。
一、openCellByDefinedName和openTableByDefinedName的定義說明
這兩個方法用來實現操作用戶自定義Excel模板中的。其中openCellByDefinedName()方法用來打開Excel中具有指定名稱的單元格,并返回 Cell 對象。openTableByDefinedName()方法用來打開具有指定名稱的單元格區域(一般為連續的多個單元格,在PageOffice的概念里稱這塊區域為一個Table),并返回 Table 對象。
Java方法:
openCellByDefinedName(String definedName);openTableByDefinedName(String definedName, int rowCount, int colCount, boolean autoIncrease);ASP.NET方法:
public Cell OpenCellByDefinedName(string DefinedName)public Table OpenTableByDefinedName(string DefinedName,int RowCount,int ColCount,bool AutoIncrease)二、編寫代碼給Excel模板中的表格填充數據
Java部分代碼如下:
Workbook workBook = new Workbook();Sheet sheet = workBook.openSheet("Sheet1");//定義Table對象,參數“report”就是Excel模板中定義的單元格區域的名稱Table table = sheet.openTableByDefinedName("report", 10, 5, false);//給區域中的單元格賦值table.getDataFields().get(0).setValue("輪胎");table.getDataFields().get(1).setValue("100");table.getDataFields().get(2).setValue("120");table.getDataFields().get(3).setValue("500");table.getDataFields().get(4).setValue("120%");table.nextRow(); //如果循環填充數據的話,執行下一行table.close();//定義單元格對象,參數“year”就是Excel模板中定義的單元格的名稱Cell cellYear = sheet.openCellByDefinedName("year");Calendar c=new GregorianCalendar();int year=c.get(Calendar.YEAR);//獲取年份 cellYear.setValue(year + "年");Cell cellName = sheet.openCellByDefinedName("name");cellName.setValue("張三");poCtrl1.setWriter(workBook);……ASP.NET部分代碼如下:
PageOffice.ExcelWriter.Workbook wk = new PageOffice.ExcelWriter.Workbook();PageOffice.ExcelWriter.Sheet sheet = wk.OpenSheet("Sheet1");//定義Table對象,參數“report”就是Excel模板中定義的單元格區域的名稱PageOffice.ExcelWriter.Table table = sheet.OpenTableByDefinedName("report", 10, 5, false);//給區域中的單元格賦值table.DataFields[0].Value = "輪胎";table.DataFields[1].Value = "100";table.DataFields[2].Value = "120";table.DataFields[3].Value = "500";table.DataFields[4].Value = "120%";table.NextRow();//如果循環填充數據的話,執行下一行table.Close();//定義單元格對象,參數“year”就是Excel模板中定義的單元格的名稱PageOffice.ExcelWriter.Cell cellYear = sheet.OpenCellByDefinedName("year");cellYear.Value="2015年";PageOffice.ExcelWriter.Cell cellName = sheet.OpenCellByDefinedName("name");cellName.Value = "張三";PageOfficeCtrl1.SetWriter(wk);// 注意不要忘記此代碼,如果缺少此句代碼,不會賦值成功。……在填充數據的代碼不做任何修改的情況下,打開兩個不同的Excel模板并填充數據的效果:
可以看出在不需修改代碼的情況下,用戶可以根據實際需求自行定義Excel模板。只要Excel模板中有代碼中所涉及到的定義名稱(如“report”、“year”、“name”),那么無論定義了該名稱的單元格區域的位置、大小怎么變化,程序都會自動在變化后的位置填充數據。而如果程序代碼中涉及到的定義名稱在Excel模板中不存在的話,那么對該對象的所有操作將被自動忽略,打開的Excel文檔中也不會再顯示相應的信息。
優勢總結
openCellByDefinedName()和openTableByDefinedName()方法相比于openCell()和openTable()方法的具體優勢在于:
假如在一個Excel模板的同一個工作薄中,使用openTable(rangeAddress)方法打開兩個不同的Table,分別為Table1(數據填充范圍:第4-7行,行數:4行)、Table2(數據填充范圍:第13-16行)。而要動態填充到Table1里的實際數據行數為12行,超過了指定的單元格區域行數,且Table1設置了默認自動擴展單元格行數到實際大小,并且給新的單元格數據行應用 RangeAddress 指定的單元格區域的格式,那么數據填充完后,Table1的實際填充范圍應該是第4-15行;然而由于Table2的起始填充位置是不變的,還是從第13行開始填充,這樣一來,Table2填充的數據就會覆蓋Table1第13-15行的數據,即發生數據重疊覆蓋的現象。
而如果使用openTableByDefinedName()來分別打開這兩個Table,且設置表格也會按實際數據行數自動擴展,當Table1自動擴展后數據行數為12行,填充范圍為第4-15行時,Table2的起始位置將不再是固定不變的,Table2的起始位置由原來的第13行變成了第21行,填充范圍為第21-24行。這樣一來,前后兩個Table的數據就不會發生重疊覆蓋的現象了,填充數據后的效果如圖3所示。
當Excel模板數據內容不變,樣式(數據的位置、大小等)改變時, openCell()和openTable()必須要修改其方法中的參數,即操作的單元格和Table對象,否則顯示或提交的數據時就可能發生錯亂;而openCellByDefinedName()和openTableByDefinedName()方法只要提前在模板中定義好要填充數據的單元格區域的名稱,那么無論數據的位置、大小怎么變化,都不需修改代碼就能將數據準確填充到相應的位置,并準確獲取到提交的數據。
還可以實現用戶可根據實際情況和實際需求自行便捷、簡單地定義Excel模板,而無需每次更改模板時都要聯系程序的開發者更改代碼。PageOffice開發平臺以其更好的靈活性和適應性,充分的滿足了最終用戶對系統功能的要求,極大的減少了程序開發者對系統后期的維護量。
詳細請參考PageOffice開發包中Samples4示例:
二、33、給Excel模板中定義了名稱的一塊區域賦值(專業版、企業版)
轉載于:https://my.oschina.net/u/3850288/blog/2049598
總結
以上是生活随笔為你收集整理的实现用户自定义Excel模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux程序员的proc文件系统
- 下一篇: 汇编中的数组分配和指针