java poi Excel大数据量(千万级)导入如何提高速度

时间:2021-05-08 23:20:21
求有经验的大神指教  

我的代码

// 导入普通客户信息
public String importExcle() {
TEmployee employee = (TEmployee) request.getSession().getAttribute(
"employee");
TCustomerInfo c = new TCustomerInfo();
// 声明数据流
InputStream is = null;
if (employee != null) {
int hang = 0;
int lie = 0;
if (excel != null) {
try {
// 解析excel 2007 版本文件
is = new FileInputStream(excel);
XSSFWorkbook work = new XSSFWorkbook(is);
XSSFSheet sheet = work.getSheetAt(0);
int rows = sheet.getPhysicalNumberOfRows();
// 循环表的行,从第二行开始

for (int i = 1; i < rows; i++) {
hang = i + 1;
c = new TCustomerInfo();
XSSFRow row = sheet.getRow(i);
if (row == null) {// 判断是否为空
continue;
}
// 读取该行的每一列
for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
XSSFCell cell = row.getCell(j);
if (cell == null) {
continue;
}
if (cell.toString() == null
|| "".equals(cell.toString())) {
continue;
}
String v = Util.getXssfCellValue(cell);
switch (j) {// 通过列数来判断对应插如的字段
case 0:
c.setCompanyName(v);
break;
case 1:
c.setLinkName(v);
break;
case 2:
c.setTell(v);
break;
case 3:
c.setTelephone(v);
break;
case 4:
c.setPosition(v);
break;
case 5:
c.setEmail(v);
break;
case 6:
c.setCompanyType(v);
break;
case 7:
c.setCustomerType(v);
break;
case 8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(employee.getName());
c.setCreateDate(new Date());

}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message", "导入成功(=^_^=)");

} catch (Exception e) {
System.out.println("进入 ---解析excel 2003 版本文件--错误抛出");
try {
// 解析excel 2003 版本文件

is = new FileInputStream(excel);
HSSFWorkbook work = new HSSFWorkbook(is);
HSSFSheet sheet = work.getSheetAt(0);
if (sheet != null) {
int rows = sheet.getPhysicalNumberOfRows();
// 循环表的行,从第二行开始
for (int i = 1; i < rows; i++) {
hang = i + 1;
c = new TCustomerInfo();
HSSFRow row = sheet.getRow(i);
if (row == null) {// 判断是否为空
continue;
}
// 循环表格的列
for (short j = 0; j < row
.getPhysicalNumberOfCells(); j++) {
HSSFCell cell = row.getCell(j);
if (cell == null) {
continue;
}
if (cell.toString() == null|| "".equals(cell.toString())) {
continue;
}
String v = Util.getHssfCellValue(cell);
switch (j) {// 通过列数来判断对应插如的字段
case 0:

c.setCompanyName(v);
break;
case 1:

c.setLinkName(v);
break;
case 2:

c.setTell(v);
break;
case 3:

c.setTelephone(v);
break;
case 4:

c.setPosition(v);
break;
case 5:

c.setEmail(v);
break;
case 6:

c.setCompanyType(v);
break;
case 7:

c.setCustomerType(v);
break;
case 8:

c.setCompanyDetail(v);
break;
}
c.setCreateMan(v);
c.setCreateDate(new Date());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message", "导入成功(=^_^=)");
}
} catch (Exception e1) {
request.setAttribute("message", "第" + hang + "行,第"
+ lie + "列开始导入失败,请注意导入格式!!");
e1.printStackTrace();
}
}
}
} else {
request.setAttribute("message", "登录超时 ,请重新登录!!");
}
// 查询时对象中含有值对查询有误
if (customer != null) {
customer = null;
}

return customerList();
}

15 个解决方案

#1


千万级,写到一个excel 里吗?

#2


引用 1 楼 rui888 的回复:
千万级,写到一个excel 里吗?


是用Excel 导入  没办法 公司要这么干

#3


速度没办法,数据量在那摆着呢,循环1千万次还比1万次长的多呢。

#4


这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开

#5


用jxls试试

#6


引用 4 楼 ygycomon 的回复:
这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开


他是分数十次次导入的    java poi Excel大数据量(千万级)导入如何提高速度估计是没办法了  我在看看有没有其他办法 

#7


引用 6 楼 u013810758 的回复:
Quote: 引用 4 楼 ygycomon 的回复:

这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开


他是分数十次次导入的    java poi Excel大数据量(千万级)导入如何提高速度估计是没办法了  我在看看有没有其他办法 


分10次就应该导入到不同的文件里去,用多台机器来分析处理,导入到一个文件里这个真实匪夷所思

#8


引用 7 楼 ygycomon 的回复:
Quote: 引用 6 楼 u013810758 的回复:

Quote: 引用 4 楼 ygycomon 的回复:

这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开


他是分数十次次导入的    java poi Excel大数据量(千万级)导入如何提高速度估计是没办法了  我在看看有没有其他办法 


分10次就应该导入到不同的文件里去,用多台机器来分析处理,导入到一个文件里这个真实匪夷所思



导入的数据库  用的是mysql

#9


lz还纠结个什么呢?数据量摆着呢,编程接口没有什么新的,就是poi了,速度不可能有什么质的提高。

#10


引用 3 楼 yys79 的回复:
速度没办法,数据量在那摆着呢,循环1千万次还比1万次长的多呢。

#11


我采用了批量提交的方法,先将数据保存到集合,最后再50个子批次提交,速度快了近10倍,当然测试用数据是1w 条左右,更大数据量可同理保存到集合,分批次保存

#12


非得用xls格式吗?用csv可能速度会快很多

#13


引用 12 楼 Android_iPhone 的回复:
非得用xls格式吗?用csv可能速度会快很多

恩恩 据说可以 到时试试

#14


千万条数据不会出现oom么?我也是用poi跟楼主类似的方法五六万条数据就已经出现oom了

#15


java实现导入大数量数据到excel中,用poi感觉会很麻烦吧 java poi Excel大数据量(千万级)导入如何提高速度。试试用插件吧,方便点,PageOffice插件就很不错,可以实现插入数据到excel中。可以到官网上查查

#1


千万级,写到一个excel 里吗?

#2


引用 1 楼 rui888 的回复:
千万级,写到一个excel 里吗?


是用Excel 导入  没办法 公司要这么干

#3


速度没办法,数据量在那摆着呢,循环1千万次还比1万次长的多呢。

#4


这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开

#5


用jxls试试

#6


引用 4 楼 ygycomon 的回复:
这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开


他是分数十次次导入的    java poi Excel大数据量(千万级)导入如何提高速度估计是没办法了  我在看看有没有其他办法 

#7


引用 6 楼 u013810758 的回复:
Quote: 引用 4 楼 ygycomon 的回复:

这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开


他是分数十次次导入的    java poi Excel大数据量(千万级)导入如何提高速度估计是没办法了  我在看看有没有其他办法 


分10次就应该导入到不同的文件里去,用多台机器来分析处理,导入到一个文件里这个真实匪夷所思

#8


引用 7 楼 ygycomon 的回复:
Quote: 引用 6 楼 u013810758 的回复:

Quote: 引用 4 楼 ygycomon 的回复:

这种从excel里导东西出来没什么点可以优化的

我倒是很好奇这种千万级别的excel是怎么产生的,这种文件估计放在绝大部分pc机上都打不开


他是分数十次次导入的    java poi Excel大数据量(千万级)导入如何提高速度估计是没办法了  我在看看有没有其他办法 


分10次就应该导入到不同的文件里去,用多台机器来分析处理,导入到一个文件里这个真实匪夷所思



导入的数据库  用的是mysql

#9


lz还纠结个什么呢?数据量摆着呢,编程接口没有什么新的,就是poi了,速度不可能有什么质的提高。

#10


引用 3 楼 yys79 的回复:
速度没办法,数据量在那摆着呢,循环1千万次还比1万次长的多呢。

#11


我采用了批量提交的方法,先将数据保存到集合,最后再50个子批次提交,速度快了近10倍,当然测试用数据是1w 条左右,更大数据量可同理保存到集合,分批次保存

#12


非得用xls格式吗?用csv可能速度会快很多

#13


引用 12 楼 Android_iPhone 的回复:
非得用xls格式吗?用csv可能速度会快很多

恩恩 据说可以 到时试试

#14


千万条数据不会出现oom么?我也是用poi跟楼主类似的方法五六万条数据就已经出现oom了

#15


java实现导入大数量数据到excel中,用poi感觉会很麻烦吧 java poi Excel大数据量(千万级)导入如何提高速度。试试用插件吧,方便点,PageOffice插件就很不错,可以实现插入数据到excel中。可以到官网上查查