使用带有Apache POI API的Java在单词文档上创建项目符号列表



我需要在word文档中有项目符号列表,其中包含缩进和自定义项目符号,这些项目符号是通过带有Apache POI API的Java生成的。我已经搜索过了,找不到Word文档。它可用于使用文本框的Powerpoint幻灯片。但我不想使用文本框。请告诉我实现它的可能性。非常感谢任何帮助。谢谢谨致问候,Arun Ganesh。P

这实际上只有在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:prefix

        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节点操作)。这会在末尾留下原来的空项目符号,其中包含书签。您需要删除带有段落的书签。getParentNode().removeChild(段落);

然后使用POI保存您的文件。

基本上,POI不支持项目符号列表,因为OOXML并不真正支持项目符号表。项目符号列表只是以编号标记作为子项的一系列段落。但是,使用POI,您总是可以归结为基本的DOM操作,并且可以使用解压缩和整理来检查DOM。

POI的HWPF是一个不成熟的api——首席开发人员得到了一份工作这需要签署一份保密协议,他被迫放弃在里面工作——也许不可能用它来生成您想要的文件。

请参阅后的延续

最新更新