3

我无法将响应从 servlet 导出到 excel 文件。请看下面的代码:

测试.java:

 @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html");
out = response.getWriter();
out.print("<form name=\"test\" method=\"post\" action=\"Export\">");
out.print("<table border=\"1\" cellpadding=\"3\" bordercolor='black'");
out.print("<tr>");
out.print("<td>1</td>");
out.print("<td>hello how are you?</td>");
out.print("</tr>");
out.print("</table>");
out.print("<td><input type=\"submit\" name =\"submit1\" value=\"Export To Excel\"></td>");
out.print("</form>");

单击提交按钮时会生成一个不包含任何值的 Excel 表。查看Export.java单击提交按钮时调用的内容。

导出.java

public class Export extends HttpServlet {

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    String submit1 = request.getParameter("submit1");
   if (submit1 != null) {
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=users.xls");
    }
}
}

此外,据观察,如果我在 中编写以下代码Test.java,它的工作正常并且 excel 表确实包含表格值。

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=users.xls");

单击提交按钮时,有什么方法可以将输出转发Export.java到。Test.java

4

2 回答 2

6

最后,我找到了解决方案!我把所有的out.print()东西都存储到一个StringBuffer. 然后使用getServletContext().setAttribute("test", Buffer);我将整个内容转发到另一个 servlet,并从另一个 servlet 中使用StringBuffer data = (StringBuffer) getServletContext().getAttribute("test");.

最后,

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=sample.xls");
response.getWriter().write(data.toString());`

做了这项工作。

于 2013-04-25T07:38:52.633 回答
1

您必须在打印响应之前调用 setContentType。您不能打印您的 HTML 表,然后让用户单击一个按钮,将他们带到一个完全不同的 servlet,除了将 setContentType 设置为 Excel 并期望它以某种方式记住您的 HTML 表之外什么都不做。您还应该真正考虑获取 Java 的 Excel 库(例如 Apache POI)并使用 application/msexcel 而不是依赖 application/vnd.ms-excel 将 HTML 转换为 Excel,如果该项目旨在具有任何真实世界用处。

于 2013-04-24T23:00:42.990 回答