当前位置: 首页 > 知识库问答 >
问题:

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

杨飞语
2023-03-14

亲爱的大家:

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

下面的代码(灵感来源于https://poi.apache.org/slideshow/xslf-cookbook.html#Merge)当幻灯片上没有图表时工作正常。

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

我已经检查了底层的XML文件(使用Open XML SDK),似乎图表本身(在文件夹/ppt/图表中)没有重复,关系文件(在文件夹/ppt/幻灯片/_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();

你知道我如何克隆幻灯片和它的图表吗?

非常感谢,并致以最良好的问候!

共有3个答案

陈季
2023-03-14

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

赫连靖琪
2023-03-14

在5.2.2版中,我的问题和你的很接近,图表确实被正确地复制了,但是对工作表内部工作簿的引用也被复制了,通过引用!(实际是在这里做的:https://apache.googlesource.com/poi//refs/tags/REL _ 5 _ 2 _ 2/poi-oo XML/src/main/Java/org/Apache/poi/xslf/user model/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

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

华恩
2023-03-14

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

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

    < li >找到幻灯片文件 < li >复制它 < li >在XML文件中找到图表对象,并记下关系Id < li >在关系文件中,检查由关系Id指定的文件 < li >复制此文件 < li >您还必须为新幻灯片复制关系文件,并更新名称 < li >新幻灯片不可见,您必须更新presentation . XML < li >请注意:如果您希望您的PPTX与Microsoft Powerpoint一起工作,您还必须复制相关的Excel工作簿(请参见图表中的关系文件)
 类似资料:
  • 我正在尝试在Apache POI中复制一张幻灯片。 根据幻灯片内容,我有三种情况 > 复制成功(对于某些带有XSLFPictureShape对象的幻灯片) 当POI试图复制XSLFPictureShape时,我得到NullPointerException(堆栈跟踪) 线程 “main” java.lang.NullPointerException at org.apache.poi.xslf.us

  • 本文向大家介绍使用impress.js制作幻灯片,包括了使用impress.js制作幻灯片的使用技巧和注意事项,需要的朋友参考一下 上周看到一个朋友做了很炫的缩放式幻灯片,可能因为对此知识了解的不多,找了好久才找到几个web幻灯片工具。通过筛选决定用Geek的 impress.js 。 impress.js是一款新兴的幻灯工具,它的效果类似Prezi,但是拥有3D的功能,而且是在MIT&GPL协议

  • 现在我生成了一组幻灯片,当我以pps形式打开它时,它不会在幻灯片之间转换,除非我在微软的powerpoint编辑器中打开它(我可以在其中添加转换)并保存它。然后它可以正常转换。 我认为这与幻灯片母版有关:https://poi.apache.org/apidocs/org/apache/poi/xslf/usermodel/XSLFSlideMaster.html但我不确定它是如何使用的,因为它说

  • 有没有办法把一个幻灯片从一个幻灯片完全复制到另一个幻灯片,包括所有的方框位置,颜色,字体等等。? 参考食谱,我有下面 然而,背景与“from”pptx不匹配,并且一些文本框被移动了。我猜颜色是因为我没有修改母版,而移动是因为与锚相关的东西。我也尝试了我认为会迫使一张幻灯片的母版转移到另一张幻灯片上的方法,但它的作用与上面的相同。

  • 在后台扩展工具》幻灯片分类 添加分类标识为"portal_index"的分类,然后在此分类添加幻灯片; cat_name:幻灯片类型名称 cat_idname:幻灯片标示 slide_name:幻灯片名称 slide_pic:幻灯片图片地址 slide_url:幻灯片URL slide_des:幻灯片描述 slide_content:幻灯片内容 <php> $home_slides=sp_get

  • 本文向大家介绍如何使用C#操作幻灯片,包括了如何使用C#操作幻灯片的使用技巧和注意事项,需要的朋友参考一下 记得老师讲课的时候,经常会用PPT遥控翻页笔来遥控幻灯片来给我们讲课,当时觉得非常有趣,由于这段时间接触了VSTO相关的开发,了解到了Office的相关产品都公开了一些API来让我们对Office产品进行二次开发,这时候我就想,能不能用PowerPoint公开的对象来制作一个遥控幻灯片的程序