java 大数据量导出Excel内存溢出,求解答!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 大数据量导出Excel内存溢出,求解答!相关的知识,希望对你有一定的参考价值。

private HSSFWorkbook wb = null;// book [includes sheet]
private HSSFSheet sheet = null;
private HSSFRow row = null;
private Logger log = Logger.getLogger(ExcelWriter.class);
public ExcelWriter()

public ExcelWriter(String fileName)
wb = new HSSFWorkbook();


public void writeExcelLine(String fileName, List<String[]> list,String[] title)
int rowNum = 0;
try
FileOutputStream fileOut = new FileOutputStream(fileName);
if(sheet==null||"".equals(sheet))
sheet = wb.createSheet("formatsheet");

row = sheet.createRow(rowNum);
int cellNum = title.length;
for(short j = 0;j<cellNum;j++)
row.createCell(j);
row.getCell(j).setEncoding(HSSFCell.ENCODING_UTF_16);
row.getCell(j).setCellValue(title[j]);


if(list != null)
for (int i = 0; i < list.size(); i++)
row = sheet.createRow(i+1);
for(short j = 0 ; j< title.length;j++)
row.createCell(j);
row.getCell(j).setEncoding(HSSFCell.ENCODING_UTF_16);
row.getCell(j).setCellValue(list.get(i)[j]);



wb.write(fileOut);
fileOut.close();
catch (FileNotFoundException e)
log.error("FileNotFoundException :",e);
catch (IOException e)
log.error("IOException :",e);
catch (Exception e)
log.error("Exception :",e);


参考技术A 首先EXcel向内导入是又限度的,不是多大的数据都可以。你可以尝试一下先导入到ACCESS,这个比EXcel大。我没试过这个java导入。你可以试一下。 参考技术B lst有多大,建议分批写入

java excel poi 大数据量50W 内存溢出

求java的poi导出大数据内存溢出解决方法。。数据量在50W左右。
public void test()

for(int i=0;i<20;i++)
addData();



public void addData()
FileInputStream is

XSSFWorkbook wb
SXSSFWorkbook swb
Sheet sheet1 = swb.getSheet("Sheet0");
for(int i =0;i<1000;i++)

Row row = sheet1.createRow(sheet1.getLastRowNum() + 1);
row.setHeightInPoints((short) 12);row.createCell(0).setCellValue("20120710");
row.createCell(1).setCellValue("23");row.createCell(2).setCellValue("43");
wb.write(os);

50W数库EXCEL打开也有难度,建议导入CSV格式文件,或分多个文件。
关于内存溢出,注意以下几点:
1,分页分批从数据库里查询数据。
2,注意变量的释放,特别是LIST和MAP之类的引用,如果定义成全局变量或静态变量就会很难释放。
3,调大虚拟机内存大小。
参考技术A 首先内存溢出的原因确定是Excel数据过大吗?如果是的话你可以考虑加大内存,或者可以把Excel按照sheet页逐个读取,每个sheet页最大65535条数据这样就避免了内存溢出的问题
假如你封装的读Excel的方法是readExcel(InputStream is)
.....
那么把方法改成readExcel(Sheet sheet)
直接读sheet内容

获取Excel的时候直接按照sheet页循环调用
for(...)
获取sheet页
readExcel(sheet);
执行持久化操作
System.gc();

如果不行的话只能加大内存了,因为可能当问件读到内存中时就已经内存溢出了
参考技术B POI操作Excel还存在一些缺陷,如大文件读取,大文件追加写入的话,会有文件过大引起内存溢出的问题。
如果是往空Excel文件中导入数据,完全可以不用关文件的大小,只要不超过Excel的限制即可:
http://poi.apache.org/spreadsheet/how-to.html#sxssf
我写过几百M的数据
链接上有官方提供的例子。本回答被提问者和网友采纳
参考技术C Workbook workbook = new SXSSFWorkbook(1000);
poi有个机制 每次往内存中写1000条数据,这个1000你可以改的 尽量别大于10000条数据,写完1000条数据后再重新写,这样就不会内存溢出了。
参考技术D excel 最多只能6W 多行 你50W 肯定不行
要不就 每6W行分一个file
要不就用csv文件 这个support追问

2007格式的就可以写到100W啊。

public void test()
for(int i=0;i<20;i++)
addData();




我没有读数据库的数据,就这样存都报溢出。。。。

追答

你是直接JDBC load出来的 还是用了 类似toplink的 工具
如果用了的话 可能是50W数据 直接load死它了 分批load 数据

如果直接JDBC的话: 就分save。一次那么都,估计内存不够

以上是关于java 大数据量导出Excel内存溢出,求解答!的主要内容,如果未能解决你的问题,请参考以下文章

easyexcel合并单元格导出内存溢出

怎么使用java Poi解决导入excel表格大数据量时的内存溢出问

poi导出大数据,报内存溢出怎么解决

求java导出大量数据到excel解决方法

几百万数据量的Excel导出会内存溢出和卡顿?那是你没用对方法!

POI实现大数据EXCLE导入导出,解决内存溢出问题