导出代码:private void exportSummarydataDetailAction(String companyid,int basenumber,HttpServletRequest request,HttpServletResponse response)throws ApplicationException{
//组织日期信息
boolean sign = request.getParameter("flag1") != null ? true : false ;
String monthstr = sign ? request.getParameter("monthid1") : request.getParameter("monthid2");
String flag = sign ? request.getParameter("flag1") : request.getParameter("flag2");

// String monthstr1 = request.getParameter("monthid1");
// String monthstr2 = request.getParameter("monthid2");
// String flag1 = request.getParameter("flag1");
// String flag2 = request.getParameter("flag2");
// String monthstr = monthstr1!=null?monthstr1:monthstr2;
// String flag = flag1!=null?flag1:flag2;

NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMinimumIntegerDigits(2);
formatter.setGroupingUsed(false);
Calendar calendar = Calendar.getInstance(Locale.CHINESE);
int intMonth =calendar.get(Calendar.MONTH)+1;//当前月
int intYear =calendar.get(Calendar.YEAR);//当前年
//公司名称
String companyName = this.queryMenuService.getMontherCompanyName(companyid);
//下载文件名
String fileName = "";
if (!"1".equals(flag)) {
fileName = companyName+"_"+monthstr+"_office_billing.xls";
}else {
fileName = companyName+"_"+monthstr+"_billing.xls";
}
File file = new File(fileName);
//创建excel
WritableWorkbook book;
List<String> monthList = new ArrayList<String>(); try {
book = Workbook.createWorkbook(file);
if ("1".equals(flag)) {
//第一sheet页:创建2014年汇总sheet页面
monthList = this.createExcelSeet1(book, intYear, intMonth, companyid, basenumber);
//第二sheet页:创建本年度各月按指令汇总sheet页面
    this.createExcelSeet2(book, intYear, intMonth, companyid, basenumber,monthList);
//第三sheet页:创建当月按日汇总sheet页面
    this.createExcelSeet3(book, intYear, intMonth, companyid, basenumber,monthstr);
}      
  //第四sheet页:创建office明细sheet页面
    this.createExcelSeet4(book,companyid, basenumber,monthstr);
book.write();
book.close();
// 设置输出的格式
response.reset();
// added by zzy
String postFix = fileName.substring(fileName.lastIndexOf(".") + 1);
if (postFix.equalsIgnoreCase("xls")){
response.setContentType("application/xls");
}
//根据浏览器设置下载文件名的编码
if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox")>0){
fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
}else if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){
fileName = URLEncoder.encode(fileName, "UTF-8"); 
}else{
fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
}
  
//设置下载文件头
response.addHeader("Content-Disposition", "attachment; filename=\""
+ fileName + "\"");
//response.setContentLength((int)file.length());
response.setHeader("Connection", "close");
byte[] buffer = new byte[4096];
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream outWrite = new BufferedOutputStream(response.getOutputStream());
int n = -1;
    //遍历,开始下载
    while ((n = input.read(buffer, 0, 4096)) > -1) {
     outWrite.write(buffer, 0, n);
    }
    outWrite.flush();   //不可少
    response.flushBuffer();//不可少
    if (input != null){
        input.close();
    }
   if (outWrite != null){
   outWrite.close();
   }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

解决方案 »

  1.   

    这种情况就算调大内存,估计还是会出现内存溢出,看看是不是哪边内存泄漏
    用工具看看,比如memory-analyzer
      

  2.   

    控制下下载按钮,只有在完成下载之后才能再去点击下载按钮。 比如添加dialog 提示【正在下载请等待】这种情况跟你的代码应该没什么关系,属于错误操作导致的。
      

  3.   

    但是form没有返回值啊,怎么知道已经导出完成?
      

  4.   

    你这个多次下载是指:
    1、第一次下载正常、第二次下载正常……然后第n次下载包内存溢出?
    2、第一次没有下载完就又开始点击下载?
    如果是第一种情况,那还得去检查代码
    如果是第二种情况,在前台可以选择用ajax的方式请求下载,这样就可以做一个遮盖层或者把按钮置灰,等下载完成再去掉遮盖层或者恢复按钮,这样界面也友好,否则用户不知道什么时候下载完
      

  5.   

    你这个多次下载是指:
    1、第一次下载正常、第二次下载正常……然后第n次下载包内存溢出?
    2、第一次没有下载完就又开始点击下载?
    如果是第一种情况,那还得去检查代码
    如果是第二种情况,在前台可以选择用ajax的方式请求下载,这样就可以做一个遮盖层或者把按钮置灰,等下载完成再去掉遮盖层或者恢复按钮,这样界面也友好,否则用户不知道什么时候下载完但是不想改变提交方式,请问大神怎么才能知道下载完成这个状态