java利用xml导出word(占位符替换)

合集下载

java如何生成word文档_使用Java生成word文档(附源码)

java如何生成word文档_使用Java生成word文档(附源码)

java如何生成word文档_使用Java生成word文档(附源码)当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档。

但是当我们需要动态生成word时,通常不仅要能够显示word中的内容,还要能够很好的保持word中的复杂样式。

这时如果再使用IText和POI去操作,就好比程序员去搬砖一样痛苦。

这时候,我们应该考虑使用FreeMarker的模板技术快速实现这个复杂的功能,让程序员在喝咖啡的过程中就把问题解决。

实现思路是这样的:先创建一个word文档,按照需求在word中填好一个模板,然后把对应的数据换成变量${},然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档,去掉多余的xml符号,使用Freemarker读取这个文档然后替换掉变量,输出word文档即可。

具体过程如下:1.创建带有格式的word文档,将该需要动态展示的数据使用变量符替换。

2.将刚刚创建的word文档另存为xml格式。

3.编辑这个XMl文档去掉多余的xml标记,如图中蓝色部分4.从官网最新的开发包,将freemarker.jar拷贝到自己的开发项目中。

5.新建DocUtil类,实现根据Doc模板生成word文件的方法package com.favccxx.secret.util;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.DefaultObjectWrapper;import freemarker.template.Template;import freemarker.template.TemplateExceptionHandler;public class DocUtil {privateConfiguration configure = null;publicDocUtil(){configure= new Configuration();configure.setDefaultEncoding("utf-8");}/*** 根据Doc模板生成word文件* @param dataMap Map 需要填入模板的数据* @param fileName 文件名称* @param savePath 保存路径*/publicvoid createDoc(Map dataMap, String downloadType, StringsavePath){try{//加载需要装填的模板Templatetemplate = null;//加载模板文件configure.setClassForTemplateLoading(this.getClass(),"/com /favccxx/secret/templates");//设置对象包装器configure.setObjectWrapper(newDefaultObjectWrapper());//设置异常处理器configure.setT emplateExceptionHandler(TemplateException Handler.IGNORE_HANDLER);//定义Template对象,注意模板类型名字与downloadType要一致template= configure.getTemplate(downloadType + ".xml");//输出文档FileoutFile = new File(savePath);Writerout = null;out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));template.process(dataMap,out);outFile.delete();}catch (Exception e) {e.printStackTrace();}}}6.用户根据自己的需要,调用使用getDataMap获取需要传递的变量,然后调用createDoc方法生成所需要的文档。

Java完美生成word的解决方案

Java完美生成word的解决方案

POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。

iText操作Excel还行。

对于复杂的大量的word也是噩梦。

直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。

Word从2003开始支持XML格式,用XML还做就很简单了。

大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。

经测试这样方式生成的word 文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office 中编辑文档完全一样。

看看实际效果:首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:将编辑好的文档另存为XML再用Firstobject free XML editor【Firstobject free XML editor的使用见这里】将xml中我们需要填数据的地方打上FreeMarker标记【FreeMarker的语法见这里】最后生成的文档样式主要程序代码:view sourceprint?01 package com.havenliu.document;0203 import java.io.BufferedWriter;04 import java.io.File;05 import java.io.FileNotFoundException;06 import java.io.FileOutputStream;07 import java.io.IOException;08 import java.io.OutputStreamWriter;09 import java.io.Writer;10 import java.util.ArrayList;11 import java.util.HashMap;12 import java.util.List;13 import java.util.Map;1415 import freemarker.template.Configuration;16 import freemarker.template.Template;17 import freemarker.template.TemplateException;1819 public class DocumentHandler {20 private Configuration configuration = null;2122 public DocumentHandler() {23 configuration = new Configuration();24 configuration.setDefaultEncoding("utf-8");25 }2627 public void createDoc() {28 //要填入模本的数据文件29 Map dataMap=new HashMap();30 getData(dataMap);31 //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。

java导出之导出word文档

java导出之导出word文档

java导出之导出word⽂档Springboot之word导出1.简介导出word实现⽤的⼯具是poi-tl,主要是通过预先设置word模板格式,通过数据填充来实现数据动态录⼊。

⽀持动态表格以及图。

使⽤步骤主要分为准备冰箱,准备象,把象装进冰箱。

2.准备环境(冰箱)包括两种,导包和模板预设置com.deepoove poi-tl 1.9.1 注意:poi-tl版本对阿帕奇的poi版本依赖有条件,低版本会报错,Tomcat会默认依赖低版本的jar包。

准备模板,模板可以设置⾏⾼,位置,固定宽度和最⼩⾼度,可以保证内容显⽰完全3.准备数据(⼤象)######Controller 层,返回值和两个⼊参public ResponseEntity<byte[]> exportJbZwJlxx(HttpServletRequest request, HttpServletResponse response) {//任免表⾥,需要基本信息,职务信息,部门⼈员信息,简历信息以及个⼈经历信息if(jbZwJlxxScCxDto.getDxbz()==null || "".equals(jbZwJlxxScCxDto.getDxbz()) ){log.error("档案薪酬判断标志不能为空");throw new RuntimeException("dxbz不能为空,或者为空字符串");}try {return jbZwJlxxService.getParams(jbZwJlxxScCxDto);} catch (Exception e) {log.error("导出失败",e);}return null;}######Service层获取数据,格式如下,和模板上对应即可Map<String, Object> params = new HashMap<>(100);params.put("jljj",!jlxxBean.getJljj().equals(CmGbglConstants.SPACE)? jlxxBean.getJljj() : "⽆");######动态表格的数据封装,通过**对象的属性赋值**int length = 7;// 返回数据超过七条if (res.size() > length) {length = res.size();// 封装查询回来的⼤于7的对象for (int i = 0; i < length; i++) {QtxxDto qtxxDto = new QtxxDto();qtxxDto = res.get(i);Map<String,Object> detailMap = new HashMap<String, Object>(7);detailMap.put("cw", qtxxDto.getCw());detailMap.put("name", qtxxDto.getName());qtxxDto.setCsny(getAge(qtxxDto.getCsny())+"");detailMap.put("csny", qtxxDto.getCsny());detailMap.put("zzmmmc",qtxxDto.getZzmmmc());detailMap.put("gzdwjzw",qtxxDto.getGzdwjzw());detailList.add(detailMap);qtxxDtos.add(qtxxDto);}} else {// 数据集长度⼩于七条for (int i = 0; i < res.size(); i++) {QtxxDto qtxxDto = new QtxxDto();qtxxDto = res.get(i);qtxxDto.setCsny(getAge(qtxxDto.getCsny())+"");qtxxDtos.add(qtxxDto);}for (int j = 0; j < (length - res.size()); j++) {QtxxDto qtxxDto = new QtxxDto();qtxxDtos.add(qtxxDto);}}}params.put("detailList", qtxxDtos);4.和模板建⽴关系try{//获得模板⽂件的输⼊流,这个是放在启动器的那个项⽬的resource下InputStream in = this.getClass().getResourceAsStream("/word/rmb.docx");//表格⾏循环插件HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();//绑定detailListConfigure config = Configure.builder().bind("detailList", policy).build();XWPFTemplate template = pile(in , config).render(params);String fileName = new String("rmb.docx".getBytes("UTF-8"), "iso-8859-1");ByteArrayOutputStream outputStream = new ByteArrayOutputStream();template.write(outputStream);template.close();HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.add("content-disposition", "attachment;filename=" + fileName);httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);ResponseEntity<byte[]> filebyte = new ResponseEntity<byte[]>(outputStream.toByteArray(), httpHeaders,HttpStatus.CREATED);outputStream.close();return filebyte;} catch (Exception e) {log.error("导出失败", e);throw e;}注意:模板放置的位置可以放在resource下,在本地编译的时候可以使⽤类加载器获取,但是打包到正式环境后就会找不到模板。

java导出数据为word文档(保持模板格式)

java导出数据为word文档(保持模板格式)

java导出数据为word⽂档(保持模板格式)导出数据到具体的word⽂档⾥⾯,word有⼀定的格式,需要保持不变这⾥使⽤freemarker来实现:①:设计好word⽂档格式,需要⽤数据填充的地⽅⽤便于识别的长字符串替换如 aaaaaaaaaaaaaaaa②:将word⽂档另存为 2003 xml格式③:找到需要替换的地⽅,如将 aaaaaaaaaaaa 修改为 ${userName}如果是list展⽰,注意按照如下⽅式修改:<#list list1 as list1Item>XXXXXXXXXXXXXXXXXX 原有格式代码如⼀⾏数据或者⼀个单元格</#list>④:替换完成后,将xml⽂件后缀修改为ftljava代码如下:package com.xiao;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class Main {public static void main(String[] args) throws UnsupportedEncodingException {Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("name", "肖昌伟");dataMap.put("depart", "云平台");dataMap.put("date", "2016年"); //列表数据封装List<String> list1 = new ArrayList<String>();list1.add("itema");list1.add("itemb");list1.add("itemc");dataMap.put("list1", list1);DocumentHandler mdoc = new DocumentHandler();mdoc.createDoc(dataMap, "E:/outFile2.doc");}}package com.xiao;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;public class DocumentHandler {private Configuration configuration = null;public DocumentHandler() {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");}public void createDoc(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException {//需要导出模板的包路径configuration.setClassForTemplateLoading(this.getClass(), "/com/xiao");Template t = null;try {t = configuration.getTemplate("template.ftl");} catch (IOException e) {e.printStackTrace();}File outFile = new File(fileName);Writer out = null;FileOutputStream fos = null;try {fos = new FileOutputStream(outFile);OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");out = new BufferedWriter(oWriter);} catch (FileNotFoundException e1) {e1.printStackTrace();}try {t.process(dataMap, out);out.close();fos.close();} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println("⽂档导出完成");}}这样就可以看到填充好了数据的word⽂档,格式和模板设置的保持⼀致。

java根据模板生成word文档,兼容富文本、图片

java根据模板生成word文档,兼容富文本、图片

java根据模板⽣成word⽂档,兼容富⽂本、图⽚Java⾃动⽣成带图⽚、富⽂本、表格等的word⽂档使⽤技术 freemark+jsoup ⽣成mht格式的伪word⽂档,已经应⽤项⽬中,确实是可⾏的,⽆论是富⽂本中是图⽚还是表格,都能在word中展现出来使⽤jsoup解析富⽂本框,将其中的图⽚进⾏Base64位转码,使⽤freemark替换模板的占位符,将变量以及图⽚资源放⼊模板中在输出⽂件maven地址<!--freemarker--><!--<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version></dependency><!--JavaHTMLParser--><!--<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version></dependency>制作word的freemark模板1. 先将wrod的格式内容定义好,如果需要插⼊参数的地⽅以${xxx}为表⽰,例:${product}模板例⼦: 2. 将模板另存为mht格式的⽂件,打开该⽂件检查每个变量(${product})是否完整,有可能在${}中出现其他代码,需要删除。

3. 将mht⽂件变更⽂件类型,改成ftl为结尾的⽂件,引⼊到项⽬中 4. 修改ftl模板⽂件,在⽂件中加上图⽚资源占位符${imagesBase64String},${imagesXmlHrefString}具体位置如下图所⽰: 5. ftl⽂件中由⼏个关键配置需要引⼊到代码中:docSrcParent = word.filesdocSrcLocationPrex =nextPartId = 01D2C8DD.BC13AF60上⾯三个参数,在模板⽂件中可以找到,需要进⾏配置,如果配置错误,图⽚⽂件将不会显⽰下⾯这三个参数固定,切换模板也不会改变shapeidPrex = _x56fe__x7247__x0020typeid = #_x0000_t75spidPrex = _x0000_i 6. 模板引⼊之后进⾏代码编辑源码地址为:下载源码后需要进⾏调整下内容:1. 录⼊步骤5中的6个参数2. 修改freemark获取模板⽅式下⾯这种⽅式能获取模板,但是在项⽬打包之后⽆法获取jar包内的⽂件Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));Template template=configuration.getTemplate("xxx.ftl");通过流的形式直接创建模板对象Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));InputStream inputStream=newFileInputStream(newFile(templatePath+"/"+templateName)); InputStreamReader inputStreamReader=newInputStreamReader(inputStream,StandardCharsets.UTF_8); Template template=newTemplate(templateName,inputStreamReader,configuration);。

Java使用模板导出word文档

Java使用模板导出word文档

Java使⽤模板导出word⽂档Java使⽤模板导出word⽂档需要导⼊freemark的jar包1. 使⽤word模板,在需要填值的地⽅使⽤字符串代替,是因为word转换为xml⽂件时查找不到要填⼊内容的位置。

尽量不要在写字符串的时候就加上${},xml⽂件会让它和字符串分离。

⽐如:姓名| name2. 填充完之后,把word⽂件另存为xml⽂件,然后使⽤notepad 等编辑软件打开,打开之后代码很多,也很乱,根本看不懂,其实也不⽤看懂哈,搜索找到你要替换的位置的字符串,⽐如name,然后加上${},变成${name}这样,然后就可以保存了,之后把保存的⽂件名后缀替换为.ftl。

模板就ok了。

3. 有个注意事项,这⾥的值⼀定不可以为空,否则会报错,freemark有判断为空的语句,这⾥⽰例⼀个,根据个⼈需求,意思是判断name是否为空,trim之后的lenth是否⼤于0:<#if name?default("")?trim?length gt 0><w:t>${name}</w:t></#if>4. 如果在本地的话可以直接下载下来,但是想要在通过前端下载的话那就需要先将⽂件下载到本地,当作临时⽂件,然后在下载⽂件。

接下来上代码,⽰例:public void downloadCharge(String name, HttpServletRequest request, HttpServletResponse response) {Map<String, Object> map = new HashMap<>();map.put("name", name);Configuration configuration = new Configuration();configuration.setDefaultEncoding("utf-8");try { //模板存放位置InputStream inputStream = this.getClass().getResourceAsStream("/template/report/XXX.ftl");Template t = new Template(null, new InputStreamReader(inputStream));String filePath = "tempFile/";//导出⽂件名String fileName = "XXX.doc";//⽂件名和路径不分开写的话createNewFile()会报错File outFile = new File(filePath + fileName);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}if (!outFile.exists()) {outFile.createNewFile();}Writer out = null;FileOutputStream fos = null;fos = new FileOutputStream(outFile);OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");//这个地⽅对流的编码不可或缺,使⽤main()单独调⽤时,应该可以,但是如果是web请求导出时导出后word⽂档就会打不开,并且包XML⽂件错误。

Java将Word转为XML,XML转为Word的方法

Java将Word转为XML,XML转为Word的方法
} }
2.XML转 Word
import com.spire.doc.*; public class XMLtoWord {
public static void main(String[] args) { //创建实例,加载xml测试文档 Document doc = new Document(); doc.loadFromFile("test.xml"); //保存为Docx格式 doc.saveToFile("toDocx.docx",FileFormat.Docx); //保存为Doc格式 doc.saveToFile("toDoc.doc",FileFormat.Doc);
网络错误400请刷新页面重试持续报错请尝试更换浏览器或网络环境
Java将 Word转为 XML, XML转为 Word的方法
本文介绍将Word和XML文档进行双向互转的方法。转换时,Word支持.docx/.doc等格式。
代码环境如下:
Word测试文档:.docx或.doc 编译环境:IntelliJ IDEA JDK版本:1.8.0 Word jar包:
} }
​原创内容,转载请注明出处!程序代码:来自1.Word转 为 XML
import com.spire.doc.*; public class WordtoXML {
public static void main(String[] args) { //加载Word测试文档 Document doc = new Document(); doc.loadFromFile("input.docx");//支持doc格式 //调用方法转为xml文件 doc.saveToFile("toxml.xml.",FileFormat.Word_Xml); doc.dispose();

Java根据模板动态生成word文件

Java根据模板动态生成word文件

Java根据模板动态⽣成word⽂件最近项⽬中需要根据模板⽣成word⽂档,模板⽂件也是word⽂档。

当时思考⼀下想⽤POI API来做,但是觉得⽤起来相对复杂。

后来⼜找了⼀种⽅式,使⽤freemarker模板⽣成word⽂件,经过尝试觉得还是相对简单易⾏的。

使⽤freemarker模板⽣成word⽂档主要有这么⼏个步骤1、创建word模板:因为我项⽬中⽤到的模板本⾝是word,所以我就直接编辑word⽂档转成freemarker(.ftl)格式的。

2、将改word⽂件另存为xml格式,注意使⽤另存为,不是直接修改扩展名。

3、将xml⽂件的扩展名改为ftl4、编写java代码完成导出使⽤到的jar:freemarker.jar (2.3.28) ,其中Configuration对象不推荐直接new Configuration(),仔细看Configuration.class⽂件会发现,推荐的是 Configuration(Version incompatibleImprovements) 这个构造⽅法,具体这个构造⽅法⾥⾯传的就是Version版本类,⽽且版本号不能低于2.3.0闲⾔碎语不再讲,直接上代码1public static void exportDoc() {2 String picturePath = "D:/image.png";3 Map<String, Object> dataMap = new HashMap<String, Object>();4 dataMap.put("brand", "海尔");5 dataMap.put("store_name", "海尔天津");6 dataMap.put("user_name", "⼩明");78//经过编码后的图⽚路径9 String image = getWatermarkImage(picturePath);10 dataMap.put("image", image);1112//Configuration⽤于读取ftl⽂件13 Configuration configuration = new Configuration(new Version("2.3.0"));14 configuration.setDefaultEncoding("utf-8");1516 Writer out = null;17try {18//输出⽂档路径及名称19 File outFile = new File("D:/导出优惠证明.doc");20 out = new BufferedWriter(new OutputStreamWriter(new21 FileOutputStream(new File("outFile")), "utf-8"), 10240);22 } catch (UnsupportedEncodingException e) {23 e.printStackTrace();24 } catch (FileNotFoundException e) {25 e.printStackTrace();26 }27// 加载⽂档模板28 Template template = null;29try {30//指定路径,例如C:/a.ftl 注意:此处指定ftl⽂件所在⽬录的路径,⽽不是ftl⽂件的路径31 configuration.setDirectoryForTemplateLoading(new File("C:/"));32//以utf-8的编码格式读取⽂件33 template = configuration.getTemplate("导出优惠证明.ftl", "utf-8");34 } catch (IOException e) {35 e.printStackTrace();36throw new RuntimeException("⽂件模板加载失败!", e);37 }3839// 填充数据40try {41 template.process(dataMap, out);42 } catch (TemplateException e) {43 e.printStackTrace();44throw new RuntimeException("模板数据填充异常!", e);45 } catch (IOException e) {46 e.printStackTrace();47throw new RuntimeException("模板数据填充异常!", e);48 } finally {49if (null != out) {50try {51 out.close();52 } catch (IOException e) {53 e.printStackTrace();54throw new RuntimeException("⽂件输出流关闭异常!", e);55 }56 }57 }58 }View Code因为很多时候我们根据模板⽣成⽂件需要添加⽔印,也就是插⼊图⽚1/***2 * 处理图⽚3 * @param watermarkPath 图⽚路径 D:/image.png4 * @return5*/6private String getWatermarkImage(String watermarkPath) {7 InputStream in = null;8byte[] data = null;9try {10 in = new FileInputStream(watermarkPath);11 data = new byte[in.available()];12 in.read(data);13 in.close();14 } catch (Exception e) {15 e.printStackTrace();16 }17 BASE64Encoder encoder = new BASE64Encoder();18return encoder.encode(data);19 }View Code注意点:插⼊图⽚后的word转化为ftl模板⽂件(ps:⽔印图⽚可以在word上调整到⾃⼰想要的⼤⼩,然后在执⾏下⾯的步骤)1、先另存为xml2、将xml扩展名改为ftl3、打开ftl⽂件, 搜索w:binData 或者 png可以快速定位图⽚的位置,图⽚已经编码成0-Z的字符串了, 如下:5、将上述0-Z的字符串全部删掉,写上${image}(变量名随便写,跟dataMap⾥的key保持⼀致)后保存6、也是创建⼀个Map, 将数据存到map中,只不过我们要把图⽚⽤代码进⾏编码,将其也编成0-Z的字符串,代码请看上边⾄此⼀个简单的按照模板⽣成word并插⼊图⽚(⽔印)功能基本完成。

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

package cn.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import sun.misc.BASE64Encoder;public class XmlWord {private Map<String,String> dataMap = new HashMap<String,String>();public Map<String, String> getDataMap() {return dataMap;}public void setDataMap(Map<String, String> dataMap) {this.dataMap = dataMap;}/*** 设置标识值* @param tagList 标识* @param dataList 数据* @param dataMap*/public void setData(List<String> tagList,List<String> dataList){Iterator<String> it1 = tagList.iterator();Iterator<String> it2 = dataList.iterator();while(it1.hasNext()){this.dataMap.put(it1.next(), it2.next());}}/*** 载入一个xml文档* @param filename 文件路径* @return 成功返回Document对象,失败返回null*/public Document LoadXml(String filename){Document doc = null;try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();doc = (Document) builder.parse(new File(filename));System.out.println(doc);} catch (Exception e) {System.out.println("载入xml文件时出错");e.printStackTrace();}return doc;}/*** 图片转码* @return 返回图片base64字符串* @throws Exception*/public String getImageStr(String imgFile){InputStream in = null;BASE64Encoder encoder = null;byte[] data = null;try {in = new FileInputStream(imgFile);} catch (FileNotFoundException e) {System.out.println("文件没找到!");e.printStackTrace();}try {data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}encoder = new BASE64Encoder();return encoder.encode(data);}/*** doc2XmlFile* 将Document对象保存为一个xml文件* @return true:保存成功flase:失败* @param filename 保存的文件名* @param document 需要保存的document对象*/public boolean doc2XmlFile(Document document,String filename){boolean flag = true;try{TransformerFactory transFactory = TransformerFactory.newInstance();Transformer transformer = transFactory.newTransformer();DOMSource source=new DOMSource();source.setNode(document);StreamResult result=new StreamResult();FileOutputStream fileOutputStream = new FileOutputStream(filename);result.setOutputStream(fileOutputStream);transformer.transform(source, result);fileOutputStream.close();}catch(Exception ex){flag = false;ex.printStackTrace();}return flag;}/*** 替换标识内容:单个文本标记* @param element 要替换内容的节点* @param tag 标识名称* @param data 替换参数* @return 返回替换后的节点* @throws Exception*/public Element replaceTagContext(Object element,String tag,String data){Element xElement = null;xElement = (Element) element;NodeList tElements = xElement.getElementsByTagName("w:t");//w:t标签组for(int i=0; i<tElements.getLength(); i++){Element tElement = (Element)tElements.item(i);if(tElement.getTextContent().equals(tag)){tElement.setTextContent(data);}}return xElement;}/*** 替换标识内容:多个文本标记* @param element 要替换内容的节点* @return 返回替换后的节点* @throws Exception*/public Element replaceTagContext(Element element){Element xElement = element;NodeList tElements = xElement.getElementsByTagName("w:t");//w:t标签组Set<String> dataSet = this.dataMap.keySet();Iterator<String> it = dataSet.iterator();while(it.hasNext()){String tag = it.next();String data = dataMap.get(tag);for(int i=0; i<tElements.getLength(); i++){Element tElement = (Element)tElements.item(i);if(tElement.getTextContent().equals(tag)){tElement.setTextContent(data);}}}return xElement;}/*** 添加图片* @param element 需要替换内容的节点* @param tag 标识名称* @param imgName 图片名称,若word中有多张图,图片名必须唯一* @param imgStr 图片转码后的base64字符串* @return 返回替换后的节点*/public Element replacePic(Element element,String tag,String imgName,String imgFile){ Element xElement = element;NodeList tElements = xElement.getElementsByTagName("w:binData");//w:t标签组pkg:binaryDataString wName = "wordml://"+imgName;for(int i=0; i<tElements.getLength(); i++){Element picElement = (Element)tElements.item(i);if(picElement.getTextContent().equals(tag)){picElement.setTextContent(this.getImageStr(imgFile));/*图片编码*/picElement.setAttribute("w:name",wName);//设置名字Element imagedataElement = (Element) xElement.getElementsByTagName("v:imagedata").item(i);imagedataElement.setAttribute("src",wName);}}return xElement;}/*** 插入图片* @param parentElement 图片添加至何处* @param imgFile 图片路径* @param isnewLine 是否换行* @return 返回添加图片节点后的节点*/public Element addPic(Element parentElement,String imgFile,boolean isnewLine){ Document parent = parentElement.getOwnerDocument();Element p = null;Element pict = null;Element binData = null;Element shape = null;Element imagedata = null;String src = "wordml://" + new Date().getTime();if(isnewLine){p = parent.createElement("w:p");}pict = parent.createElement("w:pict");binData = parent.createElement("w:binData");binData.setAttribute("w:name", src);binData.setAttribute("xml:space", "preserve");binData.setTextContent(this.getImageStr(imgFile));shape = parent.createElement("v:shape");imagedata = parent.createElement("v:imagedata");imagedata.setAttribute("src", src);//构造图片节点shape.appendChild(imagedata);pict.appendChild(binData);pict.appendChild(shape);if(isnewLine){p.appendChild(pict);parentElement.appendChild(p);}else{parentElement.appendChild(pict);}return parentElement;}/*** 插入段落* @param parentElement 待添加段落的节点* @param data 待插入数据* @return*/public Element addParagraph(Element parentElement,String data){ Document parent = parentElement.getOwnerDocument();Element p = null;Element r = null;Element t = null;p = parent.createElement("w:p");r = parent.createElement("w:r");t = parent.createElement("w:t");t.setTextContent(data);//构造图片节点r.appendChild(t);p.appendChild(r);parentElement.appendChild(p);return parentElement;}}。

相关文档
最新文档