我有一个带有一些粗体文本的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());
}
文件内容如下:
错误
2.1。一些文字
2.1.1。 汇集 –一些文字
奇怪的是,文件开头的标题( HANKELEPINGUÜLDTINGIMUSED)是粗体的,但是之后没有任何内容是粗体的。
答案 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