在我的团队工作中我正在研究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();
}
}
}
答案 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的用户可以更好地理解某些东西是否有效以及谁应该受到责备。