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

阿帕奇 POI - Java - 获取部分名称 - 简报

屈昊天
2023-03-14

Microsoft Powerpoint有一个按部分拆分幻灯片的功能(逻辑分组)。提取部分名称的最佳方法是什么?技术堆栈-

  • 阿帕奇 POI - v5.2.2
  • 爪哇岛

我已经用VBA < code > section name = active presentation实现了同样的效果。section properties . Name(current slide . section index)

共有1个答案

鲁华皓
2023-03-14

Apache POI使用的Office Open XML是2006年定义并首次在Office 2007中发布的Office Open XML。这个OOXML对演示文稿中的部分一无所知。部分是后来(2010年)介绍的。

甚至ECMA-376第五版也没有包含任何关于演示文稿的章节。所以微软还没有公开发布这个扩展的xsd。所以XmlBeans不可能为它创建了类。

因此,如果想要使用这个特性,就必须直接操作XML。

如何获取需要操作的XML?

所有 Office 打开 XML 文件,以及 PowerPoint *.pptx,都是 ZIP 存档,其中包含 XML 文件和特殊目录结构中的其他文件。人们可以简单地解压缩一个*.pptx文件并查看。

查看/ppt/presentation.xml,您将看到XML。

用什么来操作XML?

可以使用org.openxmlformats.schemas.presentationml.x2006.main*poi-oxml-full-5.*中包含的类。jar</code>尽可能长,否则<code>org.apache.xmlbeans。XmlObject</code>和/或<code>org.apache.xmlbeans。xmlbeans-5.*.jar中包含的XmlCursor。但是直接使用<code>XmlObject</code>可能非常费力。

如何获取部分和部分名称的完整示例:

import java.io.FileInputStream;

import org.apache.poi.xslf.usermodel.*;

import org.apache.xmlbeans.XmlObject;
import javax.xml.namespace.QName;

public class PowerPointGetSectionProperties {
    
 static Long getSlideId(XSLFSlide slide) {
  if (slide == null) return null;
  Long slideId = null;
  XMLSlideShow presentation = slide.getSlideShow();
  String slideRId = presentation.getRelationId(slide);
  org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation ctPresentation = presentation.getCTPresentation();
  org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdList sldIdLst = ctPresentation.getSldIdLst();
  for (org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry sldId : sldIdLst.getSldIdList()) {
   if (sldId.getId2().equals(slideRId)) {
    slideId = sldId.getId();
    break;
   }
  }
  return slideId;
 } 
 
 static XmlObject[] getSections(org.openxmlformats.schemas.presentationml.x2006.main.CTExtensionList extList) {
  if (extList == null) return new XmlObject[0]; 
  XmlObject[] sections = extList.selectPath(
    "declare namespace p14='http://schemas.microsoft.com/office/powerpoint/2010/main' "
   +".//p14:section");
  return sections;
 }
 
 static XmlObject[] getSectionSldIds(XmlObject section) {
  if (section == null) return new XmlObject[0];
  XmlObject[] sldIds = section.selectPath(
    "declare namespace p14='http://schemas.microsoft.com/office/powerpoint/2010/main' "
   +".//p14:sldId");
  return sldIds;
 }
 
 static Long getSectionSldId(XmlObject sectionSldId) {
  if (sectionSldId == null) return null;     
  Long sldIdL = null;
  XmlObject sldIdO = sectionSldId.selectAttribute(new QName("id"));
  if (sldIdO instanceof org.apache.xmlbeans.impl.values.XmlObjectBase) {
   String sldIsS = ((org.apache.xmlbeans.impl.values.XmlObjectBase)sldIdO).getStringValue();
   try {
    sldIdL = Long.valueOf(sldIsS); 
   } catch (Exception ex) {
    // do nothing
   }
  }
  return sldIdL;
 }

 static XmlObject getSection(XSLFSlide slide) {
  Long slideId = getSlideId(slide);
  if (slideId != null) {
   XMLSlideShow presentation = slide.getSlideShow();
   org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation ctPresentation = presentation.getCTPresentation();
   org.openxmlformats.schemas.presentationml.x2006.main.CTExtensionList extList = ctPresentation.getExtLst();
   XmlObject[] sections = getSections(extList);
   for (XmlObject section : sections) {
    XmlObject[] sectionSldIds = getSectionSldIds(section);
    for (XmlObject sectionSldId : sectionSldIds) {
     Long sldIdL = getSectionSldId(sectionSldId);
     if (slideId.equals(sldIdL)) {
      return section;
     }
    }
   }
  }
  return null;
 }
 
 static String getSectionName(XmlObject section) {
  if (section == null) return null;
  String sectionName = null;
  XmlObject name = section.selectAttribute(new QName("name"));
  if (name instanceof org.apache.xmlbeans.impl.values.XmlObjectBase) {
   sectionName = ((org.apache.xmlbeans.impl.values.XmlObjectBase)name).getStringValue();
  }
  return sectionName; 
 }

 public static void main(String args[]) throws Exception {

  XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("./PPTXUsingSections.pptx"));

  for (XSLFSlide slide : slideShow.getSlides()) {
   System.out.println(slide.getSlideName());
   XmlObject section = getSection(slide); 
   String sectionName = getSectionName(section);  
   System.out.println(sectionName);
  }

  slideShow.close();
 }
}
 类似资料:
  • Powerpoint幻灯片具有可通过VBA访问和修改的内部名称。参见例如Powerpoint:手动设置幻灯片名称 我想通过apache poi访问该名称。我尝试了: 但只有当幻灯片名称只有默认名称时,才以这种方式获取空字符串。 在阿帕奇POI中获取(甚至设置)pptx文件的幻灯片名称的正确方法是什么?

  • 我创建了此代码以使用Apache POI读取excel文件的内容。我使用eclipse作为编辑器,但当我运行代码时,我的粗体行出现问题。有什么问题?excel的内容如下:

  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 我正在尝试通过angle 4上传一个带有pdf文件的表单 该请求是一个多部分/表单数据请求 我正在使用springboot、apachecamelservlet,我的路径是 在我的处理器中 然后我正在尝试写入如下文件: 无论我怎么尝试,文件总是被破坏。无法在Acrobat reader中打开。

  • 我试图使用apache POI 3.10将excel文件(xlsx)加载到工作簿对象中 我收到一个java。lang.OutofMemoryError 我在JVM上使用带有-Xmx2g参数的Java 8 当我运行程序时,所有4核(64位系统)和RAM(4gb)都达到了最大值 excel工作表有43列和166961行,相当于7179323个单元格 我正在使用Apache POIs WorkBookF

  • 我有一个场景,我需要从pptx (source.pptx)中复制一些幻灯片,并根据幻灯片中的演示笔记将其下载为单独的pptx文件(output.pptx)。我正在使用apache poi来实现它。这是我的代码。 当我打开创建的output.pptx时,我收到以下错误:“PowerPoint发现output.pptx中的内容有问题,PowerPoint可以尝试修复演示文稿。如果您信任此演示文稿的来源