3万-10万数据导出excel

twinsshehp 2009-09-21 01:15:08
先从数据库查询出数据 保存到list然后写入excel这样的做法 很慢 很卡 很天真
...全文
631 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lorraine8 2011-09-14
  • 打赏
  • 举报
回复
求详解!!!!


[Quote=引用 1 楼 daisycool 的回复:]
分页每次读1000条写入,很快,很顺,很成熟
[/Quote]
twinsshehp 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 sqz10200 的回复:]
要导出你那么多的数据没有问题

第一:先看你喝数据库连接方式了
      hibernate做起来存在缓存问题,我做的时候没解决掉,所以值成功导出了6W左右的数据
      JDBC,JNDI都可以了··不存在缓存问题。

我是用POI进行导出,可能会比JExcel会慢一些,但是分Sheets导出没有问题,10W更多的我也导出过。

你想导出多少更多在于你的JVM,和样式的控制上,

如果不存在样式的控制,建议导出csv的格式,实际上都是Excel

而且会比POI导出要快。

关键在于你的代码上的控制··控制号了··就能导出··我当时导出了14个列的数据每次6W

10秒多,虽然慢了些··对于POI来说不错了··

你的那些数据也是OK的。


还有我告诉你一下理论上Excel最多可存放32个页吧,每页6。5W条

就是说100W数据页ok,但是想实现是不可能的···所以呢··你的10W没有问题的·
[/Quote]

导出CSV格式 怎么导出 我之前是用流导出的 没用POI 能给具体小例子吗 说了小弟还在练剑法阶段 大哥给个小例子先 我邮箱735062915@qq.com
ajixiea 2009-10-06
  • 打赏
  • 举报
回复
使用文件流写入Excel, 不要使用OLE写入!
sqz10200 2009-10-05
  • 打赏
  • 举报
回复
要导出你那么多的数据没有问题

第一:先看你喝数据库连接方式了
hibernate做起来存在缓存问题,我做的时候没解决掉,所以值成功导出了6W左右的数据
JDBC,JNDI都可以了··不存在缓存问题。

我是用POI进行导出,可能会比JExcel会慢一些,但是分Sheets导出没有问题,10W更多的我也导出过。

你想导出多少更多在于你的JVM,和样式的控制上,

如果不存在样式的控制,建议导出csv的格式,实际上都是Excel

而且会比POI导出要快。

关键在于你的代码上的控制··控制号了··就能导出··我当时导出了14个列的数据每次6W

10秒多,虽然慢了些··对于POI来说不错了··

你的那些数据也是OK的。


还有我告诉你一下理论上Excel最多可存放32个页吧,每页6。5W条

就是说100W数据页ok,但是想实现是不可能的···所以呢··你的10W没有问题的·
amdgaming 2009-10-05
  • 打赏
  • 举报
回复
代码的好坏 决定 你 导出质量啊。
xiaozhangnima 2009-10-05
  • 打赏
  • 举报
回复
学习
twinsshehp 2009-10-05
  • 打赏
  • 举报
回复
怎么导出 我要具体代码 小弟还在练剑法的阶段 还没达到练意境的境界 楼上的大哥 行行好
liulee 2009-09-29
  • 打赏
  • 举报
回复
导出文件为 cvs 格式, 直接用excel打开. 简单的文本流写入.
twinsshehp 2009-09-29
  • 打赏
  • 举报
回复
up
铁匠梁 2009-09-24
  • 打赏
  • 举报
回复
分批处理,一次10000条保存一次,建议多sheet操作,每个sheet的记录数最多65535,所以建议多建sheet。
urbutifl 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 twinsshehp 的回复:]
引用 1 楼 daisycool 的回复:
分页每次读1000条写入,很快,很顺,很成熟


大哥 别个就是要看这么多数据 要能分页 我会这么痛苦 你很幽默
[/Quote]

为什么不能分页?
twinsshehp 2009-09-24
  • 打赏
  • 举报
回复
up
lishigui 2009-09-24
  • 打赏
  • 举报
回复
最后一个参数是文件名,文件存放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
lishigui 2009-09-24
  • 打赏
  • 举报
回复
上面代码希望对你有用
lishigui 2009-09-24
  • 打赏
  • 举报
回复
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]);
}

}
twinsshehp 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sunnylyy 的回复:]
几万条估计大约要一分钟吧,可以友好一点做个进度条.

实现不行考虑使用下数据库本身提供的导出文件机制吧,也许能快点
[/Quote]

怎么使用 你不会是要我去教 客户 从数据库导出excel吧
sunnylyy 2009-09-21
  • 打赏
  • 举报
回复
几万条估计大约要一分钟吧,可以友好一点做个进度条.

实现不行考虑使用下数据库本身提供的导出文件机制吧,也许能快点
twinsshehp 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sunnylyy 的回复:]
引用 7 楼 twinsshehp 的回复:
引用 1 楼 daisycool 的回复:
分页每次读1000条写入,很快,很顺,很成熟


大哥 别个就是要看这么多数据 要能分页 我会这么痛苦 你很幽默


不是让你搞分页处理,是让你每次从结果集里面取出1000条放到内存中,然后追加到文件中去,如此循环直到结果集为空。还明白?
[/Quote]

基本没什么用 依然这么慢 这么卡
sunnylyy 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 twinsshehp 的回复:]
引用 1 楼 daisycool 的回复:
分页每次读1000条写入,很快,很顺,很成熟


大哥 别个就是要看这么多数据 要能分页 我会这么痛苦 你很幽默
[/Quote]

不是让你搞分页处理,是让你每次从结果集里面取出1000条放到内存中,然后追加到文件中去,如此循环直到结果集为空。还明白?
twinsshehp 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 java2000_net 的回复:]
1 Excel最大允许6万条,所以你的10万条是不现实的,必须得分Sheet
2 先读取,再写入,从OO的角度讲,一点问题没有,但从实际应用的角度讲,你至少可以
a) 将输出流直接发给数据库导出层,其直接写出
b) 数据库层将数据另村为一个临时文件,导出层再操作这个文件好了(InputStrem 到 OutputStream)

[/Quote]

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

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧