要支持单元格图片的复制,你需要对 copyRow
方法进行适当的修改。以下是一种可能的优化方案:
首先,在 copyRow
方法中添加一个条件判断,如果源单元格有图片,则获取图片并将其复制到目标单元格:
if (sourceCell != null) {
Cell targetCell = target.createCell(i, sourceCell.getCellType());
// ...
// 其他代码不变
// 判断源单元格是否有图片
if (sourceCell.getCellTypeEnum() == CellType.STRING && sourceCell.getRichStringCellValue().hasRichTextRuns()) {
RichTextString richTextString = sourceCell.getRichStringCellValue();
for (int j = 0; j < richTextString.numFormattingRuns(); j++) {
int startIndex = richTextString.getIndexOfFormattingRun(j);
int endIndex;
if (j + 1 < richTextString.numFormattingRuns()) {
endIndex = richTextString.getIndexOfFormattingRun(j + 1);
} else {
endIndex = richTextString.length();
}
Font font = workbook.createFont();
font.cloneStyleFrom(sourceCellStyle.getFont());
XSSFRichTextString xssfRichTextString = new XSSFRichTextString(richTextString.getString());
PictureData[] pictures = ((XSSFWorkbook) workbook).getAllPictures();
for (PictureData picture : pictures) {
int pictureIndex = picture.getIndex();
String fileName = picture.suggestFullFileName();
byte[] imageData;
try(ByteArrayOutputStream baos = new ByteArrayOutputStream()){
BufferedImage bufferedImage= ImageIO.read(new ByteArrayInputStream(picture.getData()));
ImageIO.write(bufferedImage, "png", baos);
baos.flush();
imageData = baos.toByteArray();
}
int pictureType = ((XSSFWorkbook) workbook).addPicture(imageData, XSSFWorkbook.PICTURE_TYPE_PNG);
CreationHelper creationHelper = workbook.getCreationHelper();
Drawing<?> drawing = new XSSFDrawing((XSSFSheet) target.getSheet());
ClientAnchor anchor = creationHelper.createClientAnchor();
anchor.setDx1(0);
anchor.setDy1(0);
anchor.setDx2(0);
anchor.setDy2(0);
anchor.setRow1(target.getRowNum());
anchor.setCol1(target.getColumnIndex());
Picture pict = drawing.createPicture(anchor, pictureIndex);
// 将图片和文字内容合并
xssfRichTextString.applyFont(startIndex, endIndex, font);
xssfRichTextString.applyFont(startIndex, endIndex, richTextString.getFontOfFormattingRun(j));
pict.getCTPicture().getBlipFill().getBlip().setEmbed(XSSFPictureData.RELATIONS[pictureType]);
targetCell.setCellValue(xssfRichTextString);
}
}
} else {
// 根据单元格类型复制值
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:
// ...
default:
// ...
}
}
}
请注意,这只是一种示例实现,具体根据你的需求和代码逻辑进行调整。同时还需要引入相关的依赖库,如 Apache POI、Apache POI OOXML 和 Apache Commons IO。
希望这能对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问