ZBLOG

private void mergeFileSheet(File originalFile, List fileUrls) throws Exception { try (FileInputStream fis = new FileInputStream(originalFile); Workbook originalWorkbook = new XSSFWorkbook(fis)) { for (Strin...

要支持单元格图片的复制,可以按照以下步骤进行优化:

  1. copyRow 方法中,添加处理单元格图片的逻辑。可以通过 sourceCell.getCellStyle().getDrawing() 获取单元格的绘图对象,并判断是否存在图片。
  2. 如果存在图片,使用 targetSheet.createDrawingPatriarch() 创建目标 sheet 的绘图对象,并通过调用 drawing.createPicture() 方法创建新的图片对象。
  3. 将源单元格图片的属性(如位置、大小等)设置给目标单元格的图片对象。

下面是代码示例:

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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=16324

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?