如何使用ApachePoi编辑presProps.xml文件

时间:2018-03-12 16:27:23

标签: apache-poi powerpoint

我需要有一个powerpoint循环,直到用户点击转义键。通过在powerpoint的幻灯片设置选项中选中“循环连续直到'ESC'”选项后保存和解压缩文件,我有一个更改文件的差异(ppt / presProps.xml)

未修复:

<p:presentationPr xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
   <p:showPr showNarration="1">
      <p:present />
      <p:sldAll />
      <p:penClr>
         <a:prstClr val="red" />
      </p:penClr>
      <p:extLst>
         <p:ext uri="{EC167BDD-8182-4AB7-AECC-EB403E3ABB37}">
            <p14:laserClr xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main">
               <a:srgbClr val="FF0000" />
            </p14:laserClr>
         </p:ext>
         <p:ext uri="{2FDB2607-1784-4EEB-B798-7EB5836EED8A}">
            <p14:showMediaCtrls xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1" />
         </p:ext>
      </p:extLst>
   </p:showPr>
   <p:extLst>
      <p:ext uri="{E76CE94A-603C-4142-B9EB-6D1370010A27}">
         <p14:discardImageEditData xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="0" />
      </p:ext>
      <p:ext uri="{D31A062A-798A-4329-ABDD-BBA856620510}">
         <p14:defaultImageDpi xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="220" />
      </p:ext>
      <p:ext uri="{FD5EFAAD-0ECE-453E-9831-46B23BE46B34}">
         <p15:chartTrackingRefBased xmlns:p15="http://schemas.microsoft.com/office/powerpoint/2012/main" val="0" />
      </p:ext>
   </p:extLst>
</p:presentationPr>

修正:

<p:presentationPr xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
   <p:showPr loop="1" showNarration="1">
      <p:present />
      <p:sldAll />
      <p:penClr>
         <a:prstClr val="red" />
      </p:penClr>
      <p:extLst>
         <p:ext uri="{EC167BDD-8182-4AB7-AECC-EB403E3ABB37}">
            <p14:laserClr xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main">
               <a:srgbClr val="FF0000" />
            </p14:laserClr>
         </p:ext>
         <p:ext uri="{2FDB2607-1784-4EEB-B798-7EB5836EED8A}">
            <p14:showMediaCtrls xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1" />
         </p:ext>
      </p:extLst>
   </p:showPr>
   <p:extLst>
      <p:ext uri="{E76CE94A-603C-4142-B9EB-6D1370010A27}">
         <p14:discardImageEditData xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="0" />
      </p:ext>
      <p:ext uri="{D31A062A-798A-4329-ABDD-BBA856620510}">
         <p14:defaultImageDpi xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="220" />
      </p:ext>
      <p:ext uri="{FD5EFAAD-0ECE-453E-9831-46B23BE46B34}">
         <p15:chartTrackingRefBased xmlns:p15="http://schemas.microsoft.com/office/powerpoint/2012/main" val="0" />
      </p:ext>
   </p:extLst>
</p:presentationPr>

元素差异:

3c3
<    <p:showPr showNarration="1">
---
>    <p:showPr loop="1" showNarration="1">

看起来它位于表示元素中的p元素上,但我无法弄清楚如何在POI中设置该属性。

1 个答案:

答案 0 :(得分:2)

这只是一个快速的黑客,以显示无法通过API访问的包部件的修改。由于XmlBeans将循环属性设置为"true"而不是"1",因此可能需要通过XmlCursor API设置它。

public static void main(String[] args) throws Exception {
    OPCPackage opc = OPCPackage.open("headers.pptx", PackageAccess.READ_WRITE);
    try (XMLSlideShow ppt = new XMLSlideShow(opc)) {
        PackagePart presProps = ppt.getPackage().getPart(PackagingURIHelper.createPartName("/ppt/presProps.xml"));
        PresentationPrDocument doc = PresentationPrDocument.Factory.parse(presProps.getInputStream());
        CTPresentationProperties pr = doc.getPresentationPr();
        CTShowProperties showPr = pr.isSetShowPr() ? pr.getShowPr() : pr.addNewShowPr();
        showPr.setLoop(true);
        presProps.clear();
        try (OutputStream os = presProps.getOutputStream()) {
            doc.save(os);
        }
    }
}