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

  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配置如下:

  1. <dependency>  
  2.      <groupId>org.apache.poi</groupId>  
  3.      <artifactId>poi</artifactId>  
  4.      <version>3.9</version>  
  5. </dependency>  


Action类如下:
  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.     }  

posted on 2016-06-11 17:34  菜鸟Z  阅读(301)  评论(0编辑  收藏  举报

导航