2011-08-06 9 views
0

私はapache poiを使用して.xlsxファイルを処理しています。apache poisを使用してExcelの一部のレコードを追加

私は、彼らが同じ構造を持って2つの.xlsxファイル、 part.xlsx,and full.xlsx

を持っています。

各レコード(poiのRowオブジェクト)には、3つのcolmn:name、age、locationがあります。

part.xlsxにはほぼ5000行、full.xlsxには40000行あります。

ここで、part.xlsxの値と同じ値を持つfull.xlsxの行を追加します。例えば

part.xlsx:

Name age location 
kk 23 USA 
bb 24 England 
...... 

full.xlsx

Name age location 
kk 23 USA 
bb 24 England 
xx 25 USA 
...... 

今、私は余分な 'KK' と 'B-B' 列と保存したいですそれらを新しいファイルに追加します。

これは、コードのコードです:

List<User> usersInpart=new ArrayList<User>(); 
List<Row> rows_to_be_saved=new ArrayList<Row>(); 

//read the part.xlsx and save them. 
FileInputStream fis_part=new FileInputStream("part.xlsx"); 
WorkBook wb_part=WorkbookFactory.create(fis_part); 
Sheet st_part=wb_part.getSheetAt(0); 
for(Row row : st_part){ 
    if(row.getRowNum()==0) continue; //skip the first row(the title) 
    User u=new User(); 
    u.setName(row.getCell(0).getRichStringValue().getString().trim()); 
    u.setAge(row.getCell(1).getNumericCellValue()); 
    u.setLocation(row.getCell(2).getRichStringValue().getString().trim()); 
    usersInpart.add(u); 
} 
fis_part.close(); 


//read the full.xlsx 

FileInputStream fis_full=new FileInputStream("full.xlsx"); 
WorkBook wb_full=WorkbookFactory.create(fis_full); 
Sheet st_full=wb_full.getSheetAt(0); 
for(Row row : st_full){ 
    if(row.getRowNum()==0) continue; //skip the first row(the title) 

    String name=row.getCell(0).getRichStringValue().getString().trim(); 
    double age=row.getCell(1).getNumericCellValue(); 
    String location=row.getCell(2).getRichStringValue().getString().trim(); 

    for(User u : usersInpart){ 
     if(u.getName.equals(name) && u.getAge==age && u.getLocation().equals(location)) 
      rows_to_be_saved.add(row); 
    } 
} 
fis_full.close(); 

//write the selected rows to file 

WorkBook wb_res=WorkbookFactory.create(fis_full); 
Sheet st_res=wb_res.createSheet(0); 

    int i=0; 
    for (Row row : rows_to_be_saved) { 
     Row rw=st_res.createRow(i); 

     int k=0; 
     for (Cell cell : row) { 
      switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_STRING: 
        rw.createCell(k).setCellValue(cell.getRichStringCellValue().getString()); 
        break; 
       case Cell.CELL_TYPE_NUMERIC: 
        if (DateUtil.isCellDateFormatted(cell)) { 
         rw.createCell(k).setCellValue(cell.getDateCellValue()); 
        } else { 
         rw.createCell(k).setCellValue(cell.getNumericCellValue()); 
        } 
        break; 
       case Cell.CELL_TYPE_BOOLEAN: 
        rw.createCell(k).setCellValue(cell.getBooleanCellValue()); 
        break; 
       case Cell.CELL_TYPE_FORMULA: 
        rw.createCell(k).setCellValue(cell.getCellFormula()); 
        break; 
       default: 
      } 
      k++; 
     } 
     i++; 
    } 
//save the wb_res 
wb_res.write(new FileOutputStrem("xx.xlsx")); 

は、今私は、ファイルを保存するために何か良いアイデアをだろうか?

「rows_to_be_saved」に選択した行が保存されています。

新しいシート「st_res」を作成します。これらの行を「st_res」に直接保存する方法はありますか?以来、私は "rows_to_be_saved"の行に基づいて各行を作成しています。

したがって、2つの行リストがあります。私はこれが記憶の浪費だと思う。

提案がありますか?

答えて

1

メモリの使用が懸念される場合は、XSSF Event Modelを使用してfull.xlsxファイルを読み取って、さらに多くの情報を保存できます。現在、40,000行のファイルをメモリにロードしていますが、イベントモデルでは、一度に1つの行しかメモリに保持しません。

関連する問題