程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 實現了JSF下的生成EXCEL

實現了JSF下的生成EXCEL

編輯:J2EE

Excel這個大家幾乎每天都用到的工具,為我們的工作帶來了極大的方便。在現在的B/S系統中,特別是很多大型的辦公系統中,大量的報表需要處理,導出EXCEL的功能就顯得尤為重要了。導出Excel已經是相當成熟的技術了,但是在Java中卻不是一件容易的事。特別是在JSF架構的系統中,由於使用的人數和學習的資料都很少,實現導出Excel的功能也頗費周折。由於項目的需要,本人需要實現這樣的功能,經過對大量代碼的改造,實現了JSF下的生成EXCEL並在客戶端實現下載的功能。下面的例子中,我用的是POI來生成Excel。Apache的Jakata項目的POI子項目,目標是處理ole2對象。 POI可以到http://www.apache.org/dyn/closer.CGI/jakarta/poi/下載。 編譯好的jar主要有這樣4個:poi包,poi Browser包,poi hdf包,poi hssf例程包。實際運行時,需要有poi包就可以了。

在下面的工具類中,我通過private static void downloadFile(String strfileName) 這個方法在生成Excel以後實現在客戶端的下載。在這個類中,這個方法就是經過改造的JSF實現。不過這個工具類有個不足之處就是,傳遞給 downloadFile(String strfileName) 的文件名不支持中文,希望大家注意,也希望各位能給出解決辦法。

  1. package mj.util.Excel;
  2. import Java.io.File;
  3. import Java.io.FileInputStream;
  4. import Java.io.FileOutputStream;
  5. import Java.io.IOException;
  6. import Java.util.List;
  7. import Javax.faces.context.FacesContext;
  8. import Javax.servlet.ServletContext;
  9. import Javax.servlet.ServletOutputStream;
  10. import Javax.servlet.http.HttpServletResponse;
  11. import org.apache.poi.hssf.usermodel.HSSFCell;
  12. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  13. import org.apache.poi.hssf.usermodel.HSSFFont;
  14. import org.apache.poi.hssf.usermodel.HSSFRow;
  15. import org.apache.poi.hssf.usermodel.HSSFSheet;
  16. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  17. /**
  18. * 本工具類解決了Java到處Excel,並同時實現了客戶端下載 不足之處:下載方法傳入的文件名不支持中文
  19. *
  20. * @author yongtree
  21. *
  22. */
  23. public class ExcelUtils {
  24. private static String sheetName = "data";
  25. private HSSFWorkbook wb;
  26. private HSSFSheet sheet;
  27. private HSSFRow row;
  28. private HSSFCell cell;
  29. private HSSFFont font;
  30. private HSSFCellStyle cellStyle;
  31. private FileOutputStream fileOut;
  32. public ExcelUtils() {
  33. wb = new HSSFWorkbook();
  34. }
  35. /**
  36. * @param ExcelName
  37. * Excel名稱。
  38. * @param list
  39. * 這個list裡面存放的是對象數組。數組元素可以轉化為字符串顯示的。這個對象數組一般對應數據庫裡的幾列。
  40. * @param firstRowValue
  41. */
  42. public void outputExcel(String ExcelName, List list, String[] firstRowValue) {
  43. try {
  44. this.createSheet(firstRowValue);
  45. this.setValueToRow(ExcelName, list);
  46. } catch (Exception ex) {
  47. System.out.print(ex);
  48. }
  49. // System.out.println("文件名是:" + ExcelName);
  50. downloadFile(ExcelName);
  51. }
  52. public void outputExcel(String ExcelName, List list) {
  53. try {
  54. this.setValueToRow(ExcelName, list);
  55. } catch (Exception e) {
  56. // TODO: handle exception
  57. }
  58. downloadFile(ExcelName);
  59. }
  60. private void setValueToRow(String ExcelName, List list) {
  61. // 獲得JSF上下文環境
  62. FacesContext context = FacesContext.getCurrentInstance();
  63. // 獲得ServletContext對象
  64. ServletContext servletContext = (ServletContext) context
  65. .getExternalContext().getContext();
  66. // 取得文件的絕對路徑
  67. ExcelName = servletContext.getRealPath("/UploadFile") + "/" + ExcelName;
  68. System.out.println("生成文件的路徑是:" + ExcelName);
  69. Object[] obj;
  70. try {
  71. for (int i = 0; i < list.size(); i++) {
  72. row = sheet.createRow(i + 1);
  73. obj = (Object[]) list.get(i);
  74. this.createCell(row, obj);
  75. }
  76. fileOut = new FileOutputStream(ExcelName);
  77. wb.write(fileOut);
  78. } catch (Exception ex) {
  79. System.out.print("生成報表有誤:" + ex);
  80. } finally {
  81. try {
  82. fileOut.flush();
  83. fileOut.close();
  84. } catch (Exception e) {
  85. System.out.println("ExcelUtil.setValueToRow()");
  86. }
  87. }
  88. }
  89. private void createSheet(String[] firstRowValue) {
  90. try {
  91. sheet = wb.createSheet(ExcelUtils.sheetName);
  92. row = sheet.createRow(0);
  93. font = wb.createFont();
  94. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  95. cellStyle = wb.createCellStyle();
  96. cellStyle.setFont(font);
  97. for (int i = 0; i < firstRowValue.length; i++) {
  98. cell = row.createCell((short) i);
  99. cell.setCellStyle(cellStyle);
  100. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  101. cell.setCellValue(firstRowValue[i]);
  102. }
  103. } catch (Exception ex) {
  104. System.out.print(ex);
  105. }
  106. }
  107. private void createCell(HSSFRow row, Object[] obj) {
  108. try {
  109. for (int i = 0; i < obj.length; i++) {
  110. cell = row.createCell((short) i);
  111. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  112. cell.setCellValue(obj[i].toString());
  113. }
  114. } catch (Exception ex) {
  115. System.out.print(ex);
  116. }
  117. }
  118. /**
  119. *
  120. * 功能說明:根據提供的文件名下載文件,不支持中文文件名
  121. *
  122. * 此方法由yongtree添加,實現文件生成後的下載
  123. *
  124. * @param strfileName
  125. * String
  126. * @return void
  127. */
  128. private static void downloadFile(String strfileName) {
  129. try {
  130. // 獲得JSF上下文環境
  131. FacesContext context = FacesContext.getCurrentInstance();
  132. // 獲得ServletContext對象
  133. ServletContext servletContext = (ServletContext) context
  134. .getExternalContext().getContext();
  135. // 取得文件的絕對路徑
  136. String ExcelName = servletContext.getRealPath("/UploadFile") + "/"
  137. + strfileName;
  138. File exportFile = new File(ExcelName);
  139. HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
  140. .getCurrentInstance().getExternalContext().getResponse();
  141. ServletOutputStream servletOutputStream = httpServletResponse
  142. .getOutputStream();
  143. httpServletResponse.setHeader("Content-disposition",
  144. "attachment; filename=" + strfileName);
  145. httpServletResponse.setContentLength((int) exportFile.length());
  146. httpServletResponse.setContentType("application/x-download");
  147. // httpServletResponse.setContentType("application/vnd.ms-Excel");
  148. byte[] b = new byte[1024];
  149. int i = 0;
  150. FileInputStream fis = new Java.io.FileInputStream(exportFile);
  151. while ((i = fis.read(b)) > 0) {
  152. servletOutputStream.write(b, 0, i);
  153. }
  154. } catch (IOException e) {
  155. e.printStackTrace();
  156. }
  157. FacesContext.getCurrentInstance().responseComplete();
  158. }
  159. }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved