ZBLOG

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

要支持单元格图片的复制,你需要对 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助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?