• 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.                 <!-- 下载文件的类型,如果你不知道是什么格式,可以去 tomcatconfweb.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.     }  

  • 相关阅读:
    第18课 类型萃取(2)_获取返回值类型的traits
    第17课 类型萃取(1)_基本的type_traits
    【ASP.NET MVC系列】浅谈数据注解和验证
    【ASP.NET MVC系列】浅谈NuGet在VS中的运用
    【ASP.NET MVC系列】浅谈ASP.NET MVC 视图
    【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程
    【Java系列】Eclipse与Tomcat
    【java系列】java开发环境搭建
    【设计模式篇】工厂模式
    【架构篇】OCP和依赖注入
  • 原文地址:https://www.cnblogs.com/archermeng/p/7537384.html
Copyright © 2020-2023  润新知