Как читать и записывать очень большие данные из таблицы 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;
}
}

0 ответов

Другие вопросы по тегам