原創(chuàng)|其它|編輯:郝浩|2012-10-11 09:25:50.000|閱讀 639 次
概述:在實(shí)際項(xiàng)目開發(fā)中,我們常常需要查詢數(shù)據(jù)庫,根據(jù)所得數(shù)據(jù)打印出一個(gè)PDF,Excel,HTML,CSV等報(bào)表,盡管這些用iReport結(jié)合JasperReport可以搞定,但是如果想輸出一個(gè)動(dòng)態(tài)的Excel電子報(bào)表,那么iReport結(jié)合JasperReport有點(diǎn)大題小做了。推薦大家用JExcel,因?yàn)樗浅:?jiǎn)單,好學(xué)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
背景:在實(shí)際項(xiàng)目開發(fā)中,我們常常需要查詢數(shù)據(jù)庫,根據(jù)所得數(shù)據(jù)打印出一個(gè)PDF,Excel,HTML,CSV等報(bào)表,盡管這些用iReport結(jié)合JasperReport可以搞定,但是如果想輸出一個(gè)動(dòng)態(tài)的Excel電子報(bào)表,那么iReport結(jié)合JasperReport有點(diǎn)大題小做了。推薦大家用JExcel,因?yàn)樗浅?簡(jiǎn)單,好學(xué)。
JExcel包說明及下載:JExcel是一個(gè)名jrl.jar的Java程序包,內(nèi)含對(duì)Excel文件操作的一整套API,比較全面和簡(jiǎn)單,可以從著名的nf.net網(wǎng)站//jexcelapi.sourceforge.net(這是一個(gè)學(xué)習(xí)JExcel最好的網(wǎng)站,上面不僅JExcel的程序包,還有一些JExcel的例子,整個(gè)JExcel API等,無疑是JExcel學(xué)習(xí)者的首選)上下載(如不能下載請(qǐng)上網(wǎng)搜一下,其他應(yīng)該有地方可以下載,如果實(shí)在找不到,可以給我發(fā)Email()要),然后把它添加到你的工程路徑中即可。
Workbook類,只讀工作簿類,即用戶可以獲得與某個(gè).xls文件等相關(guān)聯(lián)的Workbook對(duì)象,但是無法在上面寫數(shù)據(jù)。
WritableWorkbook類,可寫工作簿類,與上面的相反,用戶可以在上面寫數(shù)據(jù)。
WritableSheet類,可寫工作表類,用戶可以調(diào)用WritableWorkbook對(duì)象的getSheet()函數(shù)來獲得某個(gè)工作表,然后有上面寫東西。
Cell接口,表示一個(gè)單元格,上面有很多子接口及實(shí)現(xiàn)它或其子接口的類,這些實(shí)現(xiàn)類是具體的單元格類,如常用的Formula,Number,Lable等,這些具體單元格類幾乎都是行,列,數(shù)據(jù)三個(gè)元素的抽象,可調(diào)用WritableSheet對(duì)象的addCell(row)方法,直接把這些具體單元格類的對(duì)象添加到某個(gè)工作表中,結(jié)果就相當(dāng)于在輸出exel文件中某行某列的單元格中寫了數(shù)據(jù)。
Formula類,公式型單元格類,用戶可以用WritableCell cell = new Formula(col, row, content)語句來創(chuàng)建一個(gè)cell對(duì)象,其中WritableCell為Cell接口的子接口,col為列,row為行,content為String型的字符串。
Number類,數(shù)值型單元格類,操作同F(xiàn)ormula類。
Label類,字符串型單元格類,操作同F(xiàn)ormula類。
程序中常用用到的類大概就這幾個(gè),關(guān)于它們的方法和其他類的介紹,大家可以去//jexcelapi.sourceforge.net/resources/javadocs/current/docs/看,上面有全套的JExcel的API。
使用JExcel輸出動(dòng)態(tài)Excel文件的過程:
1、首先需要一個(gè).xls文件(也可以不用,創(chuàng)建新的Excel,然后在上面寫東西,不過,這樣的話,不利于客戶的使用,一般程序員根據(jù)客戶的需求和做好的.xls文件往上寫數(shù)據(jù))。
2、用Workbook srcBook=Workbook.getWorkbook(new File("*.xls"))建立一個(gè)與上面的.xls文件關(guān)系的Workbook對(duì)象。
3、用WritableWorkbook wb =Workbook.createWorkbook(response.getOutputStream(), srcBook)來在responxe輸出流中創(chuàng)建一份第2步中的Workbook對(duì)象的拷貝。
4、用WritableSheet sheet=wb.getSheet()相似的語句獲得某個(gè)工作表。
5、創(chuàng)建各種單元格類的對(duì)象,如Formula,Number,Label。
6、調(diào)用sheet.addCell(cell)方法把第4步中的單元格對(duì)象寫到輸出Excel文件中。
7、根據(jù)用戶需要,第5步和第6步可執(zhí)行多次。
8、調(diào)用WritableWorkbook對(duì)象的write()和close()方法來完成向response輸出流生成的Excel文件的寫操作。
這個(gè)例子是把數(shù)據(jù)庫中一個(gè)叫account(userid,passwd)表的所有信息輸出到Excel文件。首先創(chuàng)建一個(gè)名為accountManage.xls的Excel文件,上面有一些基本的文本信息,并把它保存在我的工程的WEB-INF/src/excel/excelFiles目錄下。
測(cè)試網(wǎng)頁中的鏈接或按紐把請(qǐng)求發(fā)給一個(gè)叫GenerateExcelServlet的servlet,這個(gè)servlet首先按照上面第2,3步那樣創(chuàng)建一個(gè)WritableWorkbook對(duì)象,然后查詢數(shù)據(jù)庫獲得account表中關(guān)于所有信息的list,這個(gè)怎么獲得都無所謂,只要你最終得到一個(gè)裝有Account對(duì)象(也包括上面的兩個(gè)屬性)的list就可以,然后循環(huán)取出此list的對(duì)象,針對(duì)每個(gè)對(duì)象,為其每個(gè)屬性創(chuàng)建一個(gè)Label對(duì)象,然后調(diào)用sheet.addCell()方法把Label對(duì)象寫到輸出流文件上去。
import java.*; import javax.servlet.*; import javax.servlet.http.*; import jxl.*; import jxl.write.*; public class GenerateExcelServlet extends HttpServlet { protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { OutputStream out = null; try { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=sampleName.xls"); File file = new File("E:/eclipse/workspace/StrutsTest/WEB- INF/src/excel/excelFiles/accountManage.xls");//注意,里面的參數(shù)必須是這個(gè)文件全路徑 Workbook srcBook = Workbook.getWorkbook(file); WritableWorkbook wb =Workbook.createWorkbook(response.getOutputStream(), srcBook); WritableSheet s = wb.getSheet(0); // w.createSheet("Demo", 0); ....//查詢數(shù)據(jù)庫,獲得account表所有信息的list,名字為accountList Iterator t=accountList.iterator(); WritableSheet sheet=wb.getSheet(0); int row=2; while(t.hasNext()){ row++; Account user=(Account)t.next(); s.addCell(new Label(0, row-1, user.getUseridD())); s.addCell(new Label(1, row-1, user.getPasswd()); } wb.write(); wb.close(); catch (Exception e) { e.printStackTrace(); }finally { if (out != null) out.close(); } protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
注:這是JExcel輸出Excel的流程,為了簡(jiǎn)單,易懂,我就全部寫在了servlet中,實(shí)際中,你可以采取多次封裝,只要按照這個(gè)流程走就沒問題。比如我在大三暑假實(shí)習(xí)期間,為一家公司做項(xiàng)目,采用的是Hibernate,Struts架構(gòu),我有一個(gè)BaseExcel的基類,里面有一個(gè)processExcel()的抽象函數(shù),和一個(gè)propareData()的抽象函數(shù),在我的AccountExcel(繼承BaseExcel)子類,有一個(gè)accountList,及excelFileName的屬性,然后實(shí)現(xiàn)基類的兩個(gè)抽象函數(shù),在propareData()中,我用Hibernate訪問數(shù)據(jù)庫獲得accountList對(duì)象,在processExcel( WritableWorkbook wb)中,我接受從servlet傳來的WritableWorkbook參數(shù),然后像上面一樣循環(huán)取出accountList的所有對(duì)象,并把每個(gè)對(duì)象的每個(gè)屬性值封裝到Label對(duì)象中,然后寫到WritableWorkbook對(duì)象的某個(gè)sheet中。這樣,我把測(cè)試網(wǎng)頁的鏈接或按紐的請(qǐng)求發(fā)給一個(gè)Action子類AccountExcelAction去處理,這個(gè)action創(chuàng)建一個(gè)AccountExcel對(duì)象,并把它保存在request中,然后把請(qǐng)求轉(zhuǎn)發(fā)給servlet,按照上面代碼的那樣創(chuàng)建WritableWorkbook對(duì)象wb,再調(diào)用AccountExcel對(duì)象的process(wb)就可以實(shí)現(xiàn)上面那樣結(jié)果,實(shí)際過程中,我的封裝比這還要多,雖然很煩,但是相當(dāng)具有擴(kuò)充性,當(dāng)我想輸出另外一個(gè)Excel是,共用GenerateExcelServlet,另外添加一個(gè)Action,和BaseExcel的子類就可以搞定了。
好了,就寫到這兒了,我掌握的JExcel技術(shù)大概也就這么多,上面的文章中有不妥之處,可以發(fā)件和我交流。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:呂威的百度空間