Apache POI将一行从Excel文件复制到另一个新的Excel文件

时间:2018-12-19 10:24:35

标签: java excel apache-poi

我正在使用JAVA 8和Apache POI 3.17。我有一个Excel文件,我只想保留几行并删除其他行。但是我的Excel有4万行,一一删除它们很长(将近30分钟:/)

所以我尝试改变自己的做事方式。现在,我认为最好只将我需要的行放在excel源中,然后复制到另一个新行中。但是到目前为止,我所做的尝试并不高效。

我所有行都想保留在列表中。但这无法正常工作,并为我创造了一个空白的excel:

public void createExcelFileFromLog (Path logRejetFilePath, Path fichierInterdits) throws IOException {

Map<Integer, Integer> mapLigneColonne = getRowAndColumnInError(logRejetFilePath);

Workbook sourceWorkbook = WorkbookFactory.create(new File(fichierInterdits.toAbsolutePath().toString()));

Sheet sourceSheet = sourceWorkbook.getSheetAt(0);

List<Row> listLignes = new ArrayList<Row>();

// get Rows from source Excel
for (Map.Entry<Integer, Integer> entry : mapLigneColonne.entrySet()) {
    listLignes.add(sourceSheet.getRow(entry.getKey()-1));
}

// The new Excel
Workbook workbookToWrite = new XSSFWorkbook();
Sheet sheetToWrite = workbookToWrite.createSheet("Interdits en erreur");

// Copy Rows
Integer i = 0;
for (Row row : listLignes) {
    copyRow(sheetToWrite, row, i);
    i++;
}

FileOutputStream fos = new FileOutputStream(config.getDossierTemporaire() + "Interdits_en_erreur.xlsx");
workbookToWrite.write(fos);
workbookToWrite.close();
sourceWorkbook.close();
}

private static void copyRow(Sheet newSheet, Row sourceRow, int newRowNum) {

Row newRow = newSheet.createRow(newRowNum);
newRow = sourceRow;
}

编辑:最好更改copyRow的方法,但是日期格式很奇怪,原始行中的空白单元格都消失了。

private static void copyRow(Sheet newSheet, Row sourceRow, int newRowNum) {

    Row newRow = newSheet.createRow(newRowNum);
    Integer i = 0;

    for (Cell cell : sourceRow) {

        if(cell.getCellTypeEnum() == CellType.NUMERIC) {
            newRow.createCell(i).setCellValue(cell.getDateCellValue());
        } else {
            newRow.createCell(i).setCellValue(cell.getStringCellValue());
        }
        i++;
    }
}

编辑2:保留空白单元格

private static void copyRow(Sheet newSheet, Row sourceRow, Integer newRowNum, Integer cellToColor) {

    Row newRow = newSheet.createRow(newRowNum);
    //Integer i = 0;

    int lastColumn = Math.max(sourceRow.getLastCellNum(), 0);

    for(int i = 0; i < lastColumn; i++) {
        Cell oldCell = sourceRow.getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);

        if(oldCell == null) {
            newRow.createCell(i).setCellValue("");
        } else if (oldCell.getCellTypeEnum() == CellType.NUMERIC) {
            newRow.createCell(i).setCellValue(oldCell.getDateCellValue());
        } else {
            newRow.createCell(i).setCellValue(oldCell.getStringCellValue());
        }
    }
}

0 个答案:

没有答案