您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > Freemaker+xml转word详解
FreeMaker+xml导出word首先介绍几种java导出word方案1、Jacob是Java-COMBridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。DLL动态链接库的生成需要windows平台的支持。2、ApachePOI包括一系列的API,它们可以操作基于MicroSoftOLE2CompoundDocumentFormat的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。他的excel处理很强大,对于word还局限于读取,目前只能实现一些简单文件的操作,不能设置样式。3、Java2word是一个在java程序中调用MSOfficeWord文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word文档。这些服务包括:打开文档、新建文档、查找文字、替换文字,插入文字、插入图片、插入表格,在书签处插入文字、插入图片、插入表格等。填充数据到表格中读取表格数据,1.1版增强的功能:指定文本样式,指定表格样式。如此,则可动态排版word文档。4、iText操作Excel还行。对于复杂的大量的word也是噩梦。用法很简单,但是功能很少,不能设置打印方向等问题。5、JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。6、用XML做就很简单了。Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。看过方案后就知道了第6种方案效果好点,下面我们就举个例子介绍下这个方案首先要制作模板模板里的需要传入的数据用${data}填充,在代码里给其赋值即可模板制作好后,点击另存为xml文件如:data.xml如果xml需要动态填充可以用!--循环开始--#listpersonnelViewase/#list!--循环结束--!--循环开始--#listpersonnelViewase//personnelView为循环集合w:trwsp:rsidR=001E023Bwsp:rsidTr=004E45BDw:tblPrExw:tblCellMarw:topw:w=0w:type=dxa/w:bottomw:w=0w:type=dxa//w:tblCellMar/w:tblPrExw:trPrw:trHeightw:val=405//w:trPrw:tcw:tcPrw:tcWw:w=1920w:type=dxa/w:vAlignw:val=center//w:tcPrw:pwsp:rsidR=001E023Bwsp:rsidRDefault=001D2E3Bwsp:rsidP=004E45BDw:pPrw:jcw:val=center//w:pPrw:rw:rPrw:rFontsw:hint=fareast//w:rPrw:t${e_index+1}/w:t//e_index为索引从0开始/w:r/w:p/w:tcw:tcw:tcPrw:tcWw:w=1083w:type=dxa/w:vAlignw:val=center//w:tcPrw:pwsp:rsidR=001E023Bwsp:rsidRDefault=001D2E3Bwsp:rsidP=004E45BDw:rw:rPrw:rFontsw:hint=fareast//w:rPrw:t${e.COLUMN_1}/w:t/w:r/w:p/w:tcw:tcw:tcPrw:tcWw:w=1142w:type=dxa/w:gridSpanw:val=3//w:tcPrw:pwsp:rsidR=001E023Bwsp:rsidRDefault=001D2E3Bwsp:rsidP=004E45BDw:pPrw:rPrw:rFontsw:hint=fareast//w:rPr/w:pPrw:rw:rPrw:rFontsw:hint=fareast//w:rPrw:t${e.COLUMN_2}/w:t/w:r/w:p/w:tcw:tcw:tcPrw:tcWw:w=1578w:type=dxa/w:gridSpanw:val=3/w:vAlignw:val=center//w:tcPrw:pwsp:rsidR=001E023Bwsp:rsidRDefault=001D2E3Bwsp:rsidP=004E45BDw:rw:rPrw:rFontsw:hint=fareast//w:rPrw:t${e.COLUMN_3}/w:t/w:r/w:p/w:tcw:tcw:tcPrw:tcWw:w=1168w:type=dxa/w:gridSpanw:val=2/w:vAlignw:val=center//w:tcPrw:pwsp:rsidR=001E023Bwsp:rsidRDefault=001D2E3Bwsp:rsidP=004E45BDw:rw:rPrw:rFontsw:hint=fareast//w:rPrw:t${e.COLUMN_4}/w:t/w:r/w:p/w:tcw:tcw:tcPrw:tcWw:w=2181w:type=dxa/w:gridSpanw:val=3/w:vAlignw:val=center//w:tcPrw:pwsp:rsidR=001E023Bwsp:rsidRDefault=001D2E3Bwsp:rsidP=004E45BDw:rw:rPrw:rFontsw:hint=fareast//w:rPrw:t${e.COLUMN_5}/w:t/w:r/w:p/w:tc/w:tr/#list!--循环结束--二、详细介绍1、以上呢都是我看别人的东西复制过来的其实都一样FreeMaker最主要的一个特点就是整理模板数据替换用${data};data就是你的数据那在java中保存的数据时用map来存放数据如:MapString,Objectroot=newHashMapString,Object();、如现在要保存一个实体user;User的对象有id,name,sex,menun(菜单),picstr(头像)这些属性UseruserObj=newUser();在保存的时候只要将数据库中的数据封装到user中然后通过root.put(“user”,userObj);在模板相应的位置中代替这些值如名称:${user.name},性别${user.sex}等当遇到对象有子集的时候也就是用户有几个菜单时可以使用#listuser.menunasm在这个中间又可以得到自己想要的东西如${m.menunName}/#list当然这个是循环的对于它循环的索引直接使用变量名+下划线index即可如:${m_index};2、这些东西估计大家都会现在说说插入目录问题因为目录需要内容创建完成之后才能刷新目录所以在此处我寻求好多方法不知道怎么使用最后我折中想了个办法就是在xml转为word完成之后我另存一份word;在另存之前我先刷新目录这样就把目录问题解决了;废话少说例子上:publicvoidxmlToWord(Stringdocfile,Stringhtmlfile){ActiveXComponentapp=null;try{app=newActiveXComponent(Word.Application);//启动wordapp.setProperty(Visible,newVariant(false));Dispatchdocs=app.getProperty(Documents).toDispatch();Dispatchdoc=Dispatch.invoke(docs,Open,Dispatch.Method,newObject[]{docfile,newVariant(false),newVariant(true)},newint[1]).toDispatch();Dispatchselection=app.getProperty(Selection).toDispatch();Dispatchfind=Dispatch.call(selection,Find).toDispatch();/*设置要查找的内容*/Dispatch.put(find,Text,目录);/*向前查找*/Dispatch.put(find,Forward,True);/*设置格式*/Dispatch.put(find,Format,True);/*大小写匹配*/Dispatch.put(find,MatchCase,True);/*全字匹配*/Dispatch.put(find,MatchWholeWord,True);/*查找并选中*/Dispatch.call(find,Execute).getBoolean();/*取得ActiveDocument、TablesOfContents、range对象*/DispatchActiveDocument=app.getProperty(ActiveDocument).toDispatch();DispatchTablesOfContents=Dispatch.get(ActiveDocument,TablesOfContents).toDispatch();Dispatch.call(selection,MoveRight);//移动光标到右边Dispatch.call(selection,TypeParagraph);//换行Dispatchrange=Dispatch.get(selection,Range).toDispatch();/*增加目录*/Dispatch.call(TablesOfContents,Add,range,newVariant(true),newVariant(1),newVariant(3),newVariant(true),newVariant(),newVariant(true),newVariant(true));Dispatch.invoke(doc,SaveAs,Dispatch.Method,newObject[]{htmlfile,newVariant(WORD_DOC)},newint[1]);Variantf=newVariant(false);Dispatch.call(doc,Close,f);}finally{if(app!=null)app.invoke(Quit,newVariant[]{});}}原理就是我在模板中有一页单独为目录留下来有目录两字,通过查找目录两字并且定位光标到目录之后并且换行;然后添加目录保存即可;3、图片问题相信大家都知道在word里面插入一张图片保存为xml的时候图片的位置会产生出很长的一串字符当你看到这个的时候那么替换图片你有希望;观察发现是二进制字符串所以你在准备数据的时候也要提前把需要保存的图片转成二进制字符串并存到变量中如picstr并在xml中替换${user.picstr}w:pictv:sha
本文标题:Freemaker+xml转word详解
链接地址:https://www.777doc.com/doc-5282117 .html