要在代码中支持复制行图片,你需要修改copyRow()方法。以下是修改后的代码示例:
private void copyRow(Row source, Row target, Workbook workbook) {
// 遍历源行的每个单元格
for (int i = source.getFirstCellNum(); i <= source.getLastCellNum(); i++) {
Cell sourceCell = source.getCell(i);
// 如果源单元格为null,则不创建新单元格
if (sourceCell != null) {
Cell targetCell = target.createCell(i, sourceCell.getCellType());
// 复制单元格样式(如果需要)
CellStyle sourceCellStyle = sourceCell.getCellStyle();
CellStyle targetCellStyle = workbook.createCellStyle();
targetCellStyle.cloneStyleFrom(sourceCellStyle);
targetCell.setCellStyle(targetCellStyle);
// 根据单元格类型复制值
switch (sourceCell.getCellTypeEnum()) {
case STRING:
targetCell.setCellValue(sourceCell.getStringCellValue());
break;
case NUMERIC:
targetCell.setCellValue(sourceCell.getNumericCellValue());
break;
case BOOLEAN:
targetCell.setCellValue(sourceCell.getBooleanCellValue());
break;
case FORMULA:
// 如果单元格是公式,则复制公式本身
targetCell.setCellFormula(sourceCell.getCellFormula());
break;
case BLANK:
// 不做处理
break;
default:
// 默认处理
}
// 检查源单元格是否有图片,并复制到目标单元格
List<? extends PictureData> pictures = workbook.getAllPictures();
for (PictureData picture : pictures) {
if (picture instanceof HSSFPictureData && source instanceof HSSFRow) {
HSSFRow hssfSourceRow = (HSSFRow) source;
HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
List<HSSFShape> shapes = hssfSourceRow.getDrawingPatriarch().getChildren();
for (HSSFShape shape : shapes) {
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
if (pic.getRow() == hssfSourceRow.getRowNum()) {
HSSFPictureData picData = pic.getPictureData();
int pictureIndex = hssfWorkbook.addPicture(picData.getData(), picData.getPictureType());
// 获取图片原始位置信息
ClientAnchor anchor = pic.getClientAnchor();
// 创建新的图片位置信息,将行号和列号修改为目标单元格所在行和列
ClientAnchor targetAnchor = new XSSFClientAnchor(anchor.getDx1(), anchor.getDy1(),
anchor.getDx2(), anchor.getDy2(),
targetCell.getColumnIndex(), target.getRowIndex(),
targetCell.getColumnIndex() + 1, target.getRowIndex() + 1);
// 在目标工作表上创建新图片,并设置位置信息
Drawing<?> drawing = targetSheet.createDrawingPatriarch();
drawing.createPicture(targetAnchor, pictureIndex);
}
}
}
} else if (picture instanceof XSSFPictureData && source instanceof XSSFRow) {
XSSFRow xssfSourceRow = (XSSFRow) source;
XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
List<XSSFShape> shapes = xssfSourceRow.getDrawingPatriarch().getShapes();
for (XSSFShape shape : shapes) {
if (shape instanceof XSSFPicture) {
XSSFPicture pic = (XSSFPicture) shape;
if (pic.getRow() == xssfSourceRow.getRowNum()) {
XSSFPictureData picData = pic.getPictureData();
int pictureIndex = xssfWorkbook.addPicture(picData.getData(), picData.getPictureType());
// 获取图片原始位置信息
XSSFClientAnchor anchor = pic.getClientAnchor();
// 创建新的图片位置信息,将行号和列号修改为目标单元格所在行和列
XSSFClientAnchor targetAnchor = new XSSFClientAnchor(anchor.getDx1(), anchor.getDy1(),
anchor.getDx2(), anchor.getDy2(),
targetCell.getColumnIndex(), target.getRowIndex(),
targetCell.getColumnIndex() + 1, target.getRowIndex() + 1);
// 在目标工作表上创建新图片,并设置位置信息
XSSFDrawing drawing = (XSSFDrawing) targetSheet.createDrawingPatriarch();
drawing.createPicture(targetAnchor, pictureIndex);
}
}
}
}
}
}
}
}
这样修改后的代码会检查源单元格是否有图片,并将其复制到目标单元格中。请注意,该示例假设你使用的是Apache POI库来操作Excel文件。
内容由零声教学AI助手提供,问题来源于学员提问




