需求說(shuō)明
成都創(chuàng)新互聯(lián)自2013年起,先為子長(zhǎng)等服務(wù)建站,子長(zhǎng)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為子長(zhǎng)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。報(bào)表展現(xiàn)后可以通過(guò)工具欄中的導(dǎo)出按鈕將當(dāng)前展現(xiàn)的報(bào)表導(dǎo)出成 excel 文件,但是在實(shí)際使用中通常會(huì)要求報(bào)表不需要展現(xiàn),直接通過(guò)一些操作將報(bào)表導(dǎo)出成 excel 文件,并且往往會(huì)要求批量導(dǎo)出成 excel 文件,下面通過(guò)幾個(gè)示例介紹下報(bào)表不展現(xiàn),如何批量生成 excel 文件。
實(shí)現(xiàn)這種需求一般要用到 api 方式,批量生成 excel 文件,按照方式上來(lái)分大體上可以分為三類(lèi):
一:?jiǎn)伪韺?dǎo)出單 excel 多 sheet
二:多表導(dǎo)出單 excel 多 sheet
三:多表導(dǎo)出多 excel 文件
單表多 sheet
此種方式通常是報(bào)表格式固定,然后根據(jù)某個(gè)參數(shù)對(duì)數(shù)據(jù)過(guò)濾,導(dǎo)出 excel 時(shí)需要導(dǎo)出多個(gè)參數(shù)的數(shù)據(jù),并且每個(gè)參數(shù)的數(shù)據(jù)放到同一個(gè) excel 的不同 sheet 里,比如本例中按照地區(qū)統(tǒng)計(jì)訂單信息,要求導(dǎo)出時(shí)每個(gè)地區(qū)數(shù)據(jù)導(dǎo)出到一個(gè) sheet 中,地區(qū)名稱(chēng)做為 sheet 名,下面看下這種做法:
報(bào)表設(shè)計(jì)界面不必多說(shuō),按照需求設(shè)計(jì)就行,如下圖:
報(bào)表中增加一個(gè)參數(shù):area,用于接收地區(qū)參數(shù),然后在數(shù)據(jù)集中通過(guò)這個(gè)參數(shù)過(guò)濾數(shù)據(jù)就行。
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" );//獲取報(bào)表名稱(chēng) if(report==null) report="訂單.rpx";//如果url上報(bào)表名為空,則取訂單表 String fileName=report.substring(0,report.length()-4);//讀取文件名,用于設(shè)置excel名稱(chēng) String reportName = request.getRealPath("WEB-INF\\\reportFiles\\\"+report);// String exportPath=request.getRealPath("/export");//在應(yīng)用根目錄下建export目錄,放置導(dǎo)出文件 ReportDefine rd = (ReportDefine)ReportUtils.read(reportName);//讀取報(bào)表 String areas="華北,東北,西北,華南,西南";//此例按照地區(qū)循環(huán),實(shí)際中可以接收其他參數(shù),也可以從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù) String\[\] area=areas.split(","); ExcelReport er=new ExcelReport(); for(int i=0;i
<%@ 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" );//獲取報(bào)表名稱(chēng) if(report==null) report="訂單.rpx";//如果url上報(bào)表名為空,則取訂單表 String fileName=report.substring(0,report.length()-4);//讀取文件名,用于設(shè)置excel名稱(chēng) String reportName = request.getRealPath("WEB-INF\\\reportFiles\\\"+report);// String exportPath=request.getRealPath("/export");//在應(yīng)用根目錄下建export目錄,放置導(dǎo)出文件 ReportDefine rd = (ReportDefine)ReportUtils.read(reportName);//讀取報(bào)表 String areas="華北,東北,西北,華南,西南";//此例按照地區(qū)循環(huán),實(shí)際中可以接收其他參數(shù),也可以從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù) String\[\] area=areas.split(","); ExcelReport er=new ExcelReport(); for(int i=0;i
這樣,就會(huì)在應(yīng)用根目錄的 export 目錄下生成對(duì)應(yīng)的 excel 文件,生成 excel 文件如下:
多表多 sheet
此種情況應(yīng)用于導(dǎo)出的 excel 由多個(gè)報(bào)表組成,然后每個(gè)報(bào)表導(dǎo)出到 excel 中不同 sheet 中,并且有可能每個(gè)報(bào)表的參數(shù)不同(如果參數(shù)相同,那么和示例一類(lèi)似,只是按報(bào)表名稱(chēng)循環(huán)就行),下面看下具體實(shí)現(xiàn)過(guò)程:
由于不同報(bào)表參數(shù)可能會(huì)不同,所以在 api 中解析每個(gè)報(bào)表以及對(duì)應(yīng)參數(shù)難度會(huì)比較大,此例要求通過(guò) url 訪問(wèn)報(bào)表時(shí),按照特定格式訪問(wèn),比如:
http://localhost:6868/demo/reportJsp/exportExcel1.jsp?report={無(wú)參數(shù)報(bào)表名 1}{無(wú)參數(shù)報(bào)表名 2}{報(bào)表 1( 參數(shù) 1=value1; 參數(shù) 2=value2;…)}{報(bào)表 2( 參數(shù) 1=value1; 參數(shù) 2=value2;…)},比如: http://localhost:6868/demo/reportJsp/exportExcel1.jsp?report={test1.rpx}{test2.rpx(arg1=11;arg2=22;arg3=33)}這種方式,現(xiàn)在在高版本的 tomcat 中,會(huì)有一些特殊符號(hào)的限定,使用時(shí)可以將 {} 轉(zhuǎn)換成對(duì)應(yīng)的 urlencode 方式,{為 %7B,}為 %7B,如果有其他值的話,做對(duì)應(yīng)轉(zhuǎn)換就行,url 設(shè)置完成后,接下來(lái)就看下如何解析這個(gè) 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參數(shù)格式為:report={無(wú)參數(shù)報(bào)表名1}{無(wú)參數(shù)報(bào)表名2}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)} request.setCharacterEncoding( "UTF-8" ); String report = request.getParameter( "report" ); if( report == null || report.trim().length() == 0 ) throw new Exception( "請(qǐng)輸入報(bào)表文件名及參數(shù)串report={無(wú)參數(shù)報(bào)表名}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)}..." ); String exportPath=request.getRealPath("/export");//在應(yīng)用根目錄下建export目錄,放置導(dǎo)出文件 String report1=report.replace("}","");//去掉串中的} String report2=report1.substring(1,report1.length());//去掉串中的最左側(cè)的{ String\[\] a=report2.split("\\\{");//此時(shí)串中多個(gè)報(bào)表之間用{分隔,所以此處按照該符號(hào)split生成數(shù)組 ExcelReport er=new ExcelReport(); for(int i=0;i
<%@ 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參數(shù)格式為:report={無(wú)參數(shù)報(bào)表名1}{無(wú)參數(shù)報(bào)表名2}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)} request.setCharacterEncoding( "UTF-8" ); String report = request.getParameter( "report" ); if( report == null || report.trim().length() == 0 ) throw new Exception( "請(qǐng)輸入報(bào)表文件名及參數(shù)串report={無(wú)參數(shù)報(bào)表名}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)}..." ); String exportPath=request.getRealPath("/export");//在應(yīng)用根目錄下建export目錄,放置導(dǎo)出文件 String report1=report.replace("}","");//去掉串中的} String report2=report1.substring(1,report1.length());//去掉串中的最左側(cè)的{ String\[\] a=report2.split("\\\{");//此時(shí)串中多個(gè)報(bào)表之間用{分隔,所以此處按照該符號(hào)split生成數(shù)組 ExcelReport er=new ExcelReport(); for(int i=0;i
多表多 excel
此種方式和示例二類(lèi)似,在實(shí)際使用中導(dǎo)出 excel 時(shí)要求每個(gè)報(bào)表導(dǎo)出成不同的 excel 文件,但是后續(xù)可能會(huì)涉及到下載問(wèn)題,所以此種方式一般是要建立個(gè)臨時(shí)目錄,然后將多個(gè) excel 放到臨時(shí)目錄內(nèi),可以進(jìn)行打包下載。具體代碼如下:
<%@ 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參數(shù)格式為:report={無(wú)參數(shù)報(bào)表名1}{無(wú)參數(shù)報(bào)表名2}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)} request.setCharacterEncoding( "UTF-8" ); String report = request.getParameter( "report" ); if( report == null || report.trim().length() == 0 ) throw new Exception( "請(qǐng)輸入報(bào)表文件名及參數(shù)串report={無(wú)參數(shù)報(bào)表名}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)}..." ); String exportPath=request.getRealPath("/export");//在應(yīng)用根目錄下建export目錄,放置導(dǎo)出文件 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());//去掉串中的最左側(cè)的{ String\[\] a=report2.split("\\\{");//此時(shí)串中多個(gè)報(bào)表之間用{分隔,所以此處按照該符號(hào)split生成數(shù)組 ExcelReport er=new ExcelReport(); for(int i=0;i
<%@ 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參數(shù)格式為:report={無(wú)參數(shù)報(bào)表名1}{無(wú)參數(shù)報(bào)表名2}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)} request.setCharacterEncoding( "UTF-8" ); String report = request.getParameter( "report" ); if( report == null || report.trim().length() == 0 ) throw new Exception( "請(qǐng)輸入報(bào)表文件名及參數(shù)串report={無(wú)參數(shù)報(bào)表名}{報(bào)表1(參數(shù)1=value1;參數(shù)2=value2;...)}{報(bào)表2(參數(shù)1=value1;參數(shù)2=value2;...)}..." ); String exportPath=request.getRealPath("/export");//在應(yīng)用根目錄下建export目錄,放置導(dǎo)出文件 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());//去掉串中的最左側(cè)的{ String\[\] a=report2.split("\\\{");//此時(shí)串中多個(gè)報(bào)表之間用{分隔,所以此處按照該符號(hào)split生成數(shù)組 ExcelReport er=new ExcelReport(); for(int i=0;i
打包下載
文件生成到對(duì)應(yīng)目錄下后,可以自己?jiǎn)为?dú)做個(gè)鏈接指向這個(gè) excel 文件下載,也可以直接生成 excel 文件后直接進(jìn)行下載,在對(duì)應(yīng) 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 ( "出現(xiàn)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();//刪除文件 實(shí)際應(yīng)用中可能會(huì)需要將文件大成zip包方式,比如示例三,這個(gè)直接百度下java程序打zip包,然后下載zip包就行。
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 ( "出現(xiàn)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();//刪除文件 實(shí)際應(yīng)用中可能會(huì)需要將文件大成zip包方式,比如示例三,這個(gè)直接百度下java程序打zip包,然后下載zip包就行。
總結(jié)
本文中介紹了如何通過(guò) api 將報(bào)表批量導(dǎo)出成 excel 的方法,實(shí)際中也有可能生成 pdf 或者 txt 等,思路是一樣到,到時(shí)候換用不同的 api 就行。
詳情鏈接: http://c.raqsoft.com.cn/article/1571624596905?r=gxy