Вставка строк с использованием Apache POI, но не может скопировать стиль, и последняя строка перемещается в неизвестное место - PullRequest
0 голосов
/ 28 апреля 2019

Я использую то же решение, которое доступно через Интернет для вставки промежуточной строки,

, но, похоже, оно не копирует стили и цвета.

Вот фрагмент:

private static void copyRow(Workbook workbook, Sheet worksheet, int sourceRowNum, int destinationRowNum) {
    // Get the source / new row
    Row newRow = worksheet.getRow(destinationRowNum);
    Row sourceRow = worksheet.getRow(sourceRowNum);

    // If the row exist in destination, push down all rows by 1 else create a new row
    if (newRow != null) {
        worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1);
    } else {
        newRow = worksheet.createRow(destinationRowNum);
    }

    // Loop through source columns to add to new row
    for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
        // Grab a copy of the old/new cell
        Cell oldCell = sourceRow.getCell(i);
        Cell newCell = newRow.createCell(i);

        // If the old cell is null jump to next cell
        if (oldCell == null) {
            newCell = null;
            continue;
        }

        // Copy style from old cell and apply to new cell
        CellStyle newCellStyle = workbook.createCellStyle();
        newCellStyle.cloneStyleFrom(oldCell.getCellStyle());
        ;
        newCell.setCellStyle(newCellStyle);

        // If there is a cell comment, copy
        if (oldCell.getCellComment() != null) {
            newCell.setCellComment(oldCell.getCellComment());
        }

        // If there is a cell hyperlink, copy
        if (oldCell.getHyperlink() != null) {
            newCell.setHyperlink(oldCell.getHyperlink());
        }

        // Set the cell data type
        newCell.setCellFormula(null);
        if(oldCell.getCellType().equals(CellType.FORMULA)){
            newCell.setCellFormula(oldCell.getCellFormula());
        } else {
            newCell.setCellType(oldCell.getCellType());
        }

        // Set the cell data value
        switch (oldCell.getCellType()) {
            case BLANK:
                newCell.setCellValue(oldCell.getStringCellValue());
                break;
            case BOOLEAN:
                newCell.setCellValue(oldCell.getBooleanCellValue());
                break;
            case ERROR:
                newCell.setCellErrorValue(oldCell.getErrorCellValue());
                break;
            case FORMULA:
                newCell.setCellFormula(oldCell.getCellFormula());
                break;
            case NUMERIC:
                newCell.setCellValue(oldCell.getNumericCellValue());
                break;
            case STRING:
                newCell.setCellValue(oldCell.getRichStringCellValue());
                break;
        }
    }

    // If there are are any merged regions in the source row, copy to new row
    for (int i = 0; i < worksheet.getNumMergedRegions(); i++) {
        CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);
        if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) {
            CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.getRowNum(),
                    (newRow.getRowNum() +
                            (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow()
                            )),
                    cellRangeAddress.getFirstColumn(),
                    cellRangeAddress.getLastColumn());
            worksheet.addMergedRegion(newCellRangeAddress);
        }
    }
}

Метод вызова:

    FileInputStream excelFile = new FileInputStream(new File("C:\\CodeReview_Template.xlsx"));
    Workbook workbook = new XSSFWorkbook(excelFile);
    Sheet sheet = workbook.getSheet("Apex Code");
    copyRow(workbook, sheet, 2, 3);
    FileOutputStream out = new FileOutputStream("C:\\CodeReview_Template2.xlsx");
    workbook.write(out);
    out.close();

Оригинальная рабочая книга выглядит следующим образом:

enter image description here

После запускаПриведенный выше код выглядит следующим образом:

enter image description here

Как видно из оригинальной рабочей книги, у меня есть строка с номером 4 темно-синий,это сдвигается, но я не знаю, где и новая строка, которая вставляется, не соответствует стилю предыдущей строки?

Что-то мне не хватает?

...