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

标签 java excel gwt download

我正在开发一个 GWT 应用程序,该应用程序可以让公司的每个团队了解他们必须做什么。 该程序正在运行,但现在我们希望您可以下载的 Excel 表格是 .xlsx 而不是 .xls。 整个项目对我来说是新的,我认为自己是 GWT 的初学者。

在代码中,当给出 Excel 表格的文件名时,末尾有一个 +".xls"。当我将其更改为 +".xlsx" 并测试应用程序时,下载仍然有效。但是,当我尝试在 Excel 中打开该文件时,它会显示一条错误消息并告诉我该文件已损坏。 (.xls 有效)

您能向我解释一下 GWT 中如何使用 serverSite 生成的 Excel 进行下载吗? 也许您对导致文件损坏的原因有一些想法 (遗憾的是这个应用程序的程序员正在度假,所以我不能问他)

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();
        }

    }
    
}

最佳答案

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

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

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

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

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

当 servlet 的原始程序员从假期回来时,您应该/可以建议他使用 response.sendError() (带有适当的 http 状态代码)而不是 e.printStackTrace()。这样 servlet 的用户就可以更好地了解是否出现问题以及应该归咎于谁。

关于java - GWT 下载 Excel .xlsx 给我一个损坏的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40129651/

相关文章:

java - 关于使用 java 操作 excel 工作表

gwt - 在 IntelliJ 上编译 GWT 模块

vba - 在监 window 口中检查字典项目后,字典中填充了一个空项目

GWT - 如何添加一个简单的组合框

java - GWT Image path capture using FileUpload 然后将图像存储为MySQL中的Blob

java - 使用 Java 帮助现实世界的 TDD

java - 升级 android studio 破坏了我的 flutter build (macOS)

java - 在Java中通过JFrame显示图像后打开终端窗口

java - 如何防止 Play 框架中同一帐户多次登录?

python - 如何在 Python 中打开 Excel 文件?