如何复制 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 代表我想复制多少列。
如需更安全的解决方案和源代码,您可以查看此存储库。
我想复制 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 代表我想复制多少列。
如需更安全的解决方案和源代码,您可以查看此存储库。