Apache POI Servlet Sheet已经存在

时间:2017-10-13 13:19:26

标签: java servlets apache-poi fileoutputstream

我使用Apache POI下载" .xls"从我的servlet,文件的名称是" Download.xls"因为它是我的servlet的名称加上扩展名。

当我第一次尝试下载文件时,第二次显示错误。

java.lang.IllegalArgumentException: The workbook already contains a sheet named 'General Results'

同样,我并没有尝试重新编写以前存在的文件,而是在我使用它之后关闭了我的输出流。

代码是这样的。

public class DownloadReports extends HttpServlet {// is maped as Download is xml

        Workbook wb = new XSSFWorkbook();
<... more vars ...>
public DownloadReports(){
<... initialize vars for styles ...>
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
        String report = request.getParameter("report");

if (report== null) {
            report = "";
        }

switch (report) {
            case "Full":
                generalReport(request, response);
                break;
default:
<... Log attempt...>
}
}

protected void reporteGeneral(HttpServletRequest request, HttpServletResponse response) {
        ServletOutputStream fileOut = null;
        try {
....
Sheet fullReport = wb.createSheet("Full Report");
....
response.setContentType("application/vnd.ms-excel");
            fileOut = response.getOutputStream();
            //fileOut.
            wb.write(fileOut);
            wb.close();
            fileOut.close();
            fileOut.flush();
        } catch (Exception e) {
<... log attempt ...>
}
}}

某些代码已被忽略。

我想知道为什么它会尝试覆盖现有文件,或者每次都有办法为工作簿创建新名称。

我怀疑它可能与我在方法之外声明工作簿有关。

任何有助于理解正在发生的事情的帮助都会受到很大的影响。

1 个答案:

答案 0 :(得分:2)

您将工作簿保留在servlet级别,并尝试在每个请求中添加新工作表。您应该在每个请求中创建一个新工作簿:

        ServletOutputStream fileOut = null;
        try {
....
Workbook wb = new XSSFWorkbook();
Sheet fullReport = wb.createSheet("Full Report");
....
response.setContentType("application/vnd.ms-excel");
            fileOut = response.getOutputStream();
            //fileOut.
            wb.write(fileOut);
            wb.close();
            fileOut.close();
            fileOut.flush();
        } catch (Exception e) {
<... log attempt ...>
}