ZBLOG

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

要复制sheet行中的图片,您可以使用Apache POI提供的PictureDataCreationHelper类来实现。下面是修改后的代码示例:

  1. private void mergeFileSheet(File originalFile, List<String> fileUrls) throws Exception {
  2. try (FileInputStream fis = new FileInputStream(originalFile);
  3. Workbook originalWorkbook = new XSSFWorkbook(fis)) {
  4. for (String fileUrl : fileUrls) {
  5. // 下载附件
  6. byte[] fileContent = fastDfsClient.download(fileUrl);
  7. String originalFilename = fastDfsClient.getOriginalFilename(fileUrl);
  8. try (ByteArrayInputStream bais = new ByteArrayInputStream(fileContent);
  9. Workbook attachmentWorkbook = new XSSFWorkbook(bais)) {
  10. // 获取附件中sheet数量
  11. int numberOfSheets = attachmentWorkbook.getNumberOfSheets();
  12. int sheetIndex = 0;
  13. for (int i = 0; i < numberOfSheets; i++) {
  14. Sheet attachmentSheet = attachmentWorkbook.getSheetAt(i);
  15. boolean sheetEmpty = ExcelUtil.isSheetEmpty(attachmentSheet);
  16. if(sheetEmpty){
  17. continue;
  18. }
  19. sheetIndex++;
  20. String newSheetName = "附件-" + originalFilename.substring(0, originalFilename.lastIndexOf(".")) + "-" + sheetIndex;
  21. // 创建新的sheet页来放置附件内容
  22. Sheet newSheet = originalWorkbook.createSheet(newSheetName);
  23. Drawing<?> drawingPatriarchNew = newSheet.createDrawingPatriarch();
  24. Drawing<?> drawingPatriarchOld;
  25. if (attachmentWorkbook instanceof SXSSFWorkbook) {
  26. SXSSFDrawing xssfDrawingOld =(SXSSFDrawing) ((SXSSFSheet) attachmentSheet).getDrawingPatriarch();
  27. ByteArrayOutputStream outByteStream=new ByteArrayOutputStream();
  28. xssfDrawingOld.write(outByteStream);
  29. ByteArrayInputStream inByteStream=new ByteArrayInputStream(outByteStream.toByteArray());
  30. drawingPatriarchOld = newSheet.createDrawingPatriarch();
  31. ((SXSSFDrawing)drawingPatriarchOld).readFrom(inByteStream);
  32. } else {
  33. XSSFNameSpace rDmNS =(XSSFNameSpace) ((XSSFSheet) attachmentSheet).getPackagePart().getParent().getParent();
  34. XSSFRelation rid=(XSSFRelation) XSSFDrawing.RELATIONS.getRelationByType(XSSFDrawing.NS_DRAWING_REL);
  35. ByteArrayOutputStream outByteStream=new ByteArrayOutputStream();
  36. for (POIXMLDocumentPart part :(List<POIXMLDocumentPart>)((POIXMLDocument)attachmentWorkbook).getAllEmbedds()) {
  37. if (part instanceof XSSFDrawing || (rDmNS != null && rDmNS.countDrawingRelationships() > 0)) {
  38. PackageRelationshipCollection pdrc;
  39. if(rDmNS != null){
  40. pdrc = ((XSSFDrawing)drawingPatriarchOld).getPackagePart().getRelationshipsByType(rid.getContentType(), rDmNS.getNamespaceURI());
  41. }else{
  42. pdrc = ((XSSFDrawing)drawingPatriarchOld).getPackagePart().getRelationshipsByType(rid.getContentType());
  43. }
  44. for(PackageRelationship pr : pdrc){
  45. PackagePart dspp=pr.getDocumentPart();
  46. OutputStream dspOut=dspp.getOutputStream();//
  47. xssfDrawingOld.write(dspOut);
  48. dspOut.close();
  49. ByteArrayOutputStream by1eArrayOutputStream=new ByteArrayOutputStream();
  50. dspp.save(by1eArrayOutputStream);//
  51. ByteArrayInputStream byteArrayInputStream2=new ByteArrayInputStream(by1eArrayOutputStream.toByteArray());//
  52. OPCPackage pkg=((POIXMLDocumentFactory)(OPCPackageFactory.newInstance()))._open(byteArrayInputStream2);
  53. if (rDmNS != null) {
  54. // check part relations
  55. int pdrcSize = rDmNS.countDrawingRelationships();
  56. for (int prIndex = 0; prIndex < pdrcSize; prIndex++) {
  57. PackageRelationship drr = rDmNS.getDrawingRelationship(prIndex);
  58. Drawing<?> dr=(Drawing<?>)XSSFDrawing.createDrawingPackagePart(drr, pkg).getDocumentPart();
  59. if (dr instanceof XSSFDrawing){
  60. drawingPatriarchOld =(SXSSFDrawing) dr;
  61. break;
  62. }
  63. }
  64. } else {
  65. drawingPatriarchOld =(SXSSFDrawing) ((XSSFWorkbook)attachmentWorkbook).getAllEmbedds().get(1);
  66. }
  67. }
  68. }
  69. }
  70. }
  71. for (Row sourceRow : attachmentSheet) {
  72. Row targetRow = newSheet.createRow(sourceRow.getRowNum());
  73. // 复制附件
  74. copyRow(sourceRow, targetRow, originalWorkbook);
  75. Drawing<?> sourceDrawingPatriarch = sourceRow.getSheet().createDrawingPatriarch();
  76. for(Drawing<?> dr:sourceDrawingPatriarch){
  77. CreationHelper helper = originalWorkbook.getCreationHelper();
  78. ClientAnchor anchorNew = helper.createClientAnchor();
  79. if(drawingPatriarchOld instanceof XSSFDrawing){
  80. XSSFPicture pictureNew= (XSSFPicture)drawingPatriarchNew.createPicture(anchorNew,
  81. originalWorkbook.addPicture(((XSSFPicture)((XSSFSheet)sourceSheet).getRelationsShips().get(dr)).getPictureData().getData(), PictureType.PNG));
  82. pictureNew.getClientAnchor().setCol1(((XSSFPicture)((XSSFSheet)sourceSheet).getRelationsShips().get(dr)).getClientAnchor().getCol1());
  83. pictureNew.getClientAnchor().setCol2(((XSSFPicture)((XSSFSheet)sourceSheet).getRelationsShips().get(dr)).getClientAnchor().getCol2());
  84. pictureNew.getClientAnchor().setRow1(((XSSFPicture)((XSSFSheet)sourceSheet).getRelationsShips().get(dr)).getClientAnchor().getRow1());
  85. pictureNew.getClientAnchor().setRow2(((XSSFPicture)((XSSFSheet)sourceSheet).getRelationsShips().get(dr)).getClientAnchor().getRow2());
  86. } else if(drawingPatriarchOld instanceof SXSSFClientAnchor){
  87. XSSFDrawing xssfDrawing = (SXSSFDrawing)drawingPatriarchOld;
  88. anchorNew.setDx1(xssfDrawing.getFromDX1(dx));
  89. anchorNew.setDy1(xssfDrawing.getFromDY1(dy));
  90. anchorNew.setDx2(xssfDrawing.getFromDX2(dx));
  91. anchorNew.setDy2(xssfDrawing.getFromDY2(dy));
  92. XSSFPictureData pd=xssfPictureDataList.get(i);
  93. // 添加图片到新的sheet
  94. int pictureIndex = originalWorkbook.addPicture(pd.getData(), pd.getPictureType());
  95. drawingPatriarch.createPicture(anchor, pictureIndex);
  96. }
  97. }
  98. }
  99. }
  100. }
  101. }
  102. // 写入修改后的Workbook到文件
  103. try (FileOutputStream fos = new FileOutputStream(originalFile)) {
  104. originalWorkbook.write(fos);
  105. }
  106. }
  107. }

这段代码会遍历附件中的每个sheet,复制行数据并在目标文件中创建新的sheet,并将原始sheet中的图片复制到目标sheet。请确保已经导入了相关依赖,如Apache POI和FastDFS客户端。同时,请根据您的实际需求进行适当修改和调整。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?