【问题标题】:How to create and Download Excel File by using Ajax request如何使用 Ajax 请求创建和下载 Excel 文件
【发布时间】:2016-01-27 07:57:06
【问题描述】:

如果用户在我的网页上按下公式按钮,我想创建一个 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>

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

【问题讨论】:

标签: java jquery ajax struts2


【解决方案1】:

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

  • 我的服务器端在其中仅存在临时 Excel 或 CSV 文件的位置(文件夹,如 /files)中创建新的 XLS 或 CSV 文件。我的服务器端函数只返回新创建文件的名称
  • 关于ajax的成功方法,我简单执行如下:

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

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

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

希望对你有帮助

【讨论】:

  • "然后浏览器重定向到该文件,它要么显示它,要么要求用户下载"我该如何编程,对不起,但我不知道。
  • 执行 document.location='files/new_excel_file.xls'; 片段后,浏览器会完成剩下的工作。谷歌浏览器的典型行为应该是提示下载,但安装了 MS Office 的计算机上的 Internet Explorer 可能会尝试在浏览器选项卡上显示它。您对此无能为力,您只需重定向到新创建的文件,用户就会以某种方式得到它
  • 你有什么想法吗,我如何从数据对象中获取文件名,在我的例子中这是这个方法的参数:success: function(data){}
  • 函数的数据参数可以包含你想要的值。您可以通过响应对象将文件名写入服务器端的输出,因此您的成功函数会将所有内容作为其参数写入输出。如果您需要传递多个参数,只需将它们与特殊字符组合并在 JavaScript 端拆分它们
  • "您可以通过响应对象将文件名写入服务器端的输出,因此您的成功函数会将所有内容作为参数写入输出" 可以举个例子吗?我不明白你的意思
【解决方案2】:

我就是这样做的。

行动:

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>  

【讨论】:

  • 你的 struts.xml 不完整
猜你喜欢
  • 2014-01-16
  • 2011-10-16
  • 2014-12-08
相关资源
最近更新 更多