最近有个需求,在 word 模板文档上设置书签,然后从数据库中查询数据,填充到
word 文档书签位置,刚拿到需求时,使劲在网上找资料。幻想第三方 jar 包,帮我实现。有
Apatch 的 POI,java2word,jcob 等,一直让我无法实现。POI 操作 word 只能获取 word 中的书
签,并不能进行操作.java2word 可以实现,但是除了 java2word.jar 包以外,还要一个 dll 文
件放在 system32 文件夹下,环境部署在 linux 服务器上,谁允许你放这样的文件,结果死心
了.下面新建一个 word2007 文件告诉大家不用第三方技术怎么一一实现。
现在新建一个 word,在请输入用户名处添加书签 userName,请输入年龄处添加书签 age
Word2007 版本其实就是 zip 格式,将新建 word 后缀名改.zip,解压会发现,里面全是文
件夹,打开 word 文件夹会有一个 document.xml 文件,在 word 所有内容,都在这 xml 文件中,
<w:bookmarkStart w:id="0" w:name="userName"/>
<w:r>
<w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr>
<w:t>请输入用户名</w:t>
</w:r>
<w:bookmarkEnd w:id="0"/>
这是新建书签处的内容,细心的会发现,书签处内容在<w:bookmarkStart/>
<w:bookmarkEnd w:id="0"/>标签之间,<w:bookmarkStart>标签中的 w:id 跟 w:name 标
识书签的唯一,中间是书签处的内容,会不会可以这样呢,找到用 dom 或者 sax 解析这个
xml 文档找到<w:bookmarkStart/>标签,然后找到<w:r>标签,再找到<w:r>标签里面 的<w:t>
标签内容,替换就 Ok 了呢。一开始我就这样想的。但是你会发现,<w:bookmarkStart></w:
bookmarkStart>不是这样配套的,如果是这样配套的,那按照前面的说的直接解析找到
<w:bookmarkStart>标签就 OK 了。
分析 xml 文件你会发现,其实<w:bookmarkStart w:id="0" w:name="userName"/>标签跟
<w:r>标签是同级的,只是结束方式不同而已,所以算是兄弟节点,可以不可以找到
<w:bookmarkStart>的兄弟节点,也就是<w:r>标签,然后找到<w:t>标签,替换其文本。其
实 w3c 中 Element 对象中提供了获取兄弟节点的方法,getNextSibling()获取下一个兄弟节点
按照分析的思路是可以实现的。但是会不会有疑问,如果 <w:bookmarkStar>的下一个兄弟
节点会不会不是<w:r>标签呢,是的,如果书签处无内容,就会是这样的
<w:bookmarkStart w:id="0" w:name="userName"/>