问一个关于EXCEL报表导出的问题(无法读取):

    我的思路是这样的,首先调用生成EXCEL报表的方法,生成EXCEL表。接着调用下载的页面去下载该表。但是出现的问题是,有时候程序会在还未完全写完EXCEL表的时候,就去调用了此表。导致的结果是:EXCEL表错误,无法读取该表。
    后面只能用来折衷的方法Thread.sleep()。。只有把它设到2秒以上才能完全不出现问题。但此方法无故浪费了2秒时间,不爽啊    希望朋友们能告诉我好的方法,在此谢谢大家了。    附上代码:
try{
     //调用生成EXCEL报表的方法
     rcmdSgs.creatExcel(Stmt, PubDb, filePath, year, month, OrderBy );
}catch(Exception ex){
     out.println( "<font color=red>出错:" + ex + "/font>" );
} //停止2秒
try{
Thread.sleep(2000);
}catch(InterruptedException e){} //调用下载页面下载该EXCEL表
response.sendRedirect("download.jsp?filename=Qyrcmd("+ year + month +").xls");

解决方案 »

  1.   

    还需要生成文件后再下载吗?用POI生成EXCEL文件后直接通过RESPONSE在浏览器端输出!
      

  2.   

    明白你的意思,也许我应该用
    response.setHeader("Content-disposition",  "attachment;  filename=file.xls");
    response.setContentType("application/vnd.ms-excel");
      

  3.   

    对,有段在TOMCAT下调试通过的代码,用的是JAKATA的POI,可能会比JASPER好点,通过文件流或JSP都可以输出:
    <%@ page import=" org.apache.poi.hssf.usermodel.HSSFCell"%>
    <%@ page import="org.apache.poi.hssf.usermodel.HSSFCellStyle"%>
    <%@ page import="org.apache.poi.hssf.usermodel.HSSFDataFormat"%>
    <%@ page import="org.apache.poi.hssf.usermodel.HSSFFont"%>
    <%@ page import="org.apache.poi.hssf.usermodel.HSSFRow"%>
    <%@ page import="org.apache.poi.hssf.usermodel.HSSFSheet"%>
    <%@ page import="org.apache.poi.hssf.usermodel.HSSFWorkbook"%>
    <%@ page import="org.apache.poi.hssf.util.HSSFColor"%>
    <%@ page import="java.io.*,java.util.*"%>
    <%
    response.setContentType("Application/msexcel");
    response.setHeader("Content-disposition","attachment; filename=workbook.xls" );
    HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet("sheet1");
    HSSFRow row     = sheet.createRow((short)0);
    HSSFCell cell0   = row.createCell((short)0);
    cell0.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell0.setCellValue("一个字符串值");
    FileOutputStream fileOut = new FileOutputStream("sample.xls");
    wb.write(fileOut);
    fileOut.close();
    OutputStream outsys = response.getOutputStream();
    wb.write(outsys);
    outsys.close();
    %>
      

  4.   

    多谢szawei9196(awei)兄弟..我的问题已经解决了
    我用的是jxl..在weblogic下调试正常!
    以下是代码,给需要的朋友~<%@ page import="java.io.*;"%>
    <%@ page import="jxl.*;"%>
    <%@ page import="jxl.write.*;"%>
    <%@ page import="jxl.format.*;"%>
    <%@ page import="java.util.*;"%>
    <%@ page import="java.awt.Color;"%>
    <%
        try{
    response.reset();//如果不用这句,很可能会出现乱码!应该是response的buffer里面有别的东西吧..
    response.setHeader("Content-disposition",  "attachment; filename=file.xls");//设定输出文件头
    OutputStream  os  =  response.getOutputStream();         WritableFont  wf  =  new  WritableFont(WritableFont.TIMES,12,WritableFont.NO_BOLD,false);  
             WritableCellFormat  wcfF  =  new  WritableCellFormat(wf);  
             WritableWorkbook  wwb  =  Workbook.createWorkbook(os);
             WritableSheet  ws  =  wwb.createSheet("Test  Sheet  1",  0);
             Label  labelC  =  new  Label(0,0,"姓名",wcfF);
             ws.addCell(labelC); 
             wwb.write();
             wwb.close();
             os.close(); }catch(Exception ex){
    out.println( "<font color=red>出错:" + ex + "/font>" );

    %>