【问题标题】:Read content of repeating sections with apache POI使用 apache POI 阅读重复部分的内容
【发布时间】:2018-01-19 21:29:35
【问题描述】:

我有一个带有重复部分的 word 文档,其中包含其他内容控件。 在 java 项目中,我有一个函数可以从 apache POI 的 word 文档中的 List List 中获取所有 sdts(内容控件)。 当我检查该列表中的重复部分时,我可以在所有内容控件(在我的重复部分内)中获取文本,但它是一个长段落而不是其他 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;
    }

【问题讨论】:

  • 人类交流的一项基本规则是,如果有人提出问题并且有人尝试帮助并回答该问题,则至少会表现出任何形式的反应。对于试图提供帮助的人来说,根本不做出反应看起来非常忘恩负义。
  • 对不起,我忘了回答,我会在下次做这个项目时测试你提供的代码,谢谢你的回答,我会在测试代码时反馈

标签: ms-word apache-poi


【解决方案1】:

apache poiXWPF 部分到目前为止还很初级,并且正在高度开发中。在XWPFSDT 中也提到了这一点:“提供结构化文档标签/内容控制的基本只读处理的实验类”。所以到目前为止,您的代码只能获得重复内容控件的周围 XWPFSDT 而不是内部控件。通过在代码中包含一些调试输出可以看出这一点。见我的System.out.println(...)

所以要真正获得所有XWPFSDTs,我们必须直接使用底层XML

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

看看这个Worddocument:

如您所见,有一个用于输入组名的控件,然后是一个围绕三个控件的重复内容控件,用于输入名称、金额和日期,然后是一个用于输入员工的控件。应读取的所有控件都设置了标题。所以是否设置了标题,是一个控件是否对阅读重要的标准。

以下代码现在可以读取所有控件及其内容:

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();
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2016-02-20
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多