2013-04-24 71 views
1

我無法將響應從servlet導出到excel文件。請參考下面的代碼:Servlet - 導出對Excel文件的響應

Test.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

Export.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點擊提交按鈕時。

+0

爲什麼你只是不聲明Test.java的兩個響應行? – commit 2013-04-24 14:10:07

+0

但這不符合我的目的:(!沒有其他方式? – sree127 2013-04-24 15:02:12

回答

1

您必須在打印響應之前調用setContentType。你不能打印你的HTML表格,然後讓用戶點擊一個按鈕,將它們帶到一個完全不同的servlet,它只會將setContentType設置爲Excel,並期望以某種方式記住你的HTML表格。如果這個項目的目的是要有任何真實世界,你也應該真正考慮獲得一個用於Java的Excel庫(例如Apache POI)和使用application/msexcel而不是依賴application/vnd.ms-excel來將HTML轉換爲Excel用處。

4

最後,我找到了解決方案!我將所有的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());` 

做的工作。