Apache POI XWPFRun isBold无法检测到粗体

时间:2019-02-04 12:33:46

标签: java apache-poi

我有一个带有一些粗体文本的doxc文档。由于某种原因,run.isBold()返回false,尽管run itel用粗体显示。这里可能是什么问题?

我用来读取文件的代码:

XWPFDocument document = new XWPFDocument(fis);
        for(XWPFParagraph paragraphs: document.getParagraphs()){

            for(XWPFRun run: paragraphs.getRuns()){
                System.out.println(run.isBold());

                System.out.println(run.text());
        }

文件内容如下:

  1. 错误

    2.1。一些文字

    2.1.1。 汇集 –一些文字

奇怪的是,文件开头的标题( HANKELEPINGUÜLDTINGIMUSED)是粗体的,但是之后没有任何内容是粗体的。

1 个答案:

答案 0 :(得分:1)

检查完您的test.docx文件后,我可以告诉您以下信息:

文本“Üldosa”和“ Misted”不是粗体,因为它们的格式为粗体,而是因为整个段落的样式为“ Heading2”。文本“池”也未设置为粗体格式,而是应用了特殊字符样式“ Paks”。因此,有人广泛使用了Word Styles。一点也不差。正如应该使用CSS样式表而不是直接使用HTML格式化一样,在Word中,也应该首选使用样式。但是当然,解析时的问题也相同。没有额外的解析样式表,就无法确定文本的显示方式。不幸的是,apache poi直到现在还不太在意样式。

如何才能获得这种见解? *.docx文件只是ZIP存档。因此,我们可以将其解压缩并找到:

/word/document.xml

<w:r ...>
 <w:rPr>
  ...
  <w:b/>
  ...
 </w:rPr>
 <w:t>HANKELEPINGU ÜLDTINGIMUSED</w:t>
</w:r>

这是直接以粗体显示的文本。

但是

<w:p ...>
 <w:pPr>
  <w:pStyle w:val="Heading2"/>
  <w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr> 
  ...
 </w:pPr>
 <w:r ...>
  <w:t>Üldosa</w:t>
 </w:r>
</w:p>

这是样式为“ Heading2”的段落,并自动编号。

那为什么该文本为粗体?在/word/styles.xml中,我们发现:

<w:style w:type="paragraph" w:styleId="Heading2">
 <w:name w:val="heading 2"/>
 <w:basedOn w:val="Normal"/>
 ...
 <w:link w:val="Heading2Char"/>
 ...
</w:style>

这是段落样式“ Heading2”,链接到字符样式“ Heading2Char”。

<w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char">
 <w:name w:val="Heading 2 Char"/>
 ...
 <w:link w:val="Heading2"/>
 ...
 <w:rPr>
  ...
  <w:b/>
  ...
 </w:rPr>
</w:style>

这是设置为粗体的字符样式“ Heading2Char”。

要回答这个问题,如何使用apache poi进行操作,必须知道apache poi XWPF基于org.openxmlformats.schemas.wordprocessingml.x2006.main.*的{​​{1}}类。因此,我们需要有关此的信息。不幸的是,没有公开的ooxml-schemas.*.jar文档。因此,我们需要下载源代码并自行API

那下一步该怎么做?遍历段落并按照您已经完成的方式运行。但是,对于每个段落,请尝试获取该段落的样式。如果有,请获取它的字符样式,然后检查其提供的设置。另外,对于每次运行,请尝试获取此运行的字符样式。如果有,请获取并检查其提供的设置。

以下代码正在执行此操作,但仅用于检查样式是否提供粗体设置。因此,它实际上还不完整,要使其完整将非常昂贵。

javadoc