gpt4 book ai didi

java - 使用 Java 和 Apache POI API 在 word 文档上创建项目符号列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:48 25 4
gpt4 key购买 nike

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

最佳答案

这实际上只适用于 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:吨)。您必须设置一个 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(这是除追加之外唯一可用的 dom 节点操作)。这使您在末尾留下原始的空项目符号点,其中包含书签。您需要使用 paragraph.getParentNode().removeChild(paragraph); 删除书签;

然后用 POI 保存你的文件。

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

关于java - 使用 Java 和 Apache POI API 在 word 文档上创建项目符号列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8908402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com