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

Apache POI:更改应用于错误的幻灯片

越学文
2023-03-14

从poi 3.17升级到5. x时,我有一个非常奇怪的行为。

在新poi版本中,文本替换是在错误的幻灯片上完成的。它会修改原始模板幻灯片,而不是对复制的幻灯片进行修改。

我使用现有的演示文稿,其中有一张“模板”幻灯片。复制此模板幻灯片,然后替换某些文本。这在旧版本中非常有效。

以下是我用于创建模板幻灯片副本的代码:

SlideShow slides = new XMLSlideShow(inputStream);
XSLFSlide template = slides.getSlides().get(SLIDE_INDEX_TEMPLATE);

XSLFSlide newSlide = slides.createSlide(template.getSlideLayout());
newSlide.importContent(template);

这里是文本替换的简化版本

for (XSLFShape shape: slide) {
    if (shape instanceof XSLFTextShape) {
        XSLFTextShape textShape = (XSLFTextShape) shape;
        List<XSLFTextParagraph> textBoxParagraphs = textShape.getTextParagraphs();
        List<XSLFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.stream().map(XSLFTextParagraph::getTextRuns).flatMap(List::stream).collect(Collectors.toList());
        for (XSLFTextRun r : textBoxParagraphTextRuns) {
            r.setText("Replaced!");
        }
    }
}

你知道我做错了什么,或者poi中的任何变化可能会破坏这一点吗?谢谢

共有1个答案

卞俊贤
2023-03-14

你的观察是正确的。

改变的是方法XSLFSheet。导入内容(XSLFSheet src)

3.17版是XSLFSheet。导入内容(XSLFSheet src):

/**
 * Set the contents of this sheet to be a copy of the source sheet.
 * This method erases any existing shapes and replaces them with
 * object from the source sheet.
 *
 * @param src the source sheet to copy data from
 * @return modified 'this'
 */
public XSLFSheet importContent(XSLFSheet src){
    _shapes = null;
    _spTree = null;
    _drawing = null;
    _spTree = null;
    _placeholders = null;

    // fix-me: wth would this ever happen to work ...
    
    
    // first copy the source xml
    getSpTree().set(src.getSpTree());

    // recursively update each shape
    List<XSLFShape> tgtShapes = getShapes();
    List<XSLFShape> srcShapes = src.getShapes();
    for(int i = 0; i < tgtShapes.size(); i++){
        XSLFShape s1 = srcShapes.get(i);
        XSLFShape s2 = tgtShapes.get(i);

        s2.copy(s1);
    }
    return this;
}

5.2.2版本是XSLFSheet.import内容(XSLFSheet src):

/**
 * Set the contents of this sheet to be a copy of the source sheet.
 * This method erases any existing shapes and replaces them with
 * object from the source sheet.
 *
 * @param src the source sheet to copy data from
 * @return modified 'this'
 */
public XSLFSheet importContent(XSLFSheet src){
    _spTree = null;

    // first copy the source xml
    getSpTree().set(src.getSpTree().copy());

    wipeAndReinitialize(src, 0);

    return this;
}

wipeAndRe首始化(src,0);重新初始化源幻灯片而不是目标幻灯片。这最好是wipeAndRe首始化(this,0);

你可以向https://bz.apache.org/bugzilla/buglist.cgi?list_id=200662

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

  • 使用幻灯片组件,你需要在 sm.js 和 sm.css 之后额外引入如下两个文件: <link rel="stylesheet" href="//g.alicdn.com/msui/sm/0.6.2/css/sm-extend.min.css"> <script type='text/javascript' src='//g.alicdn.com/msui/sm/0.6.2/js/sm-exte

  • Progress,进度条,用于上传、下载等耗时并且需要显示进度的场景,用户可以随时中断该操作。在mpvue框架中实现这个功能是基于小程序的原生progress 组件,这里主要说一下它percent属性: percent 类型:Float 默认值:无 可选值:0-100 说明:百分比0~100 要实现上传或者下载过程中显示进度的效果,就需要实时修改 percent属性的值,下面示例代码是每隔 20m

  • 幻灯片秀 自动依顺序显示每张图像。 播放幻灯片秀 同时播放音乐与幻灯片秀 使用操作接口 利用PSP™主机的按钮或线控装置进行操作

  • 是否有可能更改单个Swiper-Slide onclick中的内容? 我在每个滑动滑块中都有顺序编号的div,当单击单个div时,这些div应该覆盖一个图像。我知道JS得到了响应,因为当点击它时,它会改变swiper容器之外的其他div。 我试过: 但滑动器内部没有任何变化。以下是我的Swiper初始化,以备不时之需: 提前道谢。

  • 我正在使用Apache POI修改pptx。我想立刻改变整个pptx的字体。 我知道在Powerpoint中,通过更改主题的字体(如果幻灯片都使用这些字体),这是可能的,但我无法通过ApachePOI使其工作。 到目前为止,我发现我可以通过使用例如来设置单个XSLFTextRun的字体系列。 编辑:我发现 XSLF滑行大师的 XSLF 主题类确实有一个 getMajorFont() 和一个 get