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