Как читать и записывать очень большие данные из таблицы Excel, используя Apache Poi?
У меня есть задача прочитать 2 файла Excel, содержащих по одному листу в каждом, и создать одну выходную книгу, содержащую 2 листа. Я работаю с файлами.xlsx и Apache POI, в настоящее время я могу записать данные из одного входного файла в выходной файл, и когда я пытаюсь записать второй входной файл на второй лист выходного файла, он показывает Out of Heap ошибка памяти Второй лист содержит 162100 строк с 4 столбцами, я попытался прочитать все данные из второго файла, используя списки. Все данные были успешно сохранены в списке, но когда я пытаюсь записать второй лист из списка, он показывает..
"Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.xmlbeans.impl.store.Xobj.ensureParent(Xobj.java:614)
at org.apache.xmlbeans.impl.store.Xobj.getNormal(Xobj.java:661)
at org.apache.xmlbeans.impl.store.Cur.getNormal(Cur.java:2464)
at org.apache.xmlbeans.impl.store.Cur.skip(Cur.java:1269)
at org.apache.xmlbeans.impl.store.Cur.moveNode(Cur.java:1840)
at org.apache.xmlbeans.impl.store.Cur.createHelper(Cur.java:287)
at org.apache.xmlbeans.impl.store.Cur.createElement(Cur.java:231)
at org.apache.xmlbeans.impl.store.Cur.createElement(Cur.java:226)
at org.apache.xmlbeans.impl.store.Xobj.insertElement(Xobj.java:2116)
at org.apache.xmlbeans.impl.store.Xobj.add_element_user(Xobj.java:2197)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTCellImpl.setV(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:333)
at cgi.AMSdump.<init>(AMSdump.java:224)
at cgi.AMSdump.main(AMSdump.java:451)"
вот код:
public class AMSdump {
//Array list to store
java.util.List<DataStorer> data = new ArrayList<DataStorer>();
//to open first file
FileInputStream myStream = new FileInputStream(output1);
OPCPackage pkg = OPCPackage.open(myStream);
XSSFWorkbook wbread = new XSSFWorkbook(pkg);
CreationHelper createHelper = wb.getCreationHelper();
XSSFSheet sheetx = wbread.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
//getting the first and last row of the input Sheet 1
int rowStart = sheetx.getFirstRowNum() ;
int rowEnd = sheetx.getLastRowNum() ;int count = 7;
int fCell,lCell;
Row rowwrite[] =new Row[rowEnd+1];
for(int i=rowStart;i<=rowEnd;i++){
row=sheetx.getRow(i);
if(row==null){
System.out.println("empty accessed");
continue;}
if(row!=null){
rowwrite[i]=sheet1.createRow((short)i);
fCell = row.getFirstCellNum();
lCell = row.getLastCellNum();
//iterating over the cells of a particular row and writing it one by one in the workbook
for(int iCell = fCell; iCell < lCell; iCell++) {
cell = row.getCell(iCell);
if(cell==null){
continue;}
else{
Cell currentCell = cell;
//determining the type of cell being read and writing that to the new workbook
if (currentCell.getCellTypeEnum() == CellType.NUMERIC) {
rowwrite[i].createCell(iCell).setCellValue(currentCell.getNumericCellValue());}
else if(currentCell.getCellTypeEnum() == CellType.STRING) {
rowwrite[i].createCell(iCell).setCellValue(currentCell.getStringCellValue());}
else if(currentCell.getCellTypeEnum() == CellType.FORMULA){
rowwrite[i].createCell(iCell).setCellValue(currentCell.getCellFormula());}
else if (currentCell.getCellTypeEnum() == CellType.ERROR){
rowwrite[i].createCell(iCell).setCellValue(currentCell.getErrorCellValue());}
}//else part of cell ends
}//inner cell for loop ends
}
}//row not null ends
System.out.println("WorkBook has been created");
}//outer for loop ends
// Запись в файл
FileOutputStream fileOut = new FileOutputStream("AmsDumpOutput"+open+".xlsx");
wb.write(fileOut);;
fileOut.close();
wbread.close();
System.out.println("Sheet1 of WorkBook has been created");
//calling the function to read from second file and store them into list
storeIntoList(output2);
//to check if the lists contains values
for(int i = 0;i<data.size();i++){
System.out.println("Email : "+ data.get(i).getEmail() + "Pan : "+data.get(i).getPan());
}
//writing to second sheet of the output file
int size = data.size();
Row rowwrite2[] =new Row[size+1];
rowwrite2[0] = sheet2.createRow(0);
rowwrite2[0].createCell(0).setCellValue("Mobile No.");
sheet2.setColumnWidth(0, 1300*3);
rowwrite2[0].createCell(1).setCellValue("Email ID");
rowwrite2[0].createCell(2).setCellValue("Candidate ID");
rowwrite2[0].createCell(3).setCellValue("PAN Number");
for(int counter = 1;counter<size;counter++){
rowwrite2[counter] = sheet2.createRow(counter);
rowwrite2[counter].createCell(0).setCellValue(data.get(counter).getMobile());
//rowwrite2[counter].createCell(1).setCellValue(data.get(counter).getEmail());
rowwrite2[counter].createCell(2).setCellValue(data.get(counter).getID());
//rowwrite2[counter].createCell(3).setCellValue(data.get(counter).getPan());
}
// запись этого не удалась из-за ошибки кучи!
FileOutputStream fileOuts = new FileOutputStream("AmsDumpOutput"+open+".xlsx");
**wb.write(fileOuts);;wb.close();
fileOuts.close();**
//closing the output workbook
System.out.println("Sheet 2 of Output WorkBook has been created");
wb = null;
myStream = null;
//field2(output2);
System.out.println("Finale done");
}
// здесь пользовательский класс для хранения данных //
public class DataStorer {
double mobile; String email;
double ID;
String Pan;
public void setMobile(double mobile){
this.mobile = mobile;
}
public double getMobile(){
return mobile;
}
public void setEmail(String email){
this.email = email;
}
public String getEmail(){
return email;
}
public void setID(double ID){
this.ID = ID;
}
public double getID(){
return ID;
}
public void setPan(String Pan){
this.Pan = Pan;
}
public String getPan(){
return Pan;
}
}