使用的得到response的getOutputStream流输出的,我在页面选在一个用户,根据用户的ID,到数据库里查询,该用户的信息
,导出一个用户的excel文件,是可以,但是当我选择多个用户时就不可以导出多个了,还是导出的一个excle文件,求帮助部分代码
   action代码
    public String weeklyReportsExportXLS()
{
try 
{
queryWeeklyReport();
if (null==reportOid || reportOid.size()<0) 
{
this.addFieldError("weeklyReport.checked.least", this.getText("weeklyReport.checked.least"));
return ERROR;
}
if ( reportOid.size()>1) 
{
this.addFieldError("weeklyReport.checked.only", this.getText("weeklyReport.checked.only"));
return ERROR;
}
HttpServletResponse response=ServletActionContext.getResponse();  
response.setCharacterEncoding("UTF-8");  
response.setContentType("application/vnd.ms-excel");  
ServletOutputStream output = response.getOutputStream();
for (int i = 0; i < reportOid.size(); i++)
{
weeklyReport=weeklyReportService.getWeeklyReport(reportOid.get(i));
response.setHeader("Content-Disposition", "attachment;filename="+new String(weeklyReport.getReportName().getBytes(),"ISO8859-1")+".xls"); 
List<String> weeklyReportHeaderTitle=new ArrayList<String>();
weeklyReportHeaderTitle.add(this.getText("label.weeklyReport.reportName"));
weeklyReportHeaderTitle.add(this.getText("label.weeklyReport.fromDate"));
weeklyReportHeaderTitle.add(this.getText("label.weeklyReport.toDate"));
List<String> weeklyReportBodyTitle=new ArrayList<String>();
weeklyReportBodyTitle.add(this.getText("label.weeklyReport.number"));
weeklyReportBodyTitle.add(this.getText("label.weeklyReport.workDate"));
weeklyReportBodyTitle.add(this.getText("label.weeklyReport.subject"));
weeklyReportBodyTitle.add(this.getText("label.weeklyReport.contents"));
weeklyReportBodyTitle.add(this.getText("label.weeklyReport.duration"));
getXLS(output, weeklyReportHeaderTitle, weeklyReportBodyTitle, weeklyReport);
output.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}   生成excel文件:
     public void getXLS(OutputStream out ,List<String> headerTitle,List<String> bodyTitle,WeeklyReportHolder weeklyReport)
{
Label label;
WritableWorkbook workBook=null;

try 
{
workBook=Workbook.createWorkbook(out);
WritableSheet sheet = workBook.createSheet("sheet",0);
for (int i = 0; i < headerTitle.size(); i++) 
{
label=new Label(0, i, headerTitle.get(i)+":");
log.info(headerTitle.get(i));
sheet.setRowView(i, 350);
sheet.setColumnView(0,15);
sheet.addCell(label);
switch (i) {
case 0:
label=new Label(1, i, weeklyReport.getReportName());
sheet.setRowView(i, 350);
sheet.setColumnView(1,15);
sheet.addCell(label);
break;
case 1:
label=new Label(1, i, weeklyReport.getFromDate());
sheet.setRowView(i, 350);
sheet.setColumnView(1,15);
sheet.addCell(label);
break;
case 2:
label=new Label(1, i, weeklyReport.getEndDate());
sheet.setRowView(i, 350);
sheet.setColumnView(1,15);
sheet.addCell(label);
break;
}
}
List<WeeklyReportEntityHolder> weeklyReportEntityList=weeklyReport.getWeeklyReportEntitys();
if (!weeklyReportEntityList.isEmpty())
{
for (int i = 0; i < bodyTitle.size(); i++) 
{
label=new Label(i, 5, bodyTitle.get(i));
log.info(bodyTitle.get(i));
sheet.setRowView(5, 350);
sheet.setColumnView(i,15);
sheet.addCell(label);
}
int i=bodyTitle.size()+1;
for (int j = 0; j < weeklyReportEntityList.size(); i++,j++)
{
label=new Label(0,i, j+1+"");
sheet.addCell(label);
label=new Label(1, i, weeklyReportEntityList.get(j).getWorkDate());
sheet.addCell(label);
label=new Label(2, i, weeklyReportEntityList.get(j).getSubjectName());
sheet.addCell(label);
label=new Label(3, i, weeklyReportEntityList.get(j).getContents());
sheet.setRowView(i, 400);
sheet.setColumnView(3,40);
sheet.addCell(label);
label=new Label(4,i, weeklyReportEntityList.get(j).getDuration()+"");
sheet.addCell(label);
}
}
workBook.write();
workBook.close();
out.flush();
out.close(); }
catch (Exception e)
{
e.printStackTrace();
}
}

解决方案 »

  1.   

    ServletOutputStream   output   =   response.getOutputStream();放到循环里面。你第一次循环之后output就close了,再次执行抛出异常,所以只有一个文件。你查看文件内容应该只是第一次循环的内容吧,i=1以后的数据是不是没有?
      

  2.   

    ServletOutputStream output = response.getOutputStream();放在循环里面也是一个文件,我试过没用?不知道怎么回事
      

  3.   

    没用ServletOutputStream output = response.getOutputStream();放在f循环里面也没用,还是一个文件