日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

实现用户自定义Excel模板

發(fā)布時(shí)間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现用户自定义Excel模板 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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定義名稱的操作步驟:

  • 在本地磁盤上打開一個(gè)Excel文件模板,選中需要填充數(shù)據(jù)的單元格區(qū)域,如B4:F13,如下圖所示;
  • 在選中的單元格區(qū)域上,“右擊→定義名稱”(或者點(diǎn)擊Office工具欄上的“公式→定義名稱“),在名稱輸入框中輸入該區(qū)域的名稱,如命名為“report”,點(diǎn)擊“確定”按鈕即可。如下圖所示。
  • 若是需要?jiǎng)h除、修改定義好的單元格區(qū)域,可點(diǎn)擊Office工具欄上的“公式→名稱管理器“來對(duì)名稱進(jìn)行管理,如下圖所示。
  • 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ù)的效果:

  • 打開模板一并填充數(shù)據(jù),實(shí)現(xiàn)的效果如圖所示
  • 打開模板二并填充數(shù)據(jù),實(shí)現(xiàn)的效果如圖10所示:
  • 可以看出在不需修改代碼的情況下,用戶可以根據(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è)表格時(shí),上面的表格數(shù)據(jù)行增長(zhǎng)后與下面的表格數(shù)據(jù)出現(xiàn)互相覆蓋的問題。
    假如在一個(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。