GWT下载Excel .xlsx给我一个损坏的文件

时间:2016-10-19 11:04:43

标签: java excel gwt download

在我的团队工作中我正在研究GWT应用程序,该应用程序为公司的每个团队提供了他们必须做的事情的概述。 该程序正在运行,但现在我们希望您可以下载的Excel表格是* .xlsx而不是xls 整个项目对我来说都是新的,我认为自己是GWT的初学者。

在代码中为Exceltable提供文件名时,有一个+" .xls"在末尾。但是当我把它改成+" .xlsx"并测试应用程序下载仍然有效,但当我尝试在Excel中打开文件时,它向我显示一条错误消息并告诉我该文件已损坏?! (.xls有效)

您能否向我解释一下如何使用serverSite生成的Excel在GWT中进行下载? 也许你有一些想法导致文件被破坏的原因 (可悲的是,这个应用程序的程序员在假期,所以我不能问他......)

提前致谢

编辑:

public class Download extends HttpServlet {

    private static final long serialVersionUID = 5580666921970339383L;

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String filename = (String)request.getSession().getAttribute(CrossReportConstants.ATTR_FILENAME);
        byte[] data = (byte[])request.getSession().getAttribute(CrossReportConstants.ATTR_REPORT);
        request.getSession().setAttribute(CrossReportConstants.ATTR_FILENAME, null);
        request.getSession().setAttribute(CrossReportConstants.ATTR_REPORT, null);

        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setContentLength(data.length);

        try {
            InputStream in = new ByteArrayInputStream(data);
            ServletOutputStream out = response.getOutputStream();

            byte[] outputByte = new byte[4096];
            // copy binary contect to output stream
            while (in.read(outputByte, 0, 4096) != -1) {
                out.write(outputByte, 0, 4096);
            }
            in.close();
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

1 个答案:

答案 0 :(得分:0)

现在,当您提供代码时,您可以轻松回答问题:

显示的代码定义了HttpServlet。在项目的某个地方有一个名为web.xml的文件。在此文件中,您显示的类被映射到url模式,因此您的服务器知道此servlet应该处理特定的URL。

您显示的servlet首先从会话中提取文件名和文件内容。另外准备http响应并写出文件内容。现在,您只需要将响应的内容类型替换为xlsx的内容类型。

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

处理http响应的浏览器现在将下载识别为.xlsx文件。正如您所注意到的,文件扩展名在此步骤中并不重要。

当servlet的原始程序员从他的假期回来时,您应该/可以建议他使用response.sendError()(使用适当的http状态代码)而不是e.printStackTrace()。然后,servlet的用户可以更好地理解某些东西是否有效以及谁应该受到责备。