实现用户自定义Excel模板
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
需求背景:?在Excel的實(shí)際使用過程中,動(dòng)態(tài)生成報(bào)表、導(dǎo)出報(bào)表等都是最終用戶常常使用的功能,使用常規(guī)的方式針對(duì)模板中具體的每個(gè)單元格編程,動(dòng)態(tài)的插入數(shù)據(jù)庫(kù)中數(shù)據(jù)到Excel報(bào)表模板的每一個(gè)單元格,就可以實(shí)現(xiàn)動(dòng)態(tài)報(bào)表功能。但是很多時(shí)候用戶報(bào)表的樣式不是一成不變的,如某公司2015年的產(chǎn)品報(bào)表希望在2014年的產(chǎn)品報(bào)表基礎(chǔ)上,進(jìn)行一些報(bào)表文本顏色、數(shù)據(jù)顯示位置等方面的調(diào)整,2014年報(bào)表模板中“合計(jì)”數(shù)據(jù)原來位于單元格:A50,調(diào)整后,2015年報(bào)表模板中的“合計(jì)”數(shù)據(jù)單元格位于:A80。由于生成報(bào)表的程序代碼是針對(duì)報(bào)表模板中的每一個(gè)具體的單元格編程的,模板中數(shù)據(jù)項(xiàng)所在單元格的位置發(fā)生了改變,就需要同步修改填充數(shù)據(jù)的程序代碼,原來給A50單元格填充數(shù)據(jù)的代碼需要修改為操作A80單元格。若是每次Excel模板的調(diào)整都需要開發(fā)人員重新修改代碼來實(shí)現(xiàn)的話,那就是一項(xiàng)永遠(yuǎn)不會(huì)完成的工作了。
編輯Excel模板:定義名稱
定義名稱:Excel中有一個(gè)特別好的工具就是“定義名稱”,顧名思義,就是為一個(gè)單元格或者區(qū)域定義一個(gè)名稱,這樣的話,我們?cè)谥蟮某绦蚩刂茣r(shí)可以很方便的用所定義的名稱進(jìn)行代碼編寫。
下面以給一個(gè)區(qū)域定義名稱為例介紹一下Excel定義名稱的操作步驟:
PageOffice操作Excel模板中定義了名稱的單元格和區(qū)域
在PageOffice開發(fā)平臺(tái)下,為了更好的在Excel模板中動(dòng)態(tài)的、靈活的填充數(shù)據(jù),專門開發(fā)了相應(yīng)的程序接口,提供了完美解決上述問題的方法——openCellByDefinedName()和openTableByDefinedName()。在代碼實(shí)現(xiàn)過程中,通過靈活的運(yùn)用這兩個(gè)方法,即可完美的實(shí)現(xiàn)在不修改代碼的情況下,滿足最終用戶自定義修改Excel模板的需求。
一、openCellByDefinedName和openTableByDefinedName的定義說明
這兩個(gè)方法用來實(shí)現(xiàn)操作用戶自定義Excel模板中的。其中openCellByDefinedName()方法用來打開Excel中具有指定名稱的單元格,并返回 Cell 對(duì)象。openTableByDefinedName()方法用來打開具有指定名稱的單元格區(qū)域(一般為連續(xù)的多個(gè)單元格,在PageOffice的概念里稱這塊區(qū)域?yàn)橐粋€(gè)Table),并返回 Table 對(duì)象。
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模板中的表格填充數(shù)據(jù)
Java部分代碼如下:
Workbook workBook = new Workbook();Sheet sheet = workBook.openSheet("Sheet1");//定義Table對(duì)象,參數(shù)“report”就是Excel模板中定義的單元格區(qū)域的名稱Table table = sheet.openTableByDefinedName("report", 10, 5, false);//給區(qū)域中的單元格賦值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(); //如果循環(huán)填充數(shù)據(jù)的話,執(zhí)行下一行table.close();//定義單元格對(duì)象,參數(shù)“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對(duì)象,參數(shù)“report”就是Excel模板中定義的單元格區(qū)域的名稱PageOffice.ExcelWriter.Table table = sheet.OpenTableByDefinedName("report", 10, 5, false);//給區(qū)域中的單元格賦值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();//如果循環(huán)填充數(shù)據(jù)的話,執(zhí)行下一行table.Close();//定義單元格對(duì)象,參數(shù)“year”就是Excel模板中定義的單元格的名稱PageOffice.ExcelWriter.Cell cellYear = sheet.OpenCellByDefinedName("year");cellYear.Value="2015年";PageOffice.ExcelWriter.Cell cellName = sheet.OpenCellByDefinedName("name");cellName.Value = "張三";PageOfficeCtrl1.SetWriter(wk);// 注意不要忘記此代碼,如果缺少此句代碼,不會(huì)賦值成功。……在填充數(shù)據(jù)的代碼不做任何修改的情況下,打開兩個(gè)不同的Excel模板并填充數(shù)據(jù)的效果:
可以看出在不需修改代碼的情況下,用戶可以根據(jù)實(shí)際需求自行定義Excel模板。只要Excel模板中有代碼中所涉及到的定義名稱(如“report”、“year”、“name”),那么無(wú)論定義了該名稱的單元格區(qū)域的位置、大小怎么變化,程序都會(huì)自動(dòng)在變化后的位置填充數(shù)據(jù)。而如果程序代碼中涉及到的定義名稱在Excel模板中不存在的話,那么對(duì)該對(duì)象的所有操作將被自動(dòng)忽略,打開的Excel文檔中也不會(huì)再顯示相應(yīng)的信息。
優(yōu)勢(shì)總結(jié)
openCellByDefinedName()和openTableByDefinedName()方法相比于openCell()和openTable()方法的具體優(yōu)勢(shì)在于:
假如在一個(gè)Excel模板的同一個(gè)工作薄中,使用openTable(rangeAddress)方法打開兩個(gè)不同的Table,分別為Table1(數(shù)據(jù)填充范圍:第4-7行,行數(shù):4行)、Table2(數(shù)據(jù)填充范圍:第13-16行)。而要?jiǎng)討B(tài)填充到Table1里的實(shí)際數(shù)據(jù)行數(shù)為12行,超過了指定的單元格區(qū)域行數(shù),且Table1設(shè)置了默認(rèn)自動(dòng)擴(kuò)展單元格行數(shù)到實(shí)際大小,并且給新的單元格數(shù)據(jù)行應(yīng)用 RangeAddress 指定的單元格區(qū)域的格式,那么數(shù)據(jù)填充完后,Table1的實(shí)際填充范圍應(yīng)該是第4-15行;然而由于Table2的起始填充位置是不變的,還是從第13行開始填充,這樣一來,Table2填充的數(shù)據(jù)就會(huì)覆蓋Table1第13-15行的數(shù)據(jù),即發(fā)生數(shù)據(jù)重疊覆蓋的現(xiàn)象。
而如果使用openTableByDefinedName()來分別打開這兩個(gè)Table,且設(shè)置表格也會(huì)按實(shí)際數(shù)據(jù)行數(shù)自動(dòng)擴(kuò)展,當(dāng)Table1自動(dòng)擴(kuò)展后數(shù)據(jù)行數(shù)為12行,填充范圍為第4-15行時(shí),Table2的起始位置將不再是固定不變的,Table2的起始位置由原來的第13行變成了第21行,填充范圍為第21-24行。這樣一來,前后兩個(gè)Table的數(shù)據(jù)就不會(huì)發(fā)生重疊覆蓋的現(xiàn)象了,填充數(shù)據(jù)后的效果如圖3所示。
當(dāng)Excel模板數(shù)據(jù)內(nèi)容不變,樣式(數(shù)據(jù)的位置、大小等)改變時(shí), openCell()和openTable()必須要修改其方法中的參數(shù),即操作的單元格和Table對(duì)象,否則顯示或提交的數(shù)據(jù)時(shí)就可能發(fā)生錯(cuò)亂;而openCellByDefinedName()和openTableByDefinedName()方法只要提前在模板中定義好要填充數(shù)據(jù)的單元格區(qū)域的名稱,那么無(wú)論數(shù)據(jù)的位置、大小怎么變化,都不需修改代碼就能將數(shù)據(jù)準(zhǔn)確填充到相應(yīng)的位置,并準(zhǔn)確獲取到提交的數(shù)據(jù)。
還可以實(shí)現(xiàn)用戶可根據(jù)實(shí)際情況和實(shí)際需求自行便捷、簡(jiǎn)單地定義Excel模板,而無(wú)需每次更改模板時(shí)都要聯(lián)系程序的開發(fā)者更改代碼。PageOffice開發(fā)平臺(tái)以其更好的靈活性和適應(yīng)性,充分的滿足了最終用戶對(duì)系統(tǒng)功能的要求,極大的減少了程序開發(fā)者對(duì)系統(tǒng)后期的維護(hù)量。
詳細(xì)請(qǐng)參考PageOffice開發(fā)包中Samples4示例:
二、33、給Excel模板中定義了名稱的一塊區(qū)域賦值(專業(yè)版、企業(yè)版)
轉(zhuǎn)載于:https://my.oschina.net/u/3850288/blog/2049598
總結(jié)
以上是生活随笔為你收集整理的实现用户自定义Excel模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux程序员的proc文件系统
- 下一篇: 汇编中的数组分配和指针