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

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

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

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

 

这是客户端代码,它创建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文件:

  /WEB-INF/base/jsp/myJspPage.jsp  

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

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

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

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

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

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

我希望这有帮助

我是这样做的。

行动:

 public String export() throws Exception { HttpServletResponse response = ServletActionContext.getResponse(); List 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

  application/vnd.ms-excel attachment;filename="${downloadFileName}" 1024 excelFile