使用Apache POI API在Java中创建Word文档的项目符号列表

6
我需要在Word文档中生成带有缩进和自定义符号的项目列表,这是使用Java和Apache POI API生成的。我已经搜索了一下,但无法找到适用于Word文档的方法。虽然可以在PowerPoint幻灯片中使用文本框来实现此功能,但我不想使用文本框。请告诉我如何实现此功能。非常感谢您的任何帮助。
谢谢! 祝好, Arun Ganesh. P
2个回答

2

只有使用2007年的OOXML格式及以上版本(使用POI的XWPF)才能实现这一点。由于它基于XML,您始终可以执行DOM操作来实现所需内容。制作项目符号列表的最简单方法是创建一个项目符号列表,并将书签添加为该项目符号的文本。在处理文档时,找到您的书签,然后获取带有

的DOM节点。

`org.w3c.dom.Node bkmk = bookmark.getctBookmark).getDomNode();`

然后,复制bkmk节点的父级,即段落标签。现在你有了一个重复的段落标签,它具有成为项目符号列表一部分所需的所有子标签。在OOXML中,没有项目符号列表的结构,它只是具有类似编号子标记的段落的连续序列。

<w:p>
  <w:pPr>
    <w:pStyle w:val="style0" />
    <w:numPr>
      <w:ilvl w:val="1" />
      <w:numId w:val="2" />
    </w:numPr>
    <w:tabs>
      <w:tab w:leader="none" w:pos="1807" w:val="left" />
    </w:tabs>
    <w:spacing w:after="0" w:before="120" />
    <w:ind w:end="907" w:hanging="360" w:start="907" />
    <w:jc w:val="both" />
  </w:pPr>
  <w:bookmarkStart w:id="1" w:name="GIVES" />
  <w:r>
    <w:t>To be inserted Next Bullet</w:t>
  </w:r>
  <w:bookmarkEnd w:id="1" />
  <w:r>
    <w:rPr>
      <w:rFonts w:eastAsia="Times New Roman" />
      <w:color w:val="000000" />
      <w:lang w:eastAsia="en-US" />
    </w:rPr>
  </w:r>
</w:p>

关键标签是、和。我不太熟悉标签的XML含义,但如果您解压任何docx文件并查看document.xml(当然要使用tidy进行格式化),您就可以看到带有编号和不带编号的段落之间的区别。
因此,一旦您克隆了标签,您可以遍历DOM节点以获取并替换节点值为所需内容,或者您可以使用xpath查找节点(w:r/w:t)。您必须设置NamespaceContext并给它正确的代码以理解w:前缀。
        NodeList nl;
        XPath xp = XPathFactory.newInstance().newXPath();
        NamespaceContext nsContext = new NamespaceContext(){
            @Override public String getNamespaceURI(String prefix) {
                if (prefix.equals("w")) {
                    return "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
                }
                return null;
              }

              @Override public String getPrefix(String namespaceURI) {
                return null;
              }

              @Override public Iterator<?> getPrefixes(String namespaceURI) {
                return Collections.emptyList()
                    .iterator();
              }
            };
        xp.setNamespaceContext(nsContext);
        nl =  (NodeList) xp.evaluate("w:r/w:t", copy, XPathConstants.NODESET);

现在,遍历nodeList,设置nodeValue("Hello World")。在克隆和执行以下操作后,您可以这样做:paragraph.getParentNode().insertBefore(bkmk, paragraph);来获得所需的任意多个项目符号。如果您这样做
 `paragraph.getParentNode().append(bkmk)`

你的新项目将会在文档末尾!因此,你必须使用insertBefore(除了append之外,它是唯一可用的dom节点操作)。这会使你原来的空项目留在最后,并带有书签。你需要使用paragraph.getParentNode().removeChild(paragraph)删除段落中的书签。然后使用POI保存文件。基本上,POI不支持项目符号列表,因为OOXML实际上并不支持项目符号列表。项目符号列表只是具有编号标记作为子元素的段落运行。但是,使用POI,您始终可以倒退到基本的DOM操作,并且可以使用unzip和tidy检查DOM。

1
POI的HWPF是一个不成熟的API - 主要开发人员被提供了一份工作, 其中涉及签署保密协议,他被迫放弃在其中工作 - 并且可能无法使用它生成您想要的文件。
请查看帖子的延续

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接