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

使用apache POI读取重复部分的内容

仲学真
2023-03-14

我有一个带有重复部分的word文档,包含其他内容控件。在java project中,我有一个函数,它从apache POI中的word文档中获取所有SDT(内容控件)。当我检查列表中的重复部分时,我可以在所有内容控件中(在重复部分中)获取文本,但它作为一个长段落而不是其他sdt节点。是否有一种方法可以使用Apache POI检查重复部分sdt的内容?我在医生里找不到任何关于它的东西

获取所有sdts私有静态列表的

extractSDTsFromBodyElements(List<IBodyElement> elements) {
        List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
        for (IBodyElement e : elements) {
            if (e instanceof XWPFSDT) {
                XWPFSDT sdt = (XWPFSDT) e;
                sdts.add(sdt);
            } else if (e instanceof XWPFParagraph) {

                XWPFParagraph p = (XWPFParagraph) e;
                for (IRunElement e2 : p.getIRuns()) {
                    if (e2 instanceof XWPFSDT) {
                        XWPFSDT sdt = (XWPFSDT) e2;
                        sdts.add(sdt);
                    }
                }
            }
        }
        return sdts;
    }

共有1个答案

薄欣怿
2023-03-14

到目前为止,Apache POI中的XWPF部分还很初级,并且处于高度开发阶段。在XWPFSDT中也提到:“实验班提供对StructuredDocumentTags/ContentControl的基本只读处理”。因此,到目前为止,您的代码只获取重复内容控件的周围XWPFSDT,而不是内部控件。通过代码中的一些调试输出,我们可以看到这一点。请参阅我的system.out.println(...)

因此,要真正获得所有XWPFSDT,我们必须采用其他方法,直接使用底层XML

让我们举一个完整的例子。

import java.io.FileInputStream;

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

import java.util.List;
import java.util.ArrayList;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.apache.xmlbeans.XmlCursor;
import javax.xml.namespace.QName;

public class ReadWordForm {

/*
 private static List<AbstractXWPFSDT> extractSDTsFromBodyElements(List<IBodyElement> elements) {
  List<AbstractXWPFSDT> sdts = new ArrayList<AbstractXWPFSDT>();
  for (IBodyElement e : elements) {
   if (e instanceof XWPFSDT) {
    XWPFSDT sdt = (XWPFSDT) e;
System.out.println("block: " + sdt);
    sdts.add(sdt);
   } else if (e instanceof XWPFParagraph) {
    XWPFParagraph p = (XWPFParagraph) e;
    for (IRunElement e2 : p.getIRuns()) {
     if (e2 instanceof XWPFSDT) {
      XWPFSDT sdt = (XWPFSDT) e2;
System.out.println("inline: " + sdt);
      sdts.add(sdt);
     }
    }
   }
  }
  return sdts;
 }
*/

 private static List<XWPFSDT> extractSDTsFromBody(XWPFDocument document) {
  XWPFSDT sdt;
  XmlCursor xmlcursor = document.getDocument().getBody().newCursor();
  QName qnameSdt = new QName("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "sdt", "w");
  List<XWPFSDT> allsdts = new ArrayList<XWPFSDT>();
  while (xmlcursor.hasNextToken()) {
   XmlCursor.TokenType tokentype = xmlcursor.toNextToken();
   if (tokentype.isStart()) {
    if (qnameSdt.equals(xmlcursor.getName())) {
     if (xmlcursor.getObject() instanceof CTSdtRun) {
      sdt = new XWPFSDT((CTSdtRun)xmlcursor.getObject(), document); 
//System.out.println("block: " + sdt);
      allsdts.add(sdt);
     } else if (xmlcursor.getObject() instanceof CTSdtBlock) {
      sdt = new XWPFSDT((CTSdtBlock)xmlcursor.getObject(), document); 
//System.out.println("inline: " + sdt);
      allsdts.add(sdt);
     }
    } 
   }
  }
  return allsdts;
 }

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

  XWPFDocument document = new XWPFDocument(new FileInputStream("WordDataCollectingForm.docx"));

/*
  List<IBodyElement> bodyelements = document.getBodyElements();
  List<AbstractXWPFSDT> sdts = extractSDTsFromBodyElements(bodyelements);
*/

  List<XWPFSDT> allsdts = extractSDTsFromBody(document);

  for (XWPFSDT sdt : allsdts) {
//System.out.println(sdt);
   String title = sdt.getTitle();
   String content = sdt.getContent().getText();
   if (!(title == null) && !(title.isEmpty())) {
    System.out.println(title + ": " + content);
   } else {
    System.out.println("====sdt without title====");
   }
  }

  document.close();
 }
}
 类似资料:
  • 嗨,我想在第一行搜索一个字符串,如果找到了,我想移动那一列。

  • 我想访问“onload”功能之外的文件内容。我知道这与异步有关。下面是我的js函数: 谢谢大家!

  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 问题内容: 我想通过读取文件的第一部分并分析内容来确定文件的类型(通常为UTF-8)。(该类型特定于我的社区,但不受我的控制,并且不受MIME / MediaType覆盖,通常为TEXT_PLAIN)。我正在客户端上使用’org.restlet’库来分析标头 所以我知道内容的长度,并且可以(如果有必要和可能的话)估算应该下载多少字节进行分析 澄清:我无法使用MediaType。从答案1看来我必须获

  • 我无法读取通过XMLHttpRequest发布的烧瓶中的数据。我正在使用这个jquery插件裁剪图像并上传到服务器 https://codecanyon.net/item/slim-image-cropper-responsive-uploading-and-ratio-cropping-plugin/16364167 数据-有关图像的信息在json中收集和隐藏,然后使用XMLHttpReques

  • 如何在类本身中正确地键入类?在PyCharm中,我当前遇到以下错误: 这是一个未解决的引用错误。这通常是有意义的,因为我不期望PyCharm完美地支持类型。但是,当我使用它在其他类除了类本身没有错误: 因此,我认为只有在类型提示在其自己的类中提供时,才会出现错误。所以我不知道该怎么做来防止这个错误,或者我是否使用了错误的类型,并且类型本身不应该被使用。 基本上,我试图模仿的行为是,您有一个项目的工