如何复制 apache poi 中的列?

how to copy columns in apache poi?

我想复制 excel 文件中的列。让我们假设我有一个这样的 excel 文件:

如您所见,第 2 行中的 C 和 D 列已合并

我想一起复制 C 和 D 列。为此,我首先使用 sheet.shiftColumns()。效果很好,之后我的 excel 文件看起来像这样

现在我的旧 C 和 D 列在 E 和 F 中。这太棒了。但是在我转移之后我也想复制 C和D中的E和F列。例如我想这样做

我的问题是如何使用 apache poi 复制和移动列?

实际上,sheet 的所有合并单元格都保存在“合并区域”列表中的 sheet 中。您可以创建合并单元格 e。 G。使用

sheet.addMergedRegion(rowFrom,rowTo,colFrom,colTo);

(参见 POI quick guide)。 并且合并单元格的值(数据内容)和格式在技术上包含在合并区域的左上角单元格中,合并区域的所有其他单元格地址的数据和格式将被忽略(并且应该为空)。 因此,要回答您的问题,您需要将值 tel2 添加到单元格 C2 并将其格式设置为水平居中,然后构建单元格 C2 和 D2 的合并区域。

您也可以在 POI quick guide 中找到设置大提琴值和对齐方式的示例。

我找到了解决问题的方法。

首先,我需要找到要复制的列之间的所有合并区域。为此,我使用了该功能。

 private List<CellRangeAddress> getMergedRegionsBetweenTwoColumns(Sheet sheet, int startCol, int endCol) {
    List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
    for (int i = 0; i < sheet.getNumMergedRegions(); ++i) {
        CellRangeAddress range = sheet.getMergedRegion(i);
        if (range.getFirstColumn() >= startCol && range.getLastColumn() <= endCol)
            cellRangeAddressList.add(range);
    }
    return cellRangeAddressList;
}

之后,我需要在要复制的列之间获取单元格,因为我还需要复制我的单元格。为此,我使用了该功能。

    private List<Cell> getCellsBetweenTwoColumns(Sheet sheet, Integer startCol, Integer endCol) {
    List<Cell> cellList = new ArrayList<>();
    for (Row r : sheet) {
        for (int i = startCol; i <= endCol; i++) {
            Cell cell = r.getCell(i);
            if (cell != null)
                cellList.add(cell);
            // if cell equeals null than create the cell
            else{
                r.createCell(i);
                cellList.add(r.getCell(i));
            }
        }
    }
    return cellList;
}

获得这些列表后,我只需要使用它们。首先,我要添加 mergedRegions。之后,我将添加单元格样式和值。

 List<Cell> mainCellList =getCellsBetweenTwoColumns(sheet,copyStartCol,copyEndCol);
         for (int i = 0; i < copyCount; i++) {
            for (CellRangeAddress range : cellRangeAddressList) {
            range.setFirstColumn(range.getFirstColumn() + copyColumnCount * i);
            range.setLastColumn(range.getLastColumn() + copyColumnCount * i);
            sheet.addMergedRegion(range);
            }
        List<Cell> copiedColumnsCellList = getCellsBetweenTwoColumns(sheet, copyStartCol + copyColumnCount * i, copyEndCol + copyColumnCount * i);
            for (int k = 0; k < copiedColumnsCellList.size(); k++) {
            Cell newCell = copiedColumnsCellList.get(k);
            Cell oldCell = mainCellList.get(k);
            newCell.setCellStyle(oldCell.getCellStyle());
            newCell.setCellValue(oldCell.getStringCellValue());
            }
    }

copyCount 代表我需要多少副本,copyColumnCount 代表我想复制多少列。

如需更安全的解决方案和源代码,您可以查看此存储库。

https://github.com/hasankzl/apache-poi-excel-template