原文网址: poi(java操作office利器)在excel中生成大量数据的方式
版本
前提故事:
- excel2003之前版本最大数据保存65535行,对于保存大数据量的内容必须用到excel2007.最新版的excel最大可以支持100万的行的数据
- 碰到的问题,生成大数据的时候产生的list到15万的时候会OOM。
解决办法:
- 原理是通过poi提供的方法将内存中的数据刷到excel2007中,然后再重新读取。就不会导致对象过多而出现OOM。
参见代码如下:
private int writeExcel(List listconlume,String srcfileName,String targetFile)
throws FileNotFoundException, IOException {
RandomAccessFile rddata = new RandomAccessFile(srcfileName, “r”);
rddata.seek(0);
Workbook wb = new SXSSFWorkbook(10000);
Sheet sheet = wb.createSheet();
String dataline;
int lines = 0;
int position = 0;
while ((dataline = rddata.readLine()) != null) {
Row row = sheet.createRow(lines);
String dataTmp[] = dataline.split(“\t”);
for (int i = 0; i < dataTmp.length; i++) {
Cell cell = row.createCell(i);
if (listconlume.get(i * 2 + 1).toString().trim()
.equals(“string”)) {
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(new String(dataTmp[i]
.getBytes(“iso-8859-1″), “UTF-8″));
} else if (listconlume.get(i * 2 + 1).toString().trim()
.equals(“double”)) {
if(dataTmp[i]==null||dataTmp[i].toLowerCase().equals(“null”))
{
dataTmp[i]=”0.0″;
}
cell.setCellValue(Double.parseDouble(dataTmp[i]));
} else if (listconlume.get(i * 2 + 1).toString().trim()
.equals(“bigint”)) {
if(dataTmp[i]==null||dataTmp[i].toLowerCase().equals(“null”))
{
dataTmp[i]=”0″;
}
cell.setCellValue(Integer.parseInt(dataTmp[i]));
}
}
lines++;
position += dataline.length() + 1;
if(lines%10000==0)
{
this.sendMessage(“生成数据中…. 完成”+lines+”行”, -1);
logger.debug(“write data 10000:”+lines);
}
}
rddata.close();
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream(targetFile);
wb.write(fileOut);
fileOut.close();
return 0;
}
原文网址: poi(java操作office利器)在excel中生成大量数据的方式
版本
- 原理是通过poi提供的方法将内存中的数据刷到excel2007中,然后再重新读取。就不会导致对象过多而出现OOM。
![www.r66r.net](https://i-blog.csdnimg.cn/blog_migrate/87abef0f22e05352ba6a45d4fc216b3d.png)
private int writeExcel(List listconlume,String srcfileName,String targetFile)
throws FileNotFoundException, IOException {
RandomAccessFile rddata = new RandomAccessFile(srcfileName, “r”);
rddata.seek(0);
Workbook wb = new SXSSFWorkbook(10000);
Sheet sheet = wb.createSheet();
String dataline;
int lines = 0;
int position = 0;
while ((dataline = rddata.readLine()) != null) {
Row row = sheet.createRow(lines);
String dataTmp[] = dataline.split(“\t”);
for (int i = 0; i < dataTmp.length; i++) {
Cell cell = row.createCell(i);
if (listconlume.get(i * 2 + 1).toString().trim()
.equals(“string”)) {
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(new String(dataTmp[i]
.getBytes(“iso-8859-1″), “UTF-8″));
} else if (listconlume.get(i * 2 + 1).toString().trim()
.equals(“double”)) {
if(dataTmp[i]==null||dataTmp[i].toLowerCase().equals(“null”))
{
dataTmp[i]=”0.0″;
}
cell.setCellValue(Double.parseDouble(dataTmp[i]));
} else if (listconlume.get(i * 2 + 1).toString().trim()
.equals(“bigint”)) {
if(dataTmp[i]==null||dataTmp[i].toLowerCase().equals(“null”))
{
dataTmp[i]=”0″;
}
cell.setCellValue(Integer.parseInt(dataTmp[i]));
}
}
lines++;
position += dataline.length() + 1;
if(lines%10000==0)
{
this.sendMessage(“生成数据中…. 完成”+lines+”行”, -1);
logger.debug(“write data 10000:”+lines);
}
}
rddata.close();
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream(targetFile);
wb.write(fileOut);
fileOut.close();
return 0;
}