java操作word书签生成word模板不用jar包

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java操作word书签生成word模板(不用jar包)

最近有个需求,在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:id跟w:name标识书签的唯一,中间是书签处的内容,会不会可以这样呢,找到用dom或者sax解析这个xml 文档找到标签,然后找到标签,再找到标签里面的标签内容,替换就Ok了呢。一开始我就这样想的。但是你会发现,不是这样配套的,如果是这样配套的,那按照前面的说的直接解析找到标签就OK了。

分析xml文件你会发现,其实标签跟标签是同级的,只是结束方式不同而已,所以算是兄弟节点,可以不可以找到的兄弟节点,也就是标签,然后找到标签,替换其文本。其实w3c中Element对象中提供了获取兄弟节点的方法,getNextSibling()获取下一个兄弟节点。

按照分析的思路是可以实现的。但是会不会有疑问,如果的下一个兄弟节点会不会不是标签呢,是的,如果书签处无内容,就会是这样的

这样可以直接在后面直接添加标签

你多试几个文档你会发现,无论多复杂,只要节操还在。都会是这个样子。除非那种非常恶心的word。这个还得看你的word模板而论.

这样的思路是可以实现了,但是该怎么用java搞定呢,下面贴出代码

publicstaticvoid modifyDocumentAndSave() throws IOException,

ZipException, SAXException, ParserConfigurationException,

TransformerException, TransformerConfigurationException {

// 使用java.util打开文件

File file=new File("D:test.docx");

boolean exist=file.exists();

boolean read=file.canRead();

boolean write=file.canWrite();

System.out.println(exist);

System.out.println(read);

System.out.println(write);

ZipFile docxFile = new ZipFile(file);

// 返回ZipEntry应用程序接口

ZipEntry documentXML =

docxFile.getEntry("word/document.xml");

InputStream documentXMLIS =

docxFile.getInputStream(documentXML);

DocumentBuilderFactory dbf =

DocumentBuilderFactory.newInstance();

Document doc =

dbf.newDocumentBuilder().parse(documentXMLIS);

// linkMan tel proCode companyName fundName fundCode sysProCode

Map bookMarkMap = new HashMap();

bookMarkMap.put("userName", "张三");

bookMarkMap.put("password", "888888");

/**

* 书签列表

*/

NodeList this_book_list =

doc.getElementsByTagName("w:bookmarkStart");

if (this_book_list.getLength() != 0) {

for(int j = 0; j < this_book_list.getLength(); j++) {

// 获取每个书签

Element oldBookStart = (Element)

this_book_list.item(j);

// 书签名

String bookMarkName =

oldBookStart.getAttribute("w:name");

// 书签名,跟需要替换的书签传入的map集合比较

for (Map.Entry entry : bookMarkMap.entrySet()) {

// 书签处值开始

Node wr = doc.createElement("w:r");

Node wt = doc.createElement("w:t");

Node wt_text =

doc.createTextNode(entry.getValue());

wt.appendChild(wt_text);

wr.appendChild(wt);

// 书签处值结束

if (entry.getKey().equals(bookMarkName)) {

Element node = (Element)

oldBookStart.getNextSibling();// 获取兄弟节点w:r

// 如果书签处无文字,则在书签处添加需要替换的内容,如果书签处存在描述文字,则替换内容,用w:r

NodeList wtList =

相关文档
最新文档