дополнительные записи в Excel с использованием Apache Pois - PullRequest
0 голосов
/ 06 августа 2011

Я использую apache poi для обработки файла .xlsx.

У меня есть два файла .xlsx, part.xlsx,and full.xlsx

им принадлежит одна и та же структура.

Каждая запись (объект Row в poi) имеет три столбца: имя, возраст, местоположение.

В файле part.xlsx содержится почти 5000 строк, а в файле full.xlsx - 40000 строк.

Теперь я хочу добавить строки из full.xlsx, которые имеют то же значение, что и в part.xlsx.

например:

Part.xlsx:

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

полный.xlsx

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

Теперь я хочу добавить строки 'kk' и 'bb' и сохранить их в новый файл.

Это код кода:

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"));

теперь мне интересно, есть ли хорошие идеи для сохранения файла?

Поскольку я сохранил выбранные строки в "row_to_be_saved".

И я создаю новый лист "st_res", каким-либо образом я могу сохранить эти строки непосредственно в "st_res"? С тех пор я создаю каждую строку в соответствии со строками в "row_to_be_saved".

Таким образом, будет два списка строк. Я думаю, что это пустая трата памяти.

Есть предложения?

1 Ответ

1 голос
/ 15 сентября 2011

Если использование памяти является проблемой, вы можете сэкономить гораздо больше, используя Модель событий XSSF для чтения файла full.xlsx.В настоящее время вы загружаете файл с 40 000 строками в память, в то время как модель событий будет хранить в памяти только одну строку за раз.

...