java - 如何使用 POI 在 Word 中读取标题编号

标签 java apache-poi ms-office

Word 文档中,结构如下:

1  Title 1
   1.1  title 1.1
   1.2  title 1.2
        1.2.1  title 1.2.1
   1.3  title 1.3

我可以使用 阅读标题,但无法读取自动生成的标题之前的数字。

我想知道是否有办法使用 来读取它

最佳答案

恐怕您必须自己计算,以下是您可以在 XWPFParagraph 对象上使用的方法来提取您需要的数据:

您可以这样使用它们:

for (XWPFParagraph paragraph : paragraphList) {
    System.out.println("text: "+paragraph.getNumLevelText());
    System.out.println("depth: "+paragraph.getNumIlvl());
    System.out.println("format: "+paragraph.getNumFmt());
}

我尝试过这个文件:

enter image description here

它输出:

text: %1.
depth: 0
format: decimal

text: %1.%2.
depth: 1
format: decimal

text: %1.%2.
depth: 1
format: decimal

text: %1.%2.%3.
depth: 2
format: decimal

text: %1.%2.
depth: 1
format: decimal

因此,从那里您将知道每个标题的格式是什么。您需要自己评估。

编辑

这可能适合你。由于只有小数,因此这是一个简单的情况。

int[] levelCurrentValues = new int[] {0,0,0};

for (XWPFParagraph paragraph : paragraphList) {
    String levelText = paragraph.getNumLevelText();
    BigInteger levelDepth = paragraph.getNumIlvl();
    String levelFormat = paragraph.getNumFmt();
    System.out.println("text: "+levelText);
    System.out.println("depth: "+levelDepth);
    System.out.println("format: "+levelFormat);

    if(levelText!=null) {
        levelCurrentValues[levelDepth.intValue()] += 1;

        levelText = levelText.replace("%1", "" + levelCurrentValues[0]);
        levelText = levelText.replace("%2", "" + levelCurrentValues[1]);
        levelText = levelText.replace("%3", "" + levelCurrentValues[2]);
        System.out.println(levelText);
        System.out.println("");
    }
}

当针对与上面相同的文件运行时,它输出

text: %1.
depth: 0
format: decimal
1.

text: %1.%2.
depth: 1
format: decimal
1.1.

text: %1.%2.
depth: 1
format: decimal
1.2.

text: %1.%2.%3.
depth: 2
format: decimal
1.2.1.

text: %1.%2.
depth: 1
format: decimal
1.3.

关于java - 如何使用 POI 在 Word 中读取标题编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49868902/

相关文章:

java - JRadioButton 未正确显示

java - Play Framework : Sending CSV file as an attachment

java - 在 BDD 测试用例中使用模拟是否明智?

linux - 在 Linux 上以编程方式查看 Microsoft Office 文件

ms-office - 办公室剪贴板格式

c# - MODI还在维护吗?

java - 关于object Casting的疑惑

Java:从 JTextField 获取用户输入

java apache poi(第 2 部分)

apache-poi - 我可以同时使用 jxls 和 apache poi 吗?