要支持复制行图片,您需要对代码进行以下修改:
- 在
copyRow方法中添加处理图片的逻辑。首先,检查源单元格是否为图片类型:
if (sourceCell.getCellTypeEnum() == CellType.PICTURE) {
// 获取源单元格中的图片数据
PictureData pictureData = ((XSSFPicture) sourceCell).getPictureData();
// 将图片数据写入目标工作簿并获取新的图片索引
int pictureIndex = workbook.addPicture(pictureData.getData(), getPictureType(pictureData.getPictureType()));
// 创建一个新的绘图对象并在目标单元格上插入图片
Drawing<?> drawing = targetSheet.createDrawingPatriarch();
ClientAnchor anchor = createClientAnchor(workbook, sourceCell.getRowIndex(), targetCell.getColumnIndex());
Picture picture = drawing.createPicture(anchor, pictureIndex);
}
请注意,这里使用了一些辅助方法 getPictureType 和 createClientAnchor。您可以根据实际情况自行实现或使用合适的库。
- 更新
mergeFileSheet方法,在创建新的sheet页之前,将当前附件文件名和序号存储起来:
List<String> newSheetNames = new ArrayList<>();
for (int i = 0; i < numberOfSheets; i++) {
// ...
sheetIndex++;
String newSheetName = "附件-" + originalFilename.substring(0, originalFilename.lastIndexOf(".")) + "-" + sheetIndex;
// 添加到列表中以备后续使用
newSheetNames.add(newSheetName);
// ...
}
- 在写入修改后的Workbook到文件之前,更新已创建的图片的链接信息:
for (String sheetName : newSheetNames) {
Sheet sheet = originalWorkbook.getSheet(sheetName);
if (sheet != null) {
XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch();
for (XSSFShape shape : drawing.getShapes()) {
if (shape instanceof XSSFPicture) {
XSSFPicture picture = (XSSFPicture) shape;
XSSFClientAnchor anchor = picture.getClientAnchor();
// 更新图片中的链接信息
anchor.setRow1(anchor.getRow1() + totalRowCount);
anchor.setRow2(anchor.getRow2() + totalRowCount);
}
}
}
}
// 写入修改后的Workbook到文件
try (FileOutputStream fos = new FileOutputStream(originalFile)) {
originalWorkbook.write(fos);
}
这里假设您使用的是XSSFWorkbook和XSSFDrawing,请根据实际情况调整代码。
以上是对给定代码进行了简单修改以支持复制行图片。请注意,具体实现可能因您所使用的库和需求而有所不同,请根据实际情况进行相应调整。
内容由零声教学AI助手提供,问题来源于学员提问




