最近有个需求,在word模板文档上设置书签,然后从数据库中查询数据,填充到word
文档书签位置,刚拿到需求时,使劲在网上找资料。幻想第三方jar包,帮我实现。有Apatch
的POI,java2word,jcob等,一直让我无法实现。POI操作word只能获取word中的书签,并
不能进行操作.java2word可以实现,但是除了包以外,还要一个dll文件放在
system32文件夹下,环境部署在linux服务器上,谁允许你放这样的文件,结果死心了.下面新
建一个word2007文件告诉大家不用第三方技术怎么一一实现。
现在新建一个word,在请输入用户名处添加书签urName,请输入年龄处添加书签age
Word2007版本其实就是zip格式,将新建word后缀名改.zip,解压会发现,里面全是文
件夹,打开word文件夹会有一个文件,在word所有内容,都在这xml文件中,
这是新建书签处的内容,细心的会发现,书签处内容在
书签的唯一,中间是书签处的内容,会不会可以这样呢,找到用dom或者sax解析这个xml
文档找到
内容,替换就Ok了呢。一开始我就这样想的。但是你会发现,
说的直接解析找到
分析xml文件你会发现,其实
w3c中Element对象中提供了获取兄弟节点的方法,getNextSibling()获取下一个兄弟节点。
按照分析的思路是可以实现的。但是会不会有疑问,如果
点会不会不是
这样可以直接在
你多试几个文档你会发现,无论多复杂,只要节操还在。都会是这个样子。除非那种非常恶
心的word。这个还得看你的word模板而论.
这样的思路是可以实现了,但是该怎么用java搞定呢,下面贴出代码
publicstaticvoidmodifyDocumentAndSave()throws
IOException,
ZipException,SAXException,
ParrConfigurationException,
TransformerException,
TransformerConfigurationException{
//使用打开文件
Filefile=newFile("D:");
booleanexist=();
booleanread=d();
booleanwrite=te();
n(exist);
n(read);
n(write);
ZipFiledocxFile=newZipFile(file);
//返回ZipEntry应用程序接口
ZipEntrydocumentXML=
ry("word/");
InputStreamdocumentXMLIS=
utStream(documentXML);
DocumentBuilderFactorydbf=
tance();
Documentdoc=
umentBuilder().par(documentXMLIS);
//linkMantelproCodecompanyNamefundNamefundCode
sysProCode
Map
String>();
("urName","张三");
("password","888888");
/**
*书签列表
*/
NodeListthis_book_list=
mentsByTagName("w:bookmarkStart");
if(this_book_gth()!=0){
for(intj=0;j
{
//获取每个书签
ElementoldBookStart=(Element)
this_book_(j);
//书签名
StringbookMarkName=
ribute("w:name");
//书签名,跟需要替换的书签传入的map集合比较
for(
et()){
//书签处值开始
Nodewr=Element("w:r");
Nodewt=Element("w:t");
Nodewt_text=
TextNode(ue());
Child(wt_text);
Child(wt);
//书签处值结束
if(().equals(bookMarkName)){
Elementnode=(Element)
tSibling();//获取兄弟节点w:r
//如果书签处无文字,则在书签处添加需要替换的内
容,如果书签处存在描述文字,则替换内容,用w:r
NodeListwtList=
mentsByTagName("w:t");//获取w:r标签下的显示书签处
内容标签w:t
if(gth()==0){//如果不存
在,即,书签处本来就无内容,则添加需要替换的内容
Child(wr);
}el{//如果书签处有内容,则直接替换内容
ElementwtNode=(Element)
(0);
tContent(ue());
}
}
}
}
}
Transformert=
tance().newTransformer();
ByteArrayOutputStreambaos=new
ByteArrayOutputStream();
orm(newDOMSource(doc),new
StreamResult(baos));
ZipOutputStreamdocxOutFile=newZipOutputStream(new
FileOutputStream(
"D:"));
EnumerationentriesIter=s();
while(eElements()){
ZipEntryentry=(ZipEntry)
ement();
//如果是则修改,别的文件直接拷贝,不改变word
的样式
if(e().equals("word/")){
byte[]data=Array();
tEntry(new
ZipEntry(e()));
(data,0,);
ntry();
}el{
InputStreamincoming=
utStream(entry);
//此处设定值需慎重,如果设置小了,会破坏word文档,至于为什么会破坏,
自己去思考
byte[]data=newbyte[1024*512];
intreadCount=(data,0,(int)
e());
tEntry(new
ZipEntry(e()));
(data,0,readCount);
ntry();
}
}
();
}
本文发布于:2023-03-05 14:42:42,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1677998562146889.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:word书签.doc
本文 PDF 下载地址:word书签.pdf
留言与评论(共有 0 条评论) |