如何使用 apache POI 复制包含图表的幻灯片



亲爱的大家,

我正在使用Apache POI,我想复制一张包含代码中多个图表的幻灯片。

下面的代码(受 https://poi.apache.org/slideshow/xslf-cookbook.html#Merge 启发(在幻灯片上没有图表时工作正常。

不幸的是,这种方法

似乎没有复制图表:当我尝试打开生成的文件时,Powerpoint 检测到问题,尝试修复它,但失败了,我得到空幻灯片。

我已经检查了底层XML文件(使用Open XML SDK(,似乎图表本身(在文件夹/ppt/charts中(没有重复,关系文件(在文件夹/ppt/slides/_rels中(也没有完全更新。

这是我当前的代码:

// Open slideshow
FileInputStream fileInputStream = new FileInputStream(sourceFilePath);
XMLSlideShow slideShow = new XMLSlideShow(fileInputStream);
fileInputStream.close();
// Duplicate slide
XSLFSlideLayout layout = slide.getSlideLayout();
XSLFSlide newSlide = slideshow.createSlide(layout);
newSlide.importContent(slide);
// Save updated slideshow
FileOutputStream fileOutputStream = new FileOutputStream(outputFilePath);
slideShow.write(fileOutputStream);
fileOutputStream.close();

您知道如何克隆幻灯片及其图表吗?

非常感谢,并致以最诚挚的问候!

你不能。我试了又试,问题是重复不处理图像或图表。

我必须通过脚本手动复制文件。以下是步骤:

  • 找到幻灯片文件
  • 复制它
  • 在 XML 文件中查找图表对象,并记下关系 Id
  • 在关系文件中,检查由关系 ID 指定的文件
  • 复制此文件
  • 您还必须复制新幻灯片的关系文件,并更新名称
  • 新幻灯片不可见,您必须更新演示文稿.xml
  • 请注意:如果您希望PPTX与Microsoft Powerpoint一起使用,则还必须复制关联的Excel工作簿(请参阅图表的关系文件(

我的问题与 5.2.2 版的问题非常接近,图表确实被正确复制,但对工作表内部工作簿的引用也被复制了,通过引用!(实际上在这里完成:https://apache.googlesource.com/poi/+/refs/tags/REL_5_2_2/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java#241(

这意味着当我编辑复制幻灯片中的图表值时,我编辑了两个图表值。起初,它在 PowerPoint 中在视觉上没有区别,但当您右键单击>编辑图表上的数据时,它会重新呈现,数据在视觉上发生变化。

为避免这种情况,只需将图表的工作簿重新设置为 null,以便它为复制的图表创建(或真正从关系部分加载(一个新

工作簿

使用图表复制幻灯片的代码应如下所示:

        XSLFSlide oldSlide = ppt.getSlides().get(number);
        XSLFSlideLayout layout = oldSlide.getSlideLayout();
        XSLFSlide newSlide = ppt.createSlide(layout);
        newSlide.importContent(oldSlide);
        newSlide.getRelations().stream()
                .filter(r -> r instanceof XSLFChart)
                .forEach(chart->((XSLFChart)chart).setWorkbook(null));
        //to force loading the correct worksheet

我希望它能帮助一些人偶然发现这个:)

从Apache POI 4.0.0开始,问题的原始代码将用于复制幻灯片。

最新更新