2012-01-18 444 views
6

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

回答

1

POI的HWPF是一个不成熟的API - 的首席开发人员有一个工作机会 一项需承担签署了保密协议,他被迫 在它抛弃工作 - 它可能无法使用它到 生成你想要的文件。

continuation of the post

2

这确实是与2007 OOXML格式只能和最多(使用POI的XWPF)。由于它基于XML,因此您可以始终执行DOM操作来实现您想要的功能。制作项目符号点的最简单方法是创建一个项目符号列表并添加一个书签作为该项目符号的文本。当处理文档,找到你的书签,然后用

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

获得DOM节点之后,复制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); 

现在,遍历节点列表,setNodeValue(的“Hello World”)。你可以在克隆和做之后做到这一点: paragraph.getParentNode().insertBefore(bkmk, paragraph);

获得尽可能多的项目符号点,你想。如果你这样做

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

你的新的重点将在文件的最后!

所以,你必须做insertBefore(它是唯一可用的除了append之外的dom节点操作)。这会在最后留下原始的空白项目符号,并在其中添加书签。您需要使用paragraph.getParentNode()去除书签。removeChild(paragraph);

然后用POI保存你的文件。

基本上,POI不支持项目符号列表,因为OOXML并不真正支持项目符号列表。项目符号列表只是一个带有编号标签的段落。但是,通过POI,您可以始终使用基本的DOM操作,并且可以使用unzip和整齐的方式检查DOM。