要支持单元格图片的复制,可以按照以下步骤进行优化:
- 在
copyRow
方法中,添加处理单元格图片的逻辑。可以通过sourceCell.getCellStyle().getDrawing()
获取单元格的绘图对象,并判断是否存在图片。 - 如果存在图片,使用
targetSheet.createDrawingPatriarch()
创建目标 sheet 的绘图对象,并通过调用drawing.createPicture()
方法创建新的图片对象。 - 将源单元格图片的属性(如位置、大小等)设置给目标单元格的图片对象。
下面是代码示例:
private void copyRow(Row source, Row target, Workbook workbook) {
Drawing<?> sourceDrawing = null;
Drawing<?> targetDrawing = null;
// 处理单元格
for (int i = source.getFirstCellNum(); i <= source.getLastCellNum(); i++) {
Cell sourceCell = source.getCell(i);
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:
// do nothing
break;
default:
}
// 判断是否有图片
if (sourceCell.getCellType() == CellType.STRING && sourceDrawing == null) {
sourceDrawing = sourceCell.getSheet().getDrawingPatriarch();
}
if (sourceDrawing != null && sourceCell instanceof XSSFRichTextString) {
XSSFRichTextString richTextString = (XSSFRichTextString) sourceCell.getRichStringCellValue();
for (XSSFTextParagraph paragraph : richTextString.getCTRst().getPArray()) {
for (CTRegularTextRun textRun : paragraph.getRArray()) {
for (CTShape shape : textRun.getDrawingArray()) {
// 处理单元格内的图片
handleImage(shape, targetSheet, targetRow);
}
}
}
}
}
}
}
private void handleImage(CTShape shape, Sheet targetSheet, Row targetRow) {
Drawing<?> drawing = targetSheet.createDrawingPatriarch();
XSSFClientAnchor anchor = new XSSFClientAnchor(shape.getClientDataArray(0));
anchor.setRow1(targetRow.getRowNum());
anchor.setRow2(targetRow.getRowNum() + 1);
Picture picture = drawing.createPicture(anchor, workbook.addPicture(bytes, format));
// 设置图片属性
picture.resize(); // 调整大小
// 设置其他属性,如偏移量、旋转角度等
}
这样就可以在复制单元格的同时复制单元格内的图片了。请根据你实际情况进行适当调整和测试。
内容由零声教学AI助手提供,问题来源于学员提问