報表如何批次匯出成 excel 檔案
需求說明
報表展現後可以透過工具欄中的匯出按鈕將當前展現的報表匯出成 excel 檔案,但是在實際使用中通常會要求報表不需要展現,直接透過一些操作將報表匯出成 excel 檔案,並且往往會要求批次匯出成 excel 檔案,下面透過幾個示例介紹下報表不展現,如何批次生成 excel 檔案。
實現這種需求一般要用到 api 方式,批次生成 excel 檔案,按照方式上來分大體上可以分為三類:
一:單表匯出單 excel 多 sheet
二:多表匯出單 excel 多 sheet
三:多表匯出多 excel 檔案
單表多 sheet
此種方式通常是報表格式固定,然後根據某個引數對資料過濾,匯出 excel 時需要匯出多個引數的資料,並且每個引數的資料放到同一個 excel 的不同 sheet 裡,比如本例中按照地區統計訂單資訊,要求匯出時每個地區資料匯出到一個 sheet 中,地區名稱做為 sheet 名,下面看下這種做法:
報表設計介面不必多說,按照需求設計就行,如下圖:
報表中增加一個引數:area,用於接收地區引數,然後在資料集中透過這個引數過濾資料就行。
Api 中用到 jsp 程式碼如下:
<%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="com.raqsoft.report.model.*"%> <%@ page import="com.raqsoft.report.usermodel.*"%> <%@ page import="com.raqsoft.report.view.*"%> <%@ page import="com.raqsoft.report.util.*"%> <%@ page import="com.raqsoft.report.view.excel.ExcelReport"%> <% String report = request.getParameter( "report" );//獲取報表名稱 if(report==null) report="訂單.rpx";//如果url上報表名為空,則取訂單表 String fileName=report.substring(0,report.length()-4);//讀取檔名,用於設定excel名稱 String reportName = request.getRealPath("WEB-INF\\reportFiles\\"+report);// String exportPath=request.getRealPath("/export");//在應用根目錄下建export目錄,放置匯出檔案 ReportDefine rd = (ReportDefine)ReportUtils.read(reportName);//讀取報表 String areas="華北,東北,西北,華南,西南";//此例按照地區迴圈,實際中可以接收其他引數,也可以從資料庫中獲取資料 String[] area=areas.split(","); ExcelReport er=new ExcelReport(); for(int i=0;i<area.length;i++){//按照地區做迴圈 Context cxt = new Context(); cxt.setParamValue("area",area[i]);//area是報表中定義引數,此處設定引數值 Engine engine = new Engine(rd, cxt); //構造報表引擎 IReport iReport = engine.calc(); //運算報表 er.export(area[i],iReport);//將報表結果設定到excel sheet裡 } er.saveTo(exportPath+"/"+fileName+".xls");//生成excel %>
這樣,就會在應用根目錄的 export 目錄下生成對應的 excel 檔案,生成 excel 檔案如下:
多表多 sheet
此種情況應用於匯出的 excel 由多個報表組成,然後每個報表匯出到 excel 中不同 sheet 中,並且有可能每個報表的引數不同(如果引數相同,那麼和示例一類似,只是按報表名稱迴圈就行),下面看下具體實現過程:
由於不同報表引數可能會不同,所以在 api 中解析每個報表以及對應引數難度會比較大,此例要求透過 url 訪問報表時,按照特定格式訪問,比如:
,比如: 這種方式,現在在高版本的 tomcat 中,會有一些特殊符號的限定,使用時可以將 {} 轉換成對應的 urlencode 方式,{為 %7B,}為 %7B,如果有其他值的話,做對應轉換就行,url 設定完成後,接下來就看下如何解析這個 url,並且批次生成 excel,程式碼如下:
<%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="com.raqsoft.report.model.*"%> <%@ page import="com.raqsoft.report.usermodel.*"%> <%@ page import="com.raqsoft.report.view.*"%> <%@ page import="com.raqsoft.report.util.*"%> <%@ page import="com.raqsoft.report.view.excel.ExcelReport"%> <% //此JSP引數格式為:report={無引數報表名1}{無引數報表名2}{報表1(引數1=value1;引數2=value2;...)}{報表2(引數1=value1;引數2=value2;...)} request.setCharacterEncoding( "UTF-8" ); String report = request.getParameter( "report" ); if( report == null || report.trim().length() == 0 ) throw new Exception( "請輸入報表檔名及引數串report={無引數報表名}{報表1(引數1=value1;引數2=value2;...)}{報表2(引數1=value1;引數2=value2;...)}..." ); String exportPath=request.getRealPath("/export");//在應用根目錄下建export目錄,放置匯出檔案 String report1=report.replace("}","");//去掉串中的} String report2=report1.substring(1,report1.length());//去掉串中的最左側的{ String[] a=report2.split("\\{");//此時串中多個報表之間用{分隔,所以此處按照該符號split生成陣列 ExcelReport er=new ExcelReport(); for(int i=0;i<a.length;i++){//按陣列進行迴圈,也就是按報表迴圈 if(a[i].lastIndexOf("(")<=0)//判斷分割後的子串中是否包含(,如包含,代表有引數,不包含,則沒有引數 { String reportPath = request.getRealPath("WEB-INF\\reportFiles\\"+a[i]);//獲取報表路徑 String sheetName=a[i].substring(0,a[i].length()-4);//獲取sheet名稱 ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);//讀取報表 Context cxt = new Context(); Engine engine = new Engine(rd, cxt); //構造報表引擎 IReport iReport = engine.calc(); //計算報表 er.export(sheetName,iReport);//將報表結果放入sheet } else{ System.out.println("報表有引數,報表名為="+a[i].split("\\(")[0]);//如果有引數,則按(字元split,左側為報表名 String reportPath = request.getRealPath("WEB-INF\\reportFiles\\"+a[i].split("\\(")[0]); String sheetName=a[i].split("\\(")[0].substring(0,a[i].split("\\(")[0].length()-4); ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath); Context cxt = new Context(); String[] cs=a[i].split("\\(")[1].replace(")","").split(";");//右側為引數串,並且去掉引數串的),多個引數用;隔開,所以此處按照;split for(int j=0;j<cs.length;j++){//按引數迴圈 cxt.setParamValue(cs[j].split("=")[0],cs[j].split("=")[1]);//設定引數 } Engine engine = new Engine(rd, cxt); //構造報表引擎 IReport iReport = engine.calc(); er.export(sheetName,iReport); } } er.saveTo(exportPath+"/test.xls");//生成excel %>
多表多 excel
此種方式和示例二類似,在實際使用中匯出 excel 時要求每個報表匯出成不同的 excel 檔案,但是後續可能會涉及到下載問題,所以此種方式一般是要建立個臨時目錄,然後將多個 excel 放到臨時目錄內,可以進行打包下載。具體程式碼如下:
<%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="com.raqsoft.report.model.*"%> <%@ page import="com.raqsoft.report.usermodel.*"%> <%@ page import="com.raqsoft.report.view.*"%> <%@ page import="com.raqsoft.report.util.*"%> <%@ page import="com.raqsoft.report.view.excel.ExcelReport"%> <% //此JSP引數格式為:report={無引數報表名1}{無引數報表名2}{報表1(引數1=value1;引數2=value2;...)}{報表2(引數1=value1;引數2=value2;...)} request.setCharacterEncoding( "UTF-8" ); String report = request.getParameter( "report" ); if( report == null || report.trim().length() == 0 ) throw new Exception( "請輸入報表檔名及引數串report={無引數報表名}{報表1(引數1=value1;引數2=value2;...)}{報表2(引數1=value1;引數2=value2;...)}..." ); String exportPath=request.getRealPath("/export");//在應用根目錄下建export目錄,放置匯出檔案 String fileName=Double.toString(Math.random()*100000000).toString().substring(0,6); String excelPath=exportPath+"\\"+fileName; java.io.File file = new java.io.File(excelPath); if(!file.exists()) { file.mkdirs(); } else { } String report1=report.replace("}","");//去掉串中的} String report2=report1.substring(1,report1.length());//去掉串中的最左側的{ String[] a=report2.split("\\{");//此時串中多個報表之間用{分隔,所以此處按照該符號split生成陣列 ExcelReport er=new ExcelReport(); for(int i=0;i<a.length;i++){//按陣列進行迴圈,也就是按報表迴圈 if(a[i].lastIndexOf("(")<=0)//判斷分割後的子串中是否包含(,如包含,代表有引數,不包含,則沒有引數 { String reportPath = request.getRealPath("WEB-INF\\reportFiles\\"+a[i]);//獲取報表路徑 String sheetName=a[i].substring(0,a[i].length()-4);//獲取sheet名稱 ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath);//讀取報表 Context cxt = new Context(); Engine engine = new Engine(rd, cxt); //構造報表引擎 IReport iReport = engine.calc(); //計算報表 ReportUtils.exportToExcel2007(excelPath+"/"+sheetName+".xlsx",iReport,false); er.export(sheetName,iReport);//將報表結果放入sheet } else{ System.out.println("報表有引數,報表名為="+a[i].split("\\(")[0]);//如果有引數,則按(字元split,左側為報表名 String reportPath = request.getRealPath("WEB-INF\\reportFiles\\"+a[i].split("\\(")[0]); String sheetName=a[i].split("\\(")[0].substring(0,a[i].split("\\(")[0].length()-4); ReportDefine rd = (ReportDefine)ReportUtils.read(reportPath); Context cxt = new Context(); String [] cs=a[i].split("\\(")[1].replace(")","").split(";");//右側為引數串,並且去掉引數串的),多個引數用;隔開,所以此處按照;split for(int j=0;j<cs.length;j++){//按引數迴圈 cxt.setParamValue(cs[j].split("=")[0],cs[j].split("=")[1]);//設定引數 } Engine engine = new Engine(rd, cxt); //構造報表引擎 IReport iReport = engine.calc(); ReportUtils.exportToExcel2007(excelPath+"/"+sheetName+".xlsx",iReport,false); } } er.saveTo(exportPath+"/test.xls");//生成excel %>
打包下載
檔案生成到對應目錄下後,可以自己單獨做個連結指向這個 excel 檔案下載,也可以直接生成 excel 檔案後直接進行下載,在對應 jsp 檔案中增加如下程式碼:
response.setContentType("application/msword"); response.setHeader("Content-disposition","attachment; filename="+java.net.URLEncoder.encode(fileName+".xls", "UTF-8")); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream( exportPath+"/"+fileName+".xls")); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff,0,bytesRead); } } catch(final IOException e) { System.out.println ( "出現IOException." + e ); } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } System.out.println ( "下載完成----------------" ); File file = new File(exportPath+"/"+fileName+".xls"); if (file.exists()) file.delete();//刪除檔案 實際應用中可能會需要將檔案大成zip包方式,比如示例三,這個直接百度下java程式打zip包,然後下載zip包就行。
總結
本文中介紹瞭如何透過 api 將報表批次匯出成 excel 的方法,實際中也有可能生成 pdf 或者 txt 等,思路是一樣到,到時候換用不同的 api 就行。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2666947/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用JavaScript匯入和匯出Excel檔案JavaScriptExcel
- SAP UI5 表格資料如何匯出成 Excel 檔案(Table Export As Excel)UIExcelExport
- java匯出Excel檔案JavaExcel
- 將 SAP ABAP 內表內容本地匯出成 Excel 檔案試讀版Excel
- EasyExcel完成excel檔案的匯入匯出Excel
- POI匯出excel檔案加水印Excel
- Laravel-admin 匯出excel檔案LaravelExcel
- 檔案批次查詢複製匯出,按檔名批次查詢檔案,按檔案內容批次查詢檔案
- POI的使用及匯出excel報表Excel
- vue3 匯出為Excel檔案VueExcel
- C#中DataGrid匯出Excel檔案C#Excel
- 多個excel檔案合併成一個excel表的方法 如何快速合併多個excel檔案Excel
- 匯入excel檔案Excel
- 使用PHP原生匯出Excel和CSV檔案PHPExcel
- 前端必讀:如何在 JavaScript 中使用 SpreadJS 匯入和匯出 Excel 檔案前端JavaScriptJSExcel
- 金山文件怎麼匯出excel檔案 金山文件到處excel檔案的方法Excel
- php如何將資料匯出成excel表格呢?PHPExcel
- 基於Vue + axios + WebApi + NPOI匯出Excel檔案VueiOSWebAPIExcel
- php讀取excel檔案資料的匯入和匯出PHPExcel
- SpringBoot+Mybatis-plus整合easyExcel批次匯入Excel到資料庫+匯出ExcelSpring BootMyBatisExcel資料庫
- 【實戰教程】使用雲函式將資料表匯出為 Excel 檔案函式Excel
- 多個 EXCEL 檔案如何合併成一個檔案Excel
- Navicat如何匯入和匯出sql檔案SQL
- .NET CORE 2.1 匯出excel檔案的兩種方法Excel
- Java POI匯入Excel檔案JavaExcel
- Java之POI操作Excel表-匯入匯出JavaExcel
- 海量資料Excel報表利器——EasyExcel(一 利用反射機制匯出Excel)Excel反射
- Laravel5.6中使用Laravel/Excel實現Excel檔案匯出功能LaravelExcel
- 如何使用 JavaScript 匯入和匯出 ExcelJavaScriptExcel
- 騰訊文件怎樣匯出excel表格 騰訊文件如何匯出excelExcel
- 如何把markdown檔案匯出為pdf
- 如何優雅的匯出ExcelExcel
- 匯出excelExcel
- django實現將後臺資料excel檔案形式匯出DjangoExcel
- 微信小程式匯出Excel檔案並轉發給好友微信小程式Excel
- 匯出多個檔案到一個Excel中的不同sheetsExcel
- 【Excel】Excel 拆分以及批次匯入指令碼開發Excel指令碼
- 將dataGridView內容匯出到Excel檔案ViewExcel