先从数据库查询出数据 保存到list然后写入excel这样的做法 很慢 很卡 很天真

解决方案 »

  1.   

    1 Excel最大允许6万条,所以你的10万条是不现实的,必须得分Sheet
    2 先读取,再写入,从OO的角度讲,一点问题没有,但从实际应用的角度讲,你至少可以
     a) 将输出流直接发给数据库导出层,其直接写出
     b) 数据库层将数据另村为一个临时文件,导出层再操作这个文件好了(InputStrem 到 OutputStream)
      

  2.   

    分多个sheet来做,我做过导出13万数据的,经过测试 excel 2003 每张sheet的极限在2万条数据左右,超过2万条,excel出来是坏的文件。
      

  3.   


    大侠按你的说法 可以间接的让数据库区导出 我连excle模板都不用读取了  怎么可以做到 具体代码 
    俺是菜菜  而且现在项目要的很急 
      

  4.   


    怎么使用 你不会是要我去教 客户 从数据库导出excel吧
      

  5.   

    分批处理,一次10000条保存一次,建议多sheet操作,每个sheet的记录数最多65535,所以建议多建sheet。
      

  6.   

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Date;import jxl.Workbook;
    import jxl.format.Colour;
    import jxl.format.UnderlineStyle;
    import jxl.write.Label;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    import jxl.write.biff.RowsExceededException;
    public class bakup_bat {
    private String file=null;
    private String username="";
    private String password="";
    private String database="";
    private int r=0;
    private String url = "jdbc:oracle:thin:@skt00146.ebs.jcb.co.jp:1571:";
    public bakup_bat(String username,String password,String database,String file){ this.username=username;
    this.password=password;
    this.database=database;
    this.file = file;
    run();
    } public void run(){
    try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection(url+database,username,password);
    Statement stmt=conn.createStatement(); 

    Date date=new Date();
    WritableWorkbook book  =  Workbook.createWorkbook( new  File(file.substring(0,file.indexOf("."))+""+date.getTime()+".xls"));
    WritableSheet sheet  =  book.createSheet("lsgBackupDB" ,  0 ); FileReader  in = new FileReader (file);
    BufferedReader inLine = new BufferedReader(in);
    String line = inLine.readLine();
    while(line!=null){
    ResultSet rs = stmt.executeQuery(line.trim());
    ResultSetMetaData meta;

    Label label;
    WritableFont fonthead;
    WritableCellFormat formathead;
    WritableFont fontsql;
    WritableCellFormat formatsql;
    meta  =   rs.getMetaData(); 
    fonthead = new  WritableFont(WritableFont.TIMES, 10 ,WritableFont.NO_BOLD);
    formathead = new  WritableCellFormat(fonthead);
    formathead.setBackground(Colour.GREY_25_PERCENT);
    fontsql = new  WritableFont(WritableFont.TIMES, 12 ,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLUE);
    formatsql = new  WritableCellFormat(fontsql);
    formatsql.setBackground(Colour.YELLOW);

    label=new Label(0,r++,line.trim(),formatsql);
    sheet.addCell(label);
    int  columnCount   =   meta.getColumnCount( ); 
    for(int k=0;k<columnCount;k++){
    label=new Label(k,r,meta.getColumnName(k+1),formathead);
    sheet.addCell(label);
    }
    r++;
    while(rs.next()){
    for(int j=0;j<columnCount;j++){
    if(rs.getString(j+1)==null){
    label=new Label(j,r,"");
    sheet.addCell(label);
    }else{
    label=new Label(j,r,rs.getString(j+1));
    sheet.addCell(label);
    }
    }
    r++;
    }
    r++; line = inLine.readLine();
    }
    inLine.close();
    in.close();
    book.write();   
        book.close();   
        stmt.close();
        conn.close();

    } catch (IOException e) {
    e.printStackTrace();
    } catch (RowsExceededException e) {
    e.printStackTrace();
    } catch (WriteException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    }
    public static void main(String[] args) { new bakup_bat(args[0],args[1],args[2],args[3]);
    }}
      

  7.   

    最后一个参数是文件名,文件存放select语句,一个select一行,例如:select * from dual where rownum >0 and rounum < 30000
    selecdt  * from dual where rownum >30000 and rounum < 60000
    selecdt  * from dual where rownum >60000 and rounum < 90000
      

  8.   

    导出文件为 cvs 格式, 直接用excel打开. 简单的文本流写入.
      

  9.   

    要导出你那么多的数据没有问题第一:先看你喝数据库连接方式了
           hibernate做起来存在缓存问题,我做的时候没解决掉,所以值成功导出了6W左右的数据
           JDBC,JNDI都可以了··不存在缓存问题。我是用POI进行导出,可能会比JExcel会慢一些,但是分Sheets导出没有问题,10W更多的我也导出过。你想导出多少更多在于你的JVM,和样式的控制上,如果不存在样式的控制,建议导出csv的格式,实际上都是Excel而且会比POI导出要快。关键在于你的代码上的控制··控制号了··就能导出··我当时导出了14个列的数据每次6W10秒多,虽然慢了些··对于POI来说不错了··你的那些数据也是OK的。
    还有我告诉你一下理论上Excel最多可存放32个页吧,每页6。5W条就是说100W数据页ok,但是想实现是不可能的···所以呢··你的10W没有问题的·
      

  10.   

    使用文件流写入Excel, 不要使用OLE写入!
      

  11.   


    导出CSV格式 怎么导出 我之前是用流导出的 没用POI  能给具体小例子吗 说了小弟还在练剑法阶段 大哥给个小例子先 我邮箱[email protected]