使用带有Apache POI API的Java在word文档上创建Bullet列表

时间:2012-01-18 10:15:00

标签: java list apache-poi

我需要在word文档中包含带有缩进和自定义项目符号的项目符号列表,这是通过Java使用Apache POI API生成的。我搜索过,我无法找到Word文档。它可用于使用文本框的Powerpoint幻灯片。但我不想使用文本框。请让我知道实现它的可能性。任何帮助非常感谢。 谢谢! 带着敬意, Arun Ganesh。 P

2 个答案:

答案 0 :(得分: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(当然用格式化后),你可以看到有和没有编号的段落之间的差异。

因此,一旦克隆了标记,就可以使用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,setNodeValue(“Hello World”)。您可以在克隆并执行以下操作后执行此操作:     paragraph.getParentNode().insertBefore(bkmk, paragraph);

获得尽可能多的子弹点。如果你这样做

 `paragraph.getParentNode().append(bkmk)`

您的新项目符号将位于文档的最后!

所以,你必须做insertBefore(它是除append之外唯一可用的dom节点操作)。这样就可以在最后留下原始的空子弹点,其中包含书签。您需要使用paragraph.getParentNode()。removeChild(paragraph);

删除书签

然后使用POI保存文件。

基本上,POI不支持项目符号列表,因为OOXML并不真正支持项目符号列表。子弹列表只是一段带有编号标签作为子项的段落。但是,使用POI,您可以始终遵循基本的DOM操作,并且可以通过解压缩和整洁来检查DOM。

答案 1 :(得分:1)

  POI的HWPF是一个不成熟的API - 首席开发人员获得了一份工作   这需要签署保密协议,他被迫   放弃在其中工作 - 并且可能无法使用它   生成你想要的文件。

请参阅continuation of the post