首页 > 作文

word书签

更新时间:2023-03-05 14:42:42 阅读: 评论:0

仰卧起坐的好处-跑步机如何使用

word书签
2023年3月5日发(作者:景阳冈教案)

最近有个需求,在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文件中,

请输入用户名

这是新建书签处的内容,细心的会发现,书签处内容在

标签之间,标签中的w:id跟w:name标识

书签的唯一,中间是书签处的内容,会不会可以这样呢,找到用dom或者sax解析这个xml

文档找到标签,然后找到标签,再找到标签里面的标签

内容,替换就Ok了呢。一开始我就这样想的。但是你会发现,

不是这样配套的,如果是这样配套的,那按照前面的

说的直接解析找到标签就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

MapbookMarkMap=newHashMap

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(entry:

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

上一篇:虚实篇
下一篇:返回列表
标签:word书签
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26 专利检索|