1. 程式人生 > >多個潤乾報表,匯出到一個excel中的不同sheet頁中

多個潤乾報表,匯出到一個excel中的不同sheet頁中

潤乾報表作為報表編輯工具使用起來十分的簡單方便,只需要簡單的屬性設定便可以實現匯出、列印等功能(具體參見潤乾開發應用文件),令人很鬱悶的是潤乾的匯出只是單表的匯出。

最近就有這麼一個需求:有很多.raq報表檔案,在一個頁面中列出所有的檔案的名稱,通過複選框選中下載,要求匯出到一個excel中,分不同的sheet頁展示(不知各位是否明白此需求,我的表達能力有限請見諒)。

鬱悶了我好一陣子,問同事都沒有這麼做過!

閒著沒事翻看潤乾jar包,發現了一些端倪。在潤乾安裝目錄裡有潤乾API,閒著沒事可以翻閱。

API中有ExcelReport類可以幫助我們實現上面的需求。

話不多說看程式碼:

Java程式碼

複製程式碼 收藏程式碼

  1. package cn.com.victorysoft.wellinfo.util;
  2. import java.io.FileOutputStream;
  3. import java.sql.Connection;
  4. import java.util.Map;
  5. import javax.sql.DataSource;
  6. import org.springframework.jdbc.core.JdbcTemplate;
  7. import com.runqian.base4.util.DBTypes;
  8. import com.runqian.report4.usermodel.Context;
  9. import com.runqian.report4.usermodel.DataSourceConfig;
  10. import com.runqian.report4.usermodel.Engine;
  11. import com.runqian.report4.usermodel.IReport;
  12. import com.runqian.report4.util.ReportUtils;
  13. import com.runqian.report4.view.excel.ExcelReport;
  14. public class ExportReport {
  15. private String reportPath = "";
  16. private String excelPath="";
  17. private String excelFileName;
  18. private DataSource dataSource;
  19. private String reportDataSource;
  20. private int dbType = DBTypes.ORACLE;
  21. private boolean needTranContent = true;
  22. private String dbCharset = "GBK";
  23. private String clientCharset = "GBK";
  24. private boolean needTranSentence = false;
  25. public void saveExcel(Map param, Map macro, String[] reportName, String[] sheetName)
  26. throws Exception{
  27. int flag = 0;
  28. ExcelReport erp=null;
  29. JdbcTemplate JT = new JdbcTemplate();
  30. JT.setDataSource(this.dataSource);
  31. Connection con = JT.getDataSource().getConnection();
  32. DataSourceConfig dsoc = new DataSourceConfig(this.dbType, this.needTranContent,
  33. this.dbCharset, this.clientCharset, this.needTranSentence);
  34. //判斷excelFileName是不是為“”或null,以及是不是excel型別
  35. if(!"".equals(this.null2blank(this.excelFileName)) && this.isExcelFile(this.excelFileName)){
  36. FileOutputStream fos = new FileOutputStream((this.null2blank(this.excelPath)+this.excelFileName).trim());
  37. try {
  38. erp = new ExcelReport();
  39. } catch (Throwable e) {
  40. e.printStackTrace();
  41. }
  42. if(reportName != null && reportName.length>0){
  43. //初始化陣列
  44. IReport[] rd = new IReport[reportName.length];
  45. Context[] context = new Context[reportName.length];
  46. Engine engine[] = new Engine[reportName.length];
  47. IReport iReport[] = new IReport[reportName.length];
  48. //如果sheetName為空或者長度為零,那麼設定預設選項
  49. if (sheetName == null || sheetName.length<=0) {
  50. sheetName = new String[reportName.length];
  51. for (int i = 0; i < reportName.length; i++) {
  52. sheetName[i] = "report_"+String.valueOf(i);
  53. }
  54. }
  55. for (int i = 0; i < reportName.length; i++) {
  56. if(!"".equals(this.null2blank(reportName[i]))){
  57. //讀取報表模板,把*.raq檔案讀入記憶體,並例項化ReportDefine
  58. rd[i] = ReportUtils.read((this.null2blank(this.reportPath)+reportName[i]).trim());
  59. //新建上下文物件,在上下文物件中設定資料來源
  60. context[i] = new Context();
  61. context[i].setDefDataSourceName(this.reportDataSource);
  62. context[i].setConnection(this.reportDataSource,con);
  63. context[i].setDataSourceConfig(this.reportDataSource, dsoc);
  64. //設定引數和巨集
  65. if(param != null && param.size()>0){
  66. context[i].setParamMap(param);
  67. }
  68. if(macro != null && macro.size()>0){
  69. Object[] array = macro.keySet().toArray();
  70. for (int j = 0; j < array.length; j++) {
  71. context[i].setMacroValue(array[j].toString(), macro.get(array[j]).toString());
  72. }
  73. }
  74. //運算報表,並在頁面上輸出報表
  75. engine[i] = new Engine(rd[i],context[i]);
  76. iReport[i] = engine[i].calc();
  77. //構建每個sheet頁
  78. erp.addPage(iReport[i],sheetName[i]);
  79. flag ++;
  80. }
  81. }
  82. }else {
  83. throw new Exception("reportName為“”或null");
  84. }
  85. //匯出Excel
  86. if (flag != 0) {
  87. erp.out(fos);
  88. }
  89. fos.flush();
  90. fos.close();
  91. }else {
  92. throw new Exception("excelFileName為“”或null或不是excel型別");
  93. }
  94. }
  95. private String null2blank(String variable) {
  96. if (variable == null)
  97. variable = "";
  98. return variable;
  99. }
  100. private boolean isExcelFile(String excelName){
  101. boolean is = false;
  102. if(excelName.endsWith(".xls") || excelName.endsWith(".xlsx")){
  103. is = true;
  104. }
  105. return is;
  106. }
  107. public String getReportPath() {
  108. return reportPath;
  109. }
  110. public void setReportPath(String reportPath) {
  111. this.reportPath = reportPath;
  112. }
  113. public String getExcelPath() {
  114. return excelPath;
  115. }
  116. public void setExcelPath(String excelPath) {
  117. this.excelPath = excelPath;
  118. }
  119. public String getExcelFileName() {
  120. return excelFileName;
  121. }
  122. public void setExcelFileName(String excelFileName) {
  123. this.excelFileName = excelFileName;
  124. }
  125. public DataSource getDataSource() {
  126. return dataSource;
  127. }
  128. public void setDataSource(DataSource dataSource) {
  129. this.dataSource = dataSource;
  130. }
  131. public String getReportDataSource() {
  132. return reportDataSource;
  133. }
  134. public void setReportDataSource(String reportDataSource) {
  135. this.reportDataSource = reportDataSource;
  136. }
  137. public int getDbType() {
  138. return dbType;
  139. }
  140. public void setDbType(int dbType) {
  141. this.dbType = dbType;
  142. }
  143. public boolean isNeedTranContent() {
  144. return needTranContent;
  145. }
  146. public void setNeedTranContent(boolean needTranContent) {
  147. this.needTranContent = needTranContent;
  148. }
  149. public String getDbCharset() {
  150. return dbCharset;
  151. }
  152. public void setDbCharset(String dbCharset) {
  153. this.dbCharset = dbCharset;
  154. }
  155. public String getClientCharset() {
  156. return clientCharset;
  157. }
  158. public void setClientCharset(String clientCharset) {
  159. this.clientCharset = clientCharset;
  160. }
  161. public boolean isNeedTranSentence() {
  162. return needTranSentence;
  163. }
  164. public void setNeedTranSentence(boolean needTranSentence) {
  165. this.needTranSentence = needTranSentence;
  166. }
  167. }

以上是關鍵程式碼,完整程式碼示例請參見附加。程式碼排版有些亂,請童鞋們見諒,如果上面的程式碼不想看,就下載附件吧,附加註釋很詳細

相關推薦

報表匯出一個excel不同sheet

潤乾報表作為報表編輯工具使用起來十分的簡單方便,只需要簡單的屬性設定便可以實現匯出、列印等功能(具體參見潤乾開發應用文件),令人很鬱悶的是潤乾的匯出只是單表的匯出。 最近就有這麼一個需求:有很多.raq報表檔案,在一個頁面中列出所有的檔案的名稱,通過複選框選中下載,要求匯出

在node中介軟體(微服務)架構一個node去部署專案比較好還是一個專案對應一個node比較好?

第一種: 一個專案對應一個node服務; 優點:前端跟node也是可以獨立開發,降低耦合,也可單獨部署; 缺點:一個專案對應一個node,專案多的話,維護不方便; 第二種:一個node下,部署多個專案,可以以這個node作為底盤,在點選進入專案時,讓其載入該專案

git本地倉庫關聯remote,怎麽用本地一個分支向不同remote不同分支推送代碼

mage pos 後繼 pre bsp 一次 nbsp 技術 text 我想這個問題,是大家關註的問題,這個問題,我非常關註。 背景:在公司開發項目,我們一般都要把項目推送到公司領導創建的一個遠程倉庫裏邊去,但是我們同時也有自己的小倉庫,這樣的話,如何方便的將我們的代

你需要實現一個高效的緩存它允許用戶讀但只允許一個用戶寫

讀寫鎖思路:java.util.concurrent.locks包下面ReadWriteLock接口,該接口下面的實現類ReentrantReadWriteLock維護了兩個鎖讀鎖和解鎖,可用該類實現這個功能,很簡單import java.util.Date; import java.util.concurr

報表報表組的展現--tab形式展現報表

業務系統中,很多報表都是沿用之前 EXCEL 的報表樣式,原來以 sheet 格式顯示的表,客戶在 web 端展現的時候也希望也有同樣的格式,潤乾在實現這種效果和 EXCEL 一樣簡單靈活,輕鬆將資料報表以多個 TAB 頁的形式展現在頁面中,達到了一同展現,同時進行查詢、列印、匯出 EXCEL 結果

一個頁面有script標籤時執行順序

JavaScript直譯器在執行指令碼時,是按塊執行的。通俗地說,就是瀏覽器在解析HTML文件流時,如果遇到一個script標籤,則JavaScript直譯器會等到這個程式碼塊都載入完成後,先對程式碼塊進行預編譯,然後再執行。執行完畢後,瀏覽器會繼續解析下面的HTML文件流,同時JavaSc

Java:假設車庫有3車位(可以通過boolean[]陣列來表示車庫)可以停車一個程式模擬使用者開車離開停車入庫的效果。注意:車位有車時不能停車。

假設車庫有3個車位(可以通過boolean[]陣列來表示車庫)可以停車,寫一個程式模擬多個使用者開車離開,停車入庫的效果。注意:車位有車時不能停車。 1)使用阻塞佇列來實現(BlockingQueue<T>) Producer類 package com.多執行緒停車問

執行緒執行時如果一個邏輯需要等若干執行緒執行完成後再執行怎麼實現?

實際開發過程中,尤其是大型的業務系統中或批量處理系統中,我們通常會用到多執行緒來進行任務拆分,來提高系統的處理能力。當對業務不斷拆分時,多執行緒各自任務之間也形成了錯綜複雜的關係。 我們常常遇到這樣的情況,業務模組A 拆分成了 A1 、A2.....An個多執行緒,來提高處理速度,可是 Ak(1<k&

38_javaWeb介面排序欄位使用者隨機選一個

0.可排序欄位:id,age,income 1.查詢介面中,有一個orderBy引數 2.如果使用者選擇的age,那麼就把orderBy引數的值設定成age 3.java中,虛擬碼如下(因為第4步中,我們會用$符號取值,在這裡防止sql注入): if(or

報表維分析功能

可直接閱讀原文:http://c.raqsoft.com.cn/article/1535678317741?r=alice   分析控制元件功能 拖拽欄位 首先從分析控制元件本身的功能入手——開啟分析頁面第一件事是做什麼呢?對啦,當然是要展示報表了~脫離敲打複雜的查詢語句,

androidstudion 一個專案打包報名的APK可以在同一個裝置上安裝

1.修改app的build.gradle檔案 假設我們同一套程式碼編譯2個app:demo1和demo2 android { ... productFlavors { // demo1 demo1 {

Tomcat配置Service同名的應用執行在一個tomcat下

網站專案中有時候會碰到,每個網站一個網站後臺程式,偏偏因為某種原因,這後臺程式的名稱還是一樣的,比如都叫 app.war,這樣如果有2個或以上網站需要用各自的app.war,那麼就需要安裝多個tomcat,資源浪費比較大。也不好管理。有沒有一種可能,將這幾個app.war放到

視頻怎麽合成一個什麽合並視頻軟件好用

size 工具 img pro watermark cto alt 多個 到你 視頻的剪輯和合成是使用較多的一個功能,平時自己錄制視頻可能都會分享到社交平臺上,然而在分享之前,我們必然會做很多的處理,比如濾鏡,美顏,分割,合成等等的操作,前兩者很簡單,那怎麽將錄制的幾個視頻

一個總店與分店的情況要求每天分店將業務資料上傳到總店

1.  伸縮性 伸縮性是衡量應用在同一時間內能夠處理多少使用者的尺度。也是反映應用程式能否滿足重要應用的一個指標。 在你的應用程式中到底可以容納多少使用者,每個使用者每隔多久向伺服器提交一次請求,你的使用者所處的位置,如區域網還是interner中。這些問題在設計應用的時候,你需要

Excel VBA 迴圈讀取一個目錄下面檔案的內容放到另外一個檔案

迴圈讀取一個目錄下面多個檔案的內容,放到另外一個檔案中 Public Sub getInputInfo() On Error GoTo errl 'OUT対象ファイル開く Dim wbOut As Workbook Applicati

報表v4-展現報表同時後臺匯出excel

有些客戶提出需求希望在展現報表的時候,報表在後臺被自動匯出成excel到指定的路徑,而不用手動去點選匯出excel的按鈕。這個需求可以用潤乾的API來實現。 實現後臺自動匯出excel的思路為:用API讀入需要匯出的raq檔案,然後使用API計算報表,得到計算好的IRepo

報表頁面超過255列匯出excel

 最近接觸到一些客戶的需求,客戶想在頁面展現的時候不分頁,然後在匯出excel的時候分頁,而客戶的報表列數很多,超過了excel的255列的限制。這樣如果不做任何處理,直接在頁面上點選匯出excel的按鈕,就會彈出對話方塊提示excel不支援超過255列,也就無法正常匯

報表隔行異色N行異色分層異色

隔行異色是潤乾報表的一大特色,它使得報表的可讀性更強,頁面也更加美觀。利用背景色單元格內的IF函式及row()函式獲取當前行號,可以讓相鄰行的單元格異色。         其實還有一種拓展性更強的方式:case()函式,case(row()%2,list(0),rgb(25

MYSQL建立一個 “將一個字串以某個分隔符分隔得到值” 的函式併為值加上序號

1:首先建立一個自定義函式實現分隔的功能:思路: (1、獲取分隔符在源字串中第一次出現的位置,把獲取的位置之前的子字串賦值給表的一列 (2、把第一步獲取的位置之後的子字串賦值為新的源字串 (3、再獲取分隔符在第二步得到的新的源字串中的位置,並把獲取的位置之前的子字串賦值給表

解決報表匯出Excel後0丟失的問題

需求背景 今天我們來看一個比較有價值的需求,這個需求中提到的一系列問題我們可能也會遇到並感到難以解決。好,閒話少敘,看一下具體需求: 1、  報表中的0.XXX匯出Excel後0丟失,變成了.XXX,如0.5變成.5; 2、  報表資料集中資料有存在空和0的資料,在報表顯示的時候要求空值不顯示,0值顯示0,