如何使用Ajax请求创建和下载Excel文件

时间:2016-01-27 07:57:06

标签: java jquery ajax struts2

如果用户在我的网页上按下了一个公式按钮,我想创建一个Excel文件。我的第一个解决方案很好。用户按下按钮,服务器端java代码创建文件,执行java代码后,webbrowser打开一个对话框,询问用户是否显示或保存excel文件。

但我得到了客户的一些新要求。如果用户按下了公式按钮,则必须在执行服务器端java代码时显示动画gif图像,并且如果服务器端java代码已完成,则必须立即消除动画gif的消失。

这是Struts2提交按钮,如果按下按钮,它会启动HTTP请求:

<s:submit value="show Data" onclick="myJsFunction(); return false;" />

这是客户端代码,它创建HTTP请求并将其发送到我的Struts2 Actionclass:

function myJsFunction(){
     $.ajax({
              type: "POST",
              dataType: 'binary',
              url: "myActionClass.action",
              data: {//some necessary input values},                         
              success: function(data){                                   
                          console.log(data);
                          // js code to disappeared the animated gif image                          
                       }
      });               
 }

这是创建二进制代码的Java代码:

private void returnExcelFileAsStream(final String filename) throws IOException {
    final InputStream is = new FileInputStream(filename);
    OutputStream os = null;
    try {
        response.setContentType("application/pdf");         
        response.setHeader("Cache-Control", "maxage=3600");
        response.setHeader("Pragma", "public");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");         
        os = response.getOutputStream();
        int len;
        byte buf[] = new byte[1024];
        while ((len = is.read(buf)) > 0) {
            os.write(buf, 0, len);
        }
        is.close();
        os.close();
     }
     catch(Exception e){
         // some exeception handling
     }
}

这是Struts2执行方法,它调用方法returnExcelFileAsStream。

public String execute(){

    // some Java code
    returnExcelFileAsStream("MyExcelFile.xlsx")

    return null;
}

这是我的struts.xml文件:

<action name="myActionClass" class="myPackage.myActionClass">
        <result name="input" type="redirectAction">/WEB-INF/base/jsp/myJspPage.jsp</result>
</action>

现在有一个问题,即webbrowser没有打开用户对话框,要求用户显示或保存文件。使用firebug,我在HTTP响应中看到一些加密字符。我怎么解决这个问题?

2 个答案:

答案 0 :(得分:0)

我是这样做的。

动作:

public String export() throws Exception {

HttpServletResponse response = ServletActionContext.getResponse();

List<FrontProjectList> dataList = projectApplyBaseService

.query_ProjectApply3(pqc, 0, projectApplyBaseService

.count_queryTotalProject_consumption(pqc) + 1);

HSSFWorkbook workbook = exportExcel(dataList);

ByteArrayOutputStream output = new ByteArrayOutputStream();

workbook.write(output);

byte[] ba = output.toByteArray();

excelFile = new ByteArrayInputStream(ba);

output.flush();

output.close();

return "excel";
}

struts.xml中

            <param name="contentType">application/vnd.ms-excel</param>  

            <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>  

            <param name="bufferSize">1024</param>

            <param name="inputName">excelFile</param>  

        </result>  

答案 1 :(得分:0)

我没有在您的JavaScript成功函数中看到任何操作来触发浏览器浏览新创建的Excel文件。我很抱歉,如果你在文中说到这一点但是我错过了,但我通常会这样做:

  • 我的服务器端将新的XLS或CSV文件创建到一个位置(文件夹,如/ files)中,其中只存在临时的Excel或CSV文件。我的服务器端功能只返回新创建的文件的名称
  • 关于ajax的成功方法,我只需执行以下命令:

    document.location ='files / [新生成的文件名] .xls';

然后浏览器重定向到该文件,它会显示它或要求用户下载

最后,服务器端作业会从1天或更早的文件中清除此文件夹

我希望这会有所帮助