现象:不弹出“文件下载”的提示框,后台也没报错。是我什么地方没写对吗?
代码如下:
private String createXLS(List list,HttpServletResponse response)throws Exception
{
   String flag = "";
   String path = "C:/文件备份.xls"; // Excel文件URL
   try
   {
OutputStream os = new FileOutputStream(path); // 输出的Excel文件URL
    //打开文件
    WritableWorkbook book = Workbook.createWorkbook(os);
   
    //生成名为"第一页"的工作表,参数0表示这是第一页
    WritableSheet sheet=book.createSheet("第一页",0);
       //设置字体为宋体,16号字,加粗,颜色为红色
    WritableFont font1=new WritableFont(WritableFont.createFont("宋体"),16,WritableFont.BOLD);
    font1.setColour(Colour.RED);
    WritableCellFormat format1=new WritableCellFormat(font1);
    
    WritableFont font2=new WritableFont(WritableFont.createFont("宋体"),12);
    //font2.setColour(Colour.RED);
    WritableCellFormat format2=new WritableCellFormat(font2);
    
    format1.setWrap(true);// 自动换行
    format1.setAlignment(jxl.format.Alignment.CENTRE);
    format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
    
    Receivefile im = new Receivefile();
    
    // EXCEL的第一行,设置标题
    Label labelA1 = new Label(0,0,"收号",format1);
    Label labelB1 = new Label(1,0,"单位",format1);
    Label labelC1 = new Label(2,0,"文号",format1);
    Label labelD1 = new Label(3,0,"标题",format1);
    Label labelH1 = new Label(4,0,"当前部门",format1);
    Label labelE1 = new Label(5,0,"文件类型",format1);
    Label labelF1 = new Label(6,0,"拟稿时间",format1);
    Label labelG1 = new Label(7,0,"拟稿人",format1);
    
     // 将定义好的单元格添加到工作表中
    sheet.addCell(labelA1);
    sheet.addCell(labelB1);
    sheet.addCell(labelC1);
    sheet.addCell(labelD1);
    sheet.addCell(labelE1);
    sheet.addCell(labelF1);
    sheet.addCell(labelG1);
    sheet.addCell(labelH1); for (int i = 1; i <=list.size(); i++) {
    
    im = (Receivefile) list.get(i-1);
    
    String receiveno = ComUtil.replaceNull2Space(im.getReceiveno());
    String fromdept = ComUtil.replaceNull2Space(im.getFromdept());
    String fromno = ComUtil.replaceNull2Space(im.getFromno());
    String filetitle = ComUtil.replaceNull2Space(im.getFiletitle());
    String currentdept = ComUtil.replaceNull2Space(im.getCurrentdept());
    String fileclassify = ComUtil.replaceNull2Space(im.getFileclassify());
    String drafttime =ComUtil.Date2StringYMD(im.getDrafttime()); // 拟稿时间
    String sceretlevel = ComUtil.replaceNull2Space(im.getSecretlevel());
    
    // 设置每一行的数据
    Label labelA = new Label(0,i,receiveno,format2);
    Label labelB = new Label(1,i,fromdept,format2);
    Label labelC = new Label(2,i,fromno,format2);
    Label labelD = new Label(3,i,filetitle,format2);
    Label labelE = new Label(4,i,currentdept,format2);
    Label labelF = new Label(5,i,fileclassify,format2);
    Label labelG = new Label(6,i,drafttime,format2);
    Label labelH = new Label(7,i,sceretlevel,format2);     //将定义好的单元格添加到工作表中
    sheet.addCell(labelA);
    sheet.addCell(labelB);
    sheet.addCell(labelC);
    sheet.addCell(labelD);
    sheet.addCell(labelE);
    sheet.addCell(labelF);
    sheet.addCell(labelG);
    sheet.addCell(labelH);
}
    //写入数据并关闭文件
    book.write();
    book.close();
    os.close();
    
    flag = "创建文件成功!";
    log.info("创建文件成功!");
    
   }catch(Exception e)
   {
    // 如果文件是打开的,会报"请求的操作无法在使用用户映射区域打开的文件上执行"。
   System.out.println(e);
   if(e.toString().indexOf("请求的操作无法在使用用户映射区域打开的文件上执行")>=0)
   {
   flag ="请确认收文备份文件没有打开";
   }
   else
   {
   flag="创建文件失败!";
   }
   }
   
// 得到文件名字和路径
File file = new File(path);
if (!file.exists()) {
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
out.write("<script type='text/javascript'>");
out.write("alert('文件不存在!');");
out.write("</script>");
return null;
}
// 设置响应头和下载保存的文件名
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
// 打开指定文件的流信息
response.reset();
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ new String("接转明细.xls".getBytes("gb18030"), "iso8859-1")
+ "\"");
try {
InputStream inputStream = new FileInputStream(file);
byte[] data = new byte[(int) inputStream.available()];
inputStream.read(data);
inputStream.close();
java.io.ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
data);
bis = new BufferedInputStream(byteArrayInputStream);
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
// 写出流信息
int j;
while ((j = bis.read(buff, 0, buff.length)) != -1) {
bos.write(buff, 0, j);
}
} catch (Exception e) {
e.printStackTrace();
}

   finally{
  if (bis != null)
bis.close();
log.info("12!");
if (bos != null)
bos.close();
log.info("13!");
while (file.exists()) {
file.delete();
}
    return flag;
      }
}

解决方案 »

  1.   


    response.reset(); 
    response.setContentType("application/x-msdownload"); 
    response.setHeader("Content-Disposition", "attachment; filename=\"" 
    + new String("接转明细.xls".getBytes("gb18030"), "iso8859-1") 
    + "\""); 
    这一段
    放在PrintWriter out = response.getWriter(); 前面试一下
      

  2.   

    问题找到了,我当时是用ajax做的提交,我后来改成用submit提交表单,这时就会出现提示“文件下载”的对话框了,不清楚原理,但问题暂时解决了。
    有高手能说一下吗?