struts2+poi 导出Excel文件

16 篇文章 0 订阅
12 篇文章 0 订阅
<action name="exportExcel" class="com.action.common.ExcelAction"> 
            <result name="success" type="stream"> 
                <param name="contentType">application/vnd.ms-excel;charset=utf-8</param>  
                <param name="inputName">excelStream</param>
                <param name="contentDisposition">attachment;filename="${fileName}.xls"</param>
               <param name="bufferSize">1024</param>
            </result> 
            <result name="error">../report/DataEmpty.jsp</result>
  </action>

其中,stream类型的结果共可以指定7个参数:

  • contentType:下载文件的类型。
  • contentLength:下载文件的长度,用于浏览器的进度条显示。
  • contentDisposition:指定文件下载的默认名字,如果不指定则使用Action名.action。
  • inputName:Action中用于返回InputStream的get方法的名字,默认为inputStream,因此,我们的Action中定义了getInputStream的方法。
  • bufferSize:缓冲区大小,默认为(1024)即1k。
  • allowCaching:是否允许浏览器进行缓存。
  • contentCharSet:HTTP响应头信息中的编码方式。

2.在对应的Action中定义输出流和文件名

 

2.1 InputStream excelStream;  //这个输入流对应上面struts.xml中配置的那个excelStream,两者必须一致
    String fileName;  //这个名称就是用来传给上面struts.xml中的${fileName}的

    并生成get、set方法

  然后得到jsp页面传过来的值,可以多个jsp页面的多个按钮使用着同一个Action,只要传过来的值其中有一个作为识别条件即可。如1.jap和2.jsp都要调用此方法,那1.jsp传过来一个“A”,2.jsp传过来一个“B”,根绝A或者B的不同调用不同的List生成方法,就可以实现。

  是的,这里下一步就是生成一个存有预期输出结果的List,生成方法可考虑单独建立方法文件,当需要实现多个页面调用或者一个页面多出调用Action方法的时候,建议List生成方法分别些方法文件或几种一个文件,尽量避免放在Action中。

 下面的步骤基本如下

if(null == list ){   

     this.setVestige(actionHistory+"失败!");  

     return "error";   

   }else{ 

        //创建Excel工作簿方法2.2

  HSSFWorkbook workbook = getWorkbook(list,sheetName,isSum);

   if (null != workbook) {   

    try {      

    //将工作簿写入最上面定义的InputStream流——名称为excelStream,这个名字对应struts.xml中配置的inputName参数

      this.workbook2InputStream(workbook,fileName);          

    return "success";     

   }catch (IOException e) {  

      e.printStackTrace();                                         

      return "error"; }    

    }else{                    

      return "error";    

    }    

  }

private HSSFWorkbook getWorkbook(List listM,String sheetNames,int isSum) throws Exception {
  HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件
  
  HSSFCellStyle style = workbook.createCellStyle(); // 样式对象
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
  style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐 
  
  String[] sheetName = sheetNames.split(",");
  for(int k = 0; k < listM.size(); k++){
   List list = (List) listM.get(k);
   HSSFSheet sheet = workbook.createSheet();//创建sheet
   workbook.setSheetName(k, sheetName[k], HSSFCell.ENCODING_UTF_16);//为指定第K个sheet命名,并设定字符集类型
   
   String[] columnNames = (String[]) list.get(0);
   
   HSSFRow row = sheet.createRow(0); // 创建第1行,也就是输出表头
   HSSFCell cell = row.createCell((short) 0);
   cell.setCellType(HSSFCell.CELL_TYPE_STRING);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   for (short i = 0; i < columnNames.length; i++) {
    cell = row.createCell(i); // 创建第i列
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellValue(columnNames[i]);
   }
   
   List colunData = null;
   // 下面是输出各行的数据(留出最后一行,如果是合计信息单独输出,如果非合计信息按照原本样式输出)
   if(list.size() > 1){
    for(int i = 1 ;i < list.size()-1;i++){
     colunData = (List) list.get(i);
     row = sheet.createRow(i);// 创建第i行
     for (short j = 0; j < colunData.size(); j++) {
      cell = row.createCell(j); // 创建第j列
      cell.setCellType(HSSFCell.CELL_TYPE_STRING);
      cell.setEncoding(HSSFCell.ENCODING_UTF_16);
      cell.setCellValue(colunData.get(j).toString());
     }
    }
    if(isSum == 0){//无需统计信息
     colunData = (List) list.get(list.size()-1);
     row = sheet.createRow(list.size()-1);// 创建第i行
     for (short j = 0; j < colunData.size(); j++) {
      cell = row.createCell(j); // 创建第j列
      cell.setCellType(HSSFCell.CELL_TYPE_STRING);
      cell.setEncoding(HSSFCell.ENCODING_UTF_16);
      cell.setCellValue(colunData.get(j).toString());
     }
    }else if(isSum == 1 ){
     colunData = (List) list.get(list.size()-1);//此处留下最后一列
     row = sheet.createRow(list.size()-1);// 创建第i行
     sheet.addMergedRegion(new Region(list.size()-1, (short)0, list.size()-1, (short) 2));    
     for (short j = 0; j < colunData.size(); j++) {
      if(j == 0){
       cell = row.createCell(j); // 创建第j列
       cell.setCellStyle(style);//设置居中
      }else{
       cell = row.createCell((short) (j+2)); // 创建第j列
      }
      cell.setCellType(HSSFCell.CELL_TYPE_STRING);
      cell.setEncoding(HSSFCell.ENCODING_UTF_16);
      cell.setCellValue(colunData.get(j).toString());
     }
    }
   }
  }
  return workbook;
 }

/**
   * 将Workbook写入到InputStream
   * 
   * @param workbook    HSSFWorkbook
   * @param fileName  String 文件名
   * 
   * */
 private void workbook2InputStream(HSSFWorkbook workbook, String fileName) throws Exception {
    this.setFileName(URLEncoder.encode(fileName,"UTF-8"));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    workbook.write(baos);
    baos.flush();
    byte[] aa = baos.toByteArray();
    excelStream = new ByteArrayInputStream(aa, 0, aa.length)
    baos.close();
 }

public void setFileName(String fileName) throws UnsupportedEncodingException{
        HttpServletRequest request = ServletActionContext.getRequest(); 
        String agent = request.getHeader("User-Agent");  
        if(null != agent){
            agent = agent.toLowerCase();
            if (agent.indexOf("firefox") != -1) {  
                this.fileName = new String(URLDecoder.decode(fileName,"UTF-8").getBytes(),"iso-8859-1");  
            }else {  
                this.fileName = fileName;
            }  
        }
    }

http://www.cnblogs.com/jzzlo/archive/2013/03/08/struts2.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值