Java Struts2创造Excel文件并实现文件下载
Java Struts2创建Excel文件并实现文件下载
2.编写Action类
注:本文参考了网上的一篇文章,但是忘记地址了,对作者深表歉意。
在做管理系统的时候,经常会用到文件的下载,特别是Excel报表的创建与下载,下面就来简单演示一下,Struts2实现的Excel文件的下载功能。
由于本实验是要动态创建Excel文件,因此需要一些jar:
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版。
1. 配置struts.xml
<struts> <package name="export" namespace="/export" extends="struts-default"> <action name="*" class="excelExportAction" method="{1}"/> <!--测试Excel下载--> <action name="exportExcel" class="excelExportAction" method="exportExcel"> <result name="success" type="stream"> <!-- 下载文件的类型,如果你不知道是什么格式,可以去 tomcat\conf\web.xml下找 --> <param name="contentType">application/vnd.ms-excel</param> <!-- 返回流 excelStream为action中的流变量名称 --> <param name="inputName">excelStream</param> <!-- attachment 这个位置的参数挺特殊的,可以设置成下载时,是否出现个下载提示框,或者直接下载之类的。 fileName指定生成的文件名字(适合动态生成文件名,比如做报表时,一般都要说是几月的统计数据之类)为action中变量--> <param name="contentDisposition"> attachment;filename=${excelFileName} </param> <param name="bufferSize">1024</param> </result> </action> </package> </struts>
2.编写Action类
POI的Maven配置如下:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency>
import org.apache.poi.hssf.usermodel.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; public class ExcelExportAction extends ActionSupport { /** 导出Excel测试 */ public String exportExcel() { try { //第一步,创建一个webbook,对应一个Excel文件 HSSFWorkbook wb = new HSSFWorkbook(); //第二步,在webbook中添加一个sheet,对应Excel文件中的 sheet HSSFSheet sheet = wb.createSheet("测试表格1"); //第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 HSSFRow row = sheet.createRow(0); //第四步,创建单元格样式:居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //第五步,创建表头单元格,并设置样式 HSSFCell cell; cell = row.createCell(0); cell.setCellValue("员工工号"); cell.setCellStyle(style); cell = row.createCell(1); cell.setCellValue("员工姓名"); cell.setCellStyle(style); cell = row.createCell(2); cell.setCellValue("所属部门"); cell.setCellStyle(style); cell = row.createCell(3); cell.setCellValue("职位"); cell.setCellStyle(style); cell = row.createCell(4); cell.setCellValue("入职日期"); cell.setCellStyle(style); cell = row.createCell(5); cell.setCellValue("备注"); cell.setCellStyle(style); //第六步,写入实体数据,实际应用中这些数据从数据库得到 Date today = new Date(); long aDay = 1000L*60*60*24; SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); for (int i = 1; i <= 10; i++) { row = sheet.createRow(i); row.createCell(0).setCellValue(i); row.createCell(1).setCellValue("员工" + i); row.createCell(2).setCellValue("总公司"); row.createCell(3).setCellValue("普通员工"); row.createCell(4).setCellValue(fmt.format(new Date(today.getTime() + i * aDay))); row.createCell(5).setCellValue("员工备注"); } //第七步,将文件存到流中 ByteArrayOutputStream os = new ByteArrayOutputStream(); wb.write(os); byte[] fileContent = os.toByteArray(); ByteArrayInputStream is = new ByteArrayInputStream(fileContent); excelStream = is; //文件流 excelFileName = "report.xls"; //设置下载的文件名 } catch(Exception e) { e.printStackTrace(); } return "success"; } //------------------------- private InputStream excelStream; //输出流变量 private String excelFileName; //下载文件名 public InputStream getExcelStream() { return excelStream; } public void setExcelStream(InputStream excelStream) { this.excelStream = excelStream; } public String getExcelFileName() { return excelFileName; } public void setExcelFileName(String excelFileName) { this.excelFileName = excelFileName; } }
注:本文参考了网上的一篇文章,但是忘记地址了,对作者深表歉意。