java操作word可操作书签_第1页
java操作word可操作书签_第2页
java操作word可操作书签_第3页
java操作word可操作书签_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近有个需求,在word模板文档上设置书签,然后从数据库中查询数据,填充到word文档书签位置,刚拿到需求时,使劲在网上找资料。幻想第三方jar包,帮我实现。有Apatch的POI,java2word,jcob等,一直让我无法实现。POI操作word只能获取word中的书签,并不能进行操作.java2word可以实现,但是除了java2word.jar包以外,还要一个dll文件放在system32文件夹下,环境部署在linux服务器上,谁允许你放这样的文件,结果死心了.下面新建一个word2007文件告诉大家不用第三方技术怎么一一实现。现在新建一个word,在请输入用户名处添加书签userName,请输入年龄处添加书签ageWord2007版本其实就是zip格式,将新建word后缀名改.zip,解压会发现,里面全是文件夹,打开word文件夹会有一个document.xml文件,在word所有内容,都在这xml文件中,请输入用户名这是新建书签处的内容,细心的会发现,书签处内容在标签之间,标签中的w:id跟w:name标识书签的唯一,中间是书签处的内容,会不会可以这样呢,找到用dom或者sax解析这个xml文档找到标签,然后找到标签,再找到标签里面 的标签内容,替换就Ok了呢。一开始我就这样想的。但是你会发现,不是这样配套的,如果是这样配套的,那按照前面的说的直接解析找到标签就OK了。分析xml文件你会发现,其实标签跟标签是同级的,只是结束方式不同而已,所以算是兄弟节点,可以不可以找到的兄弟节点,也就是标签,然后找到标签,替换其文本。其实w3c中Element对象中提供了获取兄弟节点的方法,getNextSibling()获取下一个兄弟节点。按照分析的思路是可以实现的。但是会不会有疑问,如果的下一个兄弟节点会不会不是标签呢,是的,如果书签处无内容,就会是这样的这样可以直接在后面直接添加标签你多试几个文档你会发现,无论多复杂,只要节操还在。都会是这个样子。除非那种非常恶心的word。这个还得看你的word模板而论. 这样的思路是可以实现了,但是该怎么用java搞定呢,下面贴出代码public static void 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 sysProCodeMap 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:rNodeList wtList = node.getElementsByTagName(w:t);/ 获取w:r标签下的显示书签处内容标签w:tif (wtList.getLength() = 0) / 如果不存在,即,书签处本来就无内容,则添加需要替换的内容oldBookStart.appendChild(wr); else / 如果书签处有内容,则直接替换内容Element wtNode = (Element) wtList.item(0);wtNode.setTextContent(entry.getValue();Transformer t = TransformerFactory.newInstance().newTransformer();ByteArrayOutputStream baos = new ByteArrayOutputStream();t.transform(new DOMSource(doc), new StreamResult(baos);ZipOutputStream docxOutFile = new ZipOutputStream(new FileOutputStream(D:response.docx);Enumeration entriesIter = docxFile.entries();while (entriesIter.hasMoreElements() ZipEntry entry = (ZipEntry) entriesIter.nextElement();/如果是document.xml则修改,别的文件直接拷贝,不改变word的样式if (entry.getName().equals(word/document.xml) byte data = baos.toByteArray();docxOutFile.putNextEntry(new ZipEntry(entry.getName();docxOutFile.write(data, 0, data.length);docxOutFile.closeEntry(); else InputStream incoming = docxFile.getInputStream(entry);/此处设定值需慎重,如果设置小了,会破坏word文档,至于为什么会破坏,自己去思考byte data = new byte1024 * 512;int readCount =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论