struts2+poi 导出Excel文件

来源:互联网 发布:地图数据采集员兼职 编辑:程序博客网 时间:2024/04/26 09:25
<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 0