Apache POI Servlet Sheet 已经存在
Apache POI Servlet Sheet Already Exists
我正在使用 Apache POI 从我的 servlet 下载“.xls”,文件名是 "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 ...>
}
}}
省略了一些代码。
我想知道为什么它会尝试覆盖现有文件,或者是否有办法每次都为工作簿创建一个新名称。
我怀疑这可能与我在方法外声明工作簿有关。
如果能帮助理解正在发生的事情,我们将不胜感激。
您在 servlet 级别保留一个工作簿,并尝试在每次请求时添加一个新的 sheet。您应该在每次请求时创建一个新工作簿:
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 ...>
}
我正在使用 Apache POI 从我的 servlet 下载“.xls”,文件名是 "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 ...>
}
}}
省略了一些代码。
我想知道为什么它会尝试覆盖现有文件,或者是否有办法每次都为工作簿创建一个新名称。
我怀疑这可能与我在方法外声明工作簿有关。
如果能帮助理解正在发生的事情,我们将不胜感激。
您在 servlet 级别保留一个工作簿,并尝试在每次请求时添加一个新的 sheet。您应该在每次请求时创建一个新工作簿:
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 ...>
}