下面讲解一种通过ajax请求,然后导出Excel的方法。

struts的配置如下:

<package name="crankcall" extends="json-default" namespace="/crankcall">
  <!-- 下载导出excle -->
  <action name="exportExcel" class="....action.ExportExcelAction" method="download" >
   <result name="excel" type="stream"> 
       <!-- ISO8859-1 -->
       <param name="contentType">application/vnd.ms-excel,charset=UTF-8</param>
       <param name="contentDisposition">

                         p_w_upload;filename="${fileName}.xlsx"

       </param> 
       <param name="bufferSize">4096</param>
       <param name="inputName">excelFile</param> 
   </result>

    <result name="error" type="stream">
        <param name="contentType">text/html</param>
        <param name="inputName">excelFile</param>
   </result>

  </action>
 </package>

ExportExcelAction中的方法如下:

pubic InputStream excelFile; // 下载文件流

private String fileName; // 下载文件名称


public String download() throws Exception {

      /*

         使用POI来创建表格,datas为要导出的数据。

         WorkbookUtil为自定义的工具类

     * /
      XSSFWorkbook workbook =WorkbookUtil.createWorkBook(datas);
      if(workbook == null){
          log.info("导出数据失败");
           return ERROR ;
      }
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      workbook.write(output);
      byte[] ba = output.toByteArray();
      excelFile = new ByteArrayInputStream(ba);
      output.flush();
      output.close();
      return "excel";
}


public String getFileName() {
      String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) ;
      fileName = fileName+timestamp ;
      try {

            /**
            * 注意,编码是为GBK,就算项目中是UTF8也好。
            * 因为这里的乱码问题大多是由于操作系统的浏览器引起的,所以只有GBK才会正常。
            * */

           fileName = new String(fileName.getBytes("GBK"),"ISO8859-1") ;
      } catch (UnsupportedEncodingException e) {
           fileName = timestamp ;
      }
      return fileName;
 }


private String errHandler(){
  try {
       excelFile = new ByteArrayInputStream("导出失败".getBytes("GBK"));
  } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
  }
  return "error" ;

}

如此一来后台就准备就绪了。下面看看前台怎么做。

1,创建一个JS方法

function exportExcelByForm(fileName){
       var mform = document.getElementById('excel_export_form') ;
       if(mform){
             document.body.removeChild(mform) ;
       }
       mfrom = document.createElement("form");
       mfrom.id = "excel_export_form" ;
       mfrom.target="_blank" ;
       mfrom.method="post" ;
       mfrom.action="crankcall/export/exportExcel.action" ;
       mfrom.style.display="none" ;
 
       var fname = document.createElement("input");
       fname.type = "hidden";
       fname.name = "fileName";
       fname.value = fileName ;

       mfrom.appendChild(fname);


       //TODO 可以继续传递更多的参数或者数据到服务端
 
       document.body.appendChild(mfrom);
       mfrom.submit();
}

2,然后可以通过按钮等方式来触发该方法达到下载的作用,例如:

exportExcelByForm("XX报表");

以上的方式是通过form表单的提交打开新窗口的方式来达到下载的目的,同时窗口打开后会自动的关闭。