从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中的任何变化可能会破坏这一点吗?谢谢
你的观察是正确的。
改变的是方法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