求Java poi 大数据量导出(五万行数据) 例子
答案:2 悬赏:20 手机版
解决时间 2021-03-23 16:20
- 提问者网友:龅牙恐龙妹
- 2021-03-22 22:27
求Java poi 大数据量导出(五万行数据) 例子
最佳答案
- 五星知识达人网友:鸠书
- 2021-03-22 23:01
我给你个办法,是要导出excel吗?别使用poi,使用xml来描述excel即可,就像流文件一样,多少都不会流出,给你个思路,你自己扩展,希望你能看明白。
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
try {
DataOutputStream rafs = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(new File(
"d://test.xml"))));
sb.append("");
sb.append("\n");
sb.append("");
sb.append("\n");
sb.append(" sb.append("\n");
sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
sb.append("\n");
sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
sb.append("\n");
sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sb.append("\n");
sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
sb.append("\n");
sb.append("\n");
sb.append(" \n");
sb.append(" \n");
int sheetcount = 0;
int recordcount = 20;
int currentRecord = 0;
int total = 100;
int col = 20;
sb.append("");
sb.append("\n");
sb.append("
+ "\" ss:ExpandedRowCount=\"" + total
+ "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
sb.append("\n");
for (int i = 0; i < total; i++) {
if ((currentRecord == recordcount
|| currentRecord > recordcount || currentRecord == 0)
&& i != 0) {// 一个sheet写满
currentRecord = 0;
rafs.write(sb.toString().getBytes());
sb.setLength(0);
sb.append("");
sb.append("");
sb.append("\n");
sb.append("False ");
sb.append("\n");
sb.append("False ");
sb.append("\n");
sb.append(" ");
sb.append("\n");
sb.append(" ");
sb.append(" + "\">");
sb.append("\n");
sb.append("
+ "\" ss:ExpandedRowCount=\"" + recordcount
+ "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
sb.append("\n");
}
sb.append("");
for (int j = 0; j < col; j++) {
System.out.println(i);
sb.append("10000000000000000123 | ");
sb.append("\n");
}
sb.append("
");
if (i % 5000 == 0) {
rafs.write(sb.toString().getBytes());
rafs.flush();
sb.setLength(0);
}
sb.append("\n");
currentRecord++;
}
rafs.write(sb.toString().getBytes());
sb.setLength(0);
sb.append("");
sb.append("");
sb.append("\n");
sb.append("False ");
sb.append("\n");
sb.append("False ");
sb.append("\n");
sb.append(" ");
sb.append("\n");
sb.append("");
sb.append("");
sb.append("\n");
rafs.write(sb.toString().getBytes());
rafs.flush();
rafs.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可以直接执行,只是给你个思路。追问很感谢你的思路,只是XML是没有格式的,可读性和excel也无法相比,所以没办法用xml追答xml可以描述Excel的任何格式,你只是没有去观察,至于使用poi或者jxl都不行,这个路我已经走过了。希望你不要走弯路,因为他们在写入的机制一样,都是一个单元格一个对象,你想如果5w数据10列的话都多少个单元格对象在内存中?这样你的内存不溢出才怪。
我刚才给你写的demo 你把生成的文件格式直接修改为 xls试试看看什么效果
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
try {
DataOutputStream rafs = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(new File(
"d://test.xml"))));
sb.append("");
sb.append("\n");
sb.append("");
sb.append("\n");
sb.append("
sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
sb.append("\n");
sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
sb.append("\n");
sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sb.append("\n");
sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
sb.append("\n");
sb.append("
sb.append(" \n");
sb.append("
int sheetcount = 0;
int recordcount = 20;
int currentRecord = 0;
int total = 100;
int col = 20;
sb.append("
sb.append("\n");
sb.append("
+ "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
sb.append("\n");
for (int i = 0; i < total; i++) {
if ((currentRecord == recordcount
|| currentRecord > recordcount || currentRecord == 0)
&& i != 0) {// 一个sheet写满
currentRecord = 0;
rafs.write(sb.toString().getBytes());
sb.setLength(0);
sb.append("");
sb.append("
sb.append("\n");
sb.append("
sb.append("\n");
sb.append("
sb.append("\n");
sb.append("
sb.append("\n");
sb.append("
sb.append("
sb.append("\n");
sb.append("
+ "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
sb.append("\n");
}
sb.append("
for (int j = 0; j < col; j++) {
System.out.println(i);
sb.append("
sb.append("\n");
}
sb.append("
if (i % 5000 == 0) {
rafs.write(sb.toString().getBytes());
rafs.flush();
sb.setLength(0);
}
sb.append("\n");
currentRecord++;
}
rafs.write(sb.toString().getBytes());
sb.setLength(0);
sb.append("");
sb.append("
sb.append("\n");
sb.append("
sb.append("\n");
sb.append("
sb.append("\n");
sb.append("
sb.append("\n");
sb.append("");
sb.append("");
sb.append("\n");
rafs.write(sb.toString().getBytes());
rafs.flush();
rafs.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可以直接执行,只是给你个思路。追问很感谢你的思路,只是XML是没有格式的,可读性和excel也无法相比,所以没办法用xml追答xml可以描述Excel的任何格式,你只是没有去观察,至于使用poi或者jxl都不行,这个路我已经走过了。希望你不要走弯路,因为他们在写入的机制一样,都是一个单元格一个对象,你想如果5w数据10列的话都多少个单元格对象在内存中?这样你的内存不溢出才怪。
我刚才给你写的demo 你把生成的文件格式直接修改为 xls试试看看什么效果
全部回答
- 1楼网友:西岸风
- 2021-03-23 00:04
五万行数据没问题,10万我都导过,你可以用逗号分隔,别用什么poi,再命名为excel就可以了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯