Java Struts2 POI創建Excel文件並實現文件下載

在做管理系統的時候,經常會用到文件的下載,特別是Excel報表的創建與下載,下面就來簡單演示一下,Struts2實現的Excel文件的下載功能。

由於本實驗是要動態創建Excel文件,因此需要一些jar:

Java讀寫Excel的包是Apache POI(項目地址:http://poi.apache.org/),因此需要先獲取POI的jar包,本實驗使用的是POI 3.9穩定版。

Apache POI 代碼例子地址:http://poi.apache.org/spreadsheet/quick-guide.html

1. 配置struts.xml

[html] view plain copy
  1. <struts>  
  2.     <package name="export" namespace="/export" extends="struts-default">  
  3.         <action name="*" class="excelExportAction" method="{1}"/>  
  4.   
  5.         <!--測試Excel下載-->  
  6.         <action name="exportExcel" class="excelExportAction" method="exportExcel">  
  7.             <result name="success" type="stream">  
  8.                 <!-- 下載文件的類型,如果你不知道是什麼格式,可以去 tomcat\conf\web.xml下找 -->  
  9.                 <param name="contentType">application/vnd.ms-excel</param>  
  10.                 <!-- 返回流 excelStream爲action中的流變量名稱 -->  
  11.                 <param name="inputName">excelStream</param>  
  12.                 <!-- attachment 這個位置的參數挺特殊的,可以設置成下載時,是否出現個下載提示框,或者直接下載之類的。  
  13.                 fileName指定生成的文件名字(適合動態生成文件名,比如做報表時,一般都要說是幾月的統計數據之類)爲action中變量-->  
  14.                 <param name="contentDisposition">  
  15.                     attachment;filename=${excelFileName}  
  16.                 </param>  
  17.                 <param name="bufferSize">1024</param>  
  18.             </result>  
  19.         </action>  
  20.     </package>  
  21. </struts>  

2.編寫Action類

POI的Maven配置如下:

[html] view plain copy
  1. <dependency>  
  2.      <groupId>org.apache.poi</groupId>  
  3.      <artifactId>poi</artifactId>  
  4.      <version>3.9</version>  
  5. </dependency>  


Action類如下:
[java] view plain copy
  1. import org.apache.poi.hssf.usermodel.*;  
  2. import java.io.ByteArrayInputStream;  
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.InputStream;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Date;  
  7.   
  8. public class ExcelExportAction extends ActionSupport {  
  9.   
  10.     /** 導出Excel測試 */  
  11.     public String exportExcel() {  
  12.         try {  
  13.             //第一步,創建一個webbook,對應一個Excel文件  
  14.             HSSFWorkbook wb = new HSSFWorkbook();  
  15.             //第二步,在webbook中添加一個sheet,對應Excel文件中的 sheet  
  16.             HSSFSheet sheet = wb.createSheet("測試表格1");  
  17.             //第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制  
  18.             HSSFRow row = sheet.createRow(0);  
  19.             //第四步,創建單元格樣式:居中  
  20.             HSSFCellStyle style = wb.createCellStyle();  
  21.             style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  22.             //第五步,創建表頭單元格,並設置樣式  
  23.             HSSFCell cell;  
  24.   
  25.             cell = row.createCell(0);  
  26.             cell.setCellValue("員工工號");  
  27.             cell.setCellStyle(style);  
  28.   
  29.             cell = row.createCell(1);  
  30.             cell.setCellValue("員工姓名");  
  31.             cell.setCellStyle(style);  
  32.   
  33.             cell = row.createCell(2);  
  34.             cell.setCellValue("所屬部門");  
  35.             cell.setCellStyle(style);  
  36.   
  37.             cell = row.createCell(3);  
  38.             cell.setCellValue("職位");  
  39.             cell.setCellStyle(style);  
  40.   
  41.             cell = row.createCell(4);  
  42.             cell.setCellValue("入職日期");  
  43.             cell.setCellStyle(style);  
  44.   
  45.             cell = row.createCell(5);  
  46.             cell.setCellValue("備註");  
  47.             cell.setCellStyle(style);  
  48.   
  49.             //第六步,寫入實體數據,實際應用中這些數據從數據庫得到  
  50.             Date today = new Date();  
  51.             long aDay = 1000L*60*60*24;  
  52.             SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");  
  53.             for (int i = 1; i <= 10; i++) {  
  54.                 row = sheet.createRow(i);  
  55.                 row.createCell(0).setCellValue(i);  
  56.                 row.createCell(1).setCellValue("員工" + i);  
  57.                 row.createCell(2).setCellValue("總公司");  
  58.                 row.createCell(3).setCellValue("普通員工");  
  59.                 row.createCell(4).setCellValue(fmt.format(new Date(today.getTime() + i * aDay)));  
  60.                 row.createCell(5).setCellValue("員工備註");  
  61.             }  
  62.   
  63.             //第七步,將文件存到流中  
  64.             ByteArrayOutputStream os = new ByteArrayOutputStream();  
  65.             wb.write(os);  
  66.             byte[] fileContent = os.toByteArray();  
  67.             ByteArrayInputStream is = new ByteArrayInputStream(fileContent);  
  68.   
  69.             excelStream = is;             //文件流  
  70.             excelFileName = "report.xls"//設置下載的文件名  
  71.         }  
  72.         catch(Exception e) {  
  73.             e.printStackTrace();  
  74.         }  
  75.   
  76.         return "success";  
  77.     }  
  78.   
  79.   
  80.     //-------------------------------------------------------------  
  81.     private InputStream excelStream;  //輸出流變量  
  82.     private String excelFileName; //下載文件名  
  83.   
  84.     public InputStream getExcelStream() {  
  85.         return excelStream;  
  86.     }  
  87.     public void setExcelStream(InputStream excelStream) {  
  88.         this.excelStream = excelStream;  
  89.     }  
  90.     public String getExcelFileName() {  
  91.         return excelFileName;  
  92.     }  
  93.     public void setExcelFileName(String excelFileName) {  
  94.         this.excelFileName = excelFileName;  
  95.     }  
  96. }  
發佈了70 篇原創文章 · 獲贊 101 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章