在做管理系統的時候,經常會用到文件的下載,特別是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
- <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;
- }
- }