我正在开发一个 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/