JAVA调用模版生成WORD文件

合集下载

java生成word文件并下载

java生成word文件并下载

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import .URLEncoder;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import freemarker.template.Configuration;import freemarker.template.Template;/*** @Desc:word 操作工具类*/public class WordUtil {private static Logger log = Logger.getLogger(WordUtil.class);/*** @Desc :生成word 文件* @param dataMap word 中需要展示的动态数据,用map 集合来保存* @param templateName word 模板名称,例如:test.ftl* @param filePath 文件生成的目标路径,例如:D:/wordFile/* @param fileName 生成的文件名称,例如:test.doc*/public static void createWord(Map<String, Object> dataMap,String templateName,String filePath,String fileName){try {// 创建配置实例Configuration configuration = new Configuration();// 设置编码configuration.setDefaultEncoding("UTF-8");//ftl 模板文件File file = new File(filePath); configuration.setDirectoryForTemplateLoading(file);// 获取模板Template template = configuration.getTemplate(templateName);// 输出文件File outFile = new File(filePath + File.separator + fileName);// 如果输出目标文件夹不存在,则创建if (!outFile.getParentFile().exists()){ outFile.getParentFile().mkdirs();}// 将模板和数据模型合并生成文件Writer out = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(outFile),"UTF-8"));// 生成文件template.process(dataMap, out);// 关闭流out.flush();out.close();} catch (Exception e) {log.error(" 生成word 文档(WordUtil) 出错:【msg:"+e.getMessage()+" 】,文件名:" + fileName);e.printStackTrace();}/**文件下载* @param path 文件路径全路径,包含文件名* @param response* @return*/public static HttpServletResponse downFile(String path, HttpServletResponse response) { try { // path 是指欲下载的文件的路径。

Java使用Poi-tlword模板导出word

Java使用Poi-tlword模板导出word

Java使⽤Poi-tlword模板导出word 1.导⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency>2.新建⼀个word,制作导出模板模板放⼊ resource/static/word/template⽂件夹下3.编写⼯具类⼯具类--WordExportServer.javapublic class WordExportServer {/*** 导出word**/public static void export(WordExportData wordExportData) throws IOException {HttpServletResponse response=wordExportData.getResponse();OutputStream out = response.getOutputStream();;XWPFTemplate template =null;try{ClassPathResource classPathResource = new ClassPathResource(wordExportData.getTemplateDocPath());String resource = classPathResource.getURL().getPath();resource= PdfUtil1.handleFontPath(resource);//渲染表格HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind(wordExportData.getTableDataField(), policy).build();template = pile(resource, config).render(wordExportData.getWordData());String fileName=getFileName(wordExportData);/** ===============⽣成word到设置浏览默认下载地址=============== **/// 设置强制下载不打开response.setContentType("application/force-download");// 设置⽂件名response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);template.write(out);}catch (Exception e){e.printStackTrace();}finally {out.flush();out.close();template.close();}}/*** 获取导出下载的word名称* @param wordExportData* @return ng.String**/public static String getFileName(WordExportData wordExportData){if(null !=wordExportData.getFileName()){return wordExportData.getFileName()+".docx";}return System.currentTimeMillis()+".docx";}}word数据包装类--WordExportData .java@Datapublic class WordExportData {/*** word模板路径(static/wordTemplate/dealerListDocTemplate.docx)**/private String templateDocPath;/*** word填充数据(key值与模板中的key值要保持⼀致)**/private Map<String,Object> wordData;/*** word表格数据key值**/private String tableDataField;/*** word导出后的⽂件名(不填则⽤当前时间代替)**/private String fileName;private HttpServletResponse response;}4.controller层调⽤@RequestMapping("/printWord")public void printWord(HttpServletRequest request, HttpServletResponse response) throws IOException{String[] ids=request.getParameter("ids").split(";");List<DealerDto> goodsDataList=goodsService.getDealerListByIds(ids);Map<String,Object> docData=new HashMap<>(3);docData.put("detailList",goodsDataList);docData.put("title",标题);docData.put("subTitle",副标题);WordExportData wordExportData=new WordExportData();wordExportData.setResponse(response);wordExportData.setTableDataField("detailList");wordExportData.setTemplateDocPath(DEALER_DOC_TEMPLATE_PATH);//副本存放路径wordExportData.setWordData(docData);WordExportServer.export(wordExportData);}5.前端调⽤var ids = [];for (var index in checkData) {ids.push(checkData[index].id);}var batchIds = ids.join(";");layer.confirm('确定下载选中的数据吗?', function (index) {layer.close(index);window.location.href ='/goods/printWord?ids=' + batchIds;});6.总结优点:使⽤⽅法很简单,使⽤⼯具类的⽅法,⽅便复⽤于其他模块。

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的xwpftemplate api说明

java的xwpftemplate api说明

一、介绍Java是一种跨评台的面向对象编程语言,广泛应用于企业级应用开发、手机应用程序开发等领域。

XWPTemplate是Java中一款强大的模板引擎,用于生成Word文档。

本文将对XWPTemplate API进行详细说明,帮助开发者更好地了解和使用该工具。

二、XWPTemplate API的基本概念1. XWPTemplate是一个开源的Java模板引擎,可以用于生成Word 文档。

2. XWPTemplate基于Apache POI,支持Office Open XML格式的Word文档(.docx)。

3. XWPTemplate采用模板+数据的方式生成文档,使用简单灵活。

三、XWPTemplate API的核心功能1. 模板的加载和解析:XWPTemplate提供了丰富的API用于加载和解析模板文件,开发者可以轻松地将模板文件加载到内存中,并对模板进行解析。

2. 数据的填充和替换:XWPTemplate支持数据的填充和替换,开发者可以将数据动态地填充到模板中,实现自定义的文档生成需求。

3. 表格和图片的处理:XWPTemplate提供了对表格和图片的处理功能,可以对文档中的表格和图片进行动态添加、删除和修改操作。

4. 样式和格式的设置:XWPTemplate支持对文档的样式和格式进行定制,包括字体、颜色、对齐方式等各种样式属性的设置。

四、XWPTemplate API的使用方法1. 引入依赖:在Maven项目中,可以通过在pom.xml中引入以下依赖来使用XWPTemplate:```<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.apachemons</groupId><artifactIdmons-collections4</artifactId><version>4.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.openxmlformats</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency><dependency><groupId.deepoove</groupId><artifactId>xwpf-template</artifactId><version>3.7.4</version></dependency>```2. 创建模板:开发者可以使用Microsoft Word等工具创建模板,通过${}标记需要填充的动态数据。

java生成word的几种方案

java生成word的几种方案

java⽣成word的⼏种⽅案1、 Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建⼀座桥梁。

使⽤Jacob⾃带的DLL动态链接库,并通过JNI的⽅式实现了在Java平台上对COM程序的调⽤。

DLL动态链接库的⽣成需要windows平台的⽀持。

2、 Apache POI包括⼀系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式⽂件,可以通过这些API在Java中读写Excel、Word等⽂件。

他的excel处理很强⼤,对于word还局限于读取,⽬前只能实现⼀些简单⽂件的操作,不能设置样式。

3、 Java2word是⼀个在java程序中调⽤ MS Office Word ⽂档的组件(类库)。

该组件提供了⼀组简单的接⼝,以便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中编辑⽂档完全⼀样。

7、补充⼀种⽅案,可以⽤类似ueditor的在线编辑器编辑word⽂档,在将html⽂件转换为xhtml⽂件,再转换为word。

java使用模板生成word文件

java使用模板生成word文件

java使⽤模板⽣成word⽂件springboot项⽬,模板放在了templates下⾯,后⾯要根据模板⽣成word1、⽣成⼀个word模板,如图:注:{{code}}的是需填写的参数下⾯是⽣成本地的pom⽂件<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.jfree</groupId><artifactId>jcommon</artifactId><version>1.0.24</version></dependency><dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.0</version></dependency>/*** @Version 1.0.0* @Description*/public class WordUtil {/*** ⽣成word* @param templatePath* @param temDir* @param fileName* @param params*/public static void exportWord(String templatePath, String temDir, String fileName, Map<String,Object> params){Assert.notNull(templatePath, "模板路径不能为空");Assert.notNull(temDir, "临时⽂件路径不能为空");Assert.notNull(fileName, "导出⽂件名不能为空");Assert.isTrue(fileName.endsWith(".docx"), "word导出请使⽤docx格式");if (!temDir.endsWith("/")) {temDir = temDir + File.separator;}File dir = new File(temDir);if (!dir.exists()) {dir.mkdirs();}try {XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);String tmpPath = temDir + fileName;FileOutputStream fos = new FileOutputStream(tmpPath);doc.write(fos);fos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}}}/*** @Version 1.0.0* @Description*/public class WordDemo {public static void main(String[] args) {Map<String,Object> map = new HashMap<>();map.put("username", "张三");map.put("company","xx公司" );map.put("date","2020-04-20" );map.put("dept","IT部" );map.put("startTime","2020-04-20 08:00:00" );map.put("endTime","2020-04-20 08:00:00" );map.put("reason", "外出办公");map.put("time","2020-04-22" );WordUtil.exportWord("templates/demo.docx","D:/" ,"⽣成⽂件.docx" ,map );}}2、下⾯是下载word⽂件/*** 导出word形式* @param response*/@RequestMapping("/exportWord")public void exportWord(HttpServletResponse response){Map<String,Object> map = new HashMap<>();map.put("username", "张三");map.put("company","杭州xx公司" );map.put("date","2020-04-20" );map.put("dept","IT部" );map.put("startTime","2020-04-20 08:00:00" );map.put("endTime","2020-04-20 08:00:00" );map.put("reason", "外出办公");map.put("time","2020-04-22" );try {response.setContentType("application/msword");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("测试","UTF-8" );//String fileName = "测试"response.setHeader("Content-disposition","attachment;filename="+fileName+".docx" ); XWPFDocument doc = WordExportUtil.exportWord07("templates/demo.docx",map); doc.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();}//WordUtil.exportWord("templates/demo.docx","D:/" ,"⽣成⽂件.docx" ,map );} 。

JAVA不使用POI,用PageOffice动态导出Word文档

JAVA不使用POI,用PageOffice动态导出Word文档

JAVA不使用POI,用PageOffice动态导出Word文档很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功能即可实现。

但若是用户想动态生成一个没有固定模版的公文时,换句话说,没有办法事先准备一个固定格式的模板时,就需要开发人员在后台用代码实现Word文档的从零到图文并茂的动态生成功能了。

这里的“零”指的是Word空白文档。

那如何实现Word文档的从无到有呢,下面我就把自己实现这一功能的过程介绍一下。

例如,我想打开一个Word文档,里面的内容为:标题(粗体、黑体、字体大小为20、居中显示)、第一段内容(内容(略)、字体倾斜、字体大小为10、中文“楷体”、英文“Times New Roman”、红色、最小行间距、左对齐、首行缩进)、第二段内容(内容(略)、字体大小为12、黑体、1.5倍行间距、左对齐、首行缩进、插入图片)、第三段内容(内容(略)、字体大小为14、华文彩云、2倍行间距、左对齐、首行缩进)第一步:请先安装PageOffice的服务器端的安装程序,之后在WEB项目下的“WebRoot/WEB-INF/lib”路径中添加pageoffice.cab和pageoffice.jar(在网站的“下载中心”中可下载相应的压缩包,解压之后直接将pageoffice.cab和pageoffice.jar文件拷贝到该目录下就可以了)文件。

第二步:修改WEB项目的配置文件,将如下代码添加到配置文件中:<!-- PageOffice Begin --><servlet><servlet-name>poserver</servlet-name><servlet-class>com.zhuozhengsoft .pageoffice.poserver.Server</servlet-class></servlet><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/poserver.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/pageoffice.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/popdf.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/sealsetup.exe</url-pattern></servlet-mapping><servlet><servlet-name>adminseal</servlet-name><servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal </servlet-class></servlet><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/adminseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/loginseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/sealimage.do</url-pattern></servlet-mapping><mime-mapping><extension>mht</extension><mime-type>message/rfc822</mime-type></mime-mapping><context-param><param-name>adminseal-password</param-name><param-value>123456</param-value></context-param><!-- PageOffice End -->第三步:在WEB项目的WebRoot目录下添加文件夹存放word模板文件,在此命名为“doc”,将要打开的空白Word文件拷贝到该文件夹下,我要打开的Word文件为“test.doc”。

JAVA生成word文档代码加说明

JAVA生成word文档代码加说明

import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Iterator;import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.FieldsDocumentPart;import ermodel.Field;import ermodel.Fields;import ermodel.Range;import ermodel.Table;import ermodel.TableIterator;import ermodel.TableRow;publicclass WordUtil {publicstaticvoid readwriteWord(String filePath, String downPath, Map<String, String> map, int[] num, String downFileName) { //读取word模板FileInputStream in = null;try {in = new FileInputStream(new File(filePath));} catch (FileNotFoundException e1) {e1.printStackTrace();}HWPFDocument hdt = null;try {hdt = new HWPFDocument(in);} catch (IOException e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//读取word表格内容try {Range range = hdt.getRange();//得到文档的读取范围TableIterator it2 = new TableIterator(range);//迭代文档中的表格int tabCount = 0;while (it2.hasNext()) {//System.out.println(" 第几个表格 "+tabCount);//System.out.println(num[tabCount] +" 行");Table tb2 = (Table) it2.next();//迭代行,默认从0开始for (int i = 0; i < tb2.numRows(); i++) {TableRow tr = tb2.getRow(i);// System.out.println(" fu "+num[tabCount] +" 行");if (num[tabCount] < i && i < 7) {tr.delete();}} //end fortabCount++;} //end while//替换word表格内容for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$"+ entry.getKey().trim() + "$", entry.getValue());}// System.out.println("替换后------------:"+range.text().trim());} catch (Exception e) {e.printStackTrace();}//System.out.println("--------------------------------------------------------------------------------------");ByteArrayOutputStream ostream = new ByteArrayOutputStream();String fileName = downFileName;fileName += ".doc";String pathAndName = downPath + fileName;File file = new File(pathAndName);if (file.canRead()) {file.delete();}FileOutputStream out = null;out = new FileOutputStream(pathAndName, true);} catch (FileNotFoundException e) {e.printStackTrace();}try {hdt.write(ostream);} catch (IOException e) {e.printStackTrace();}//输出字节流try {out.write(ostream.toByteArray());} catch (IOException e) {e.printStackTrace();}try {out.close();} catch (IOException e) {e.printStackTrace();}try {ostream.close();} catch (IOException e) {e.printStackTrace();}}/***实现对word读取和修改操作(输出文件流下载方式)*@param response响应,设置生成的文件类型,文件头编码方式和文件名,以及输出*@param filePathword模板路径和名称*@param map待填充的数据,从数据库读取*/publicstaticvoid readwriteWord(HttpServletResponse response, String filePath, Map<String, String> map) {//读取word模板文件//String fileDir = newFile(base.getFile(),"//.. /doc/").getCanonicalPath();//FileInputStream in = new FileInputStream(newFile(fileDir+"/laokboke.doc"));FileInputStream in;HWPFDocument hdt = null;in = new FileInputStream(new File(filePath));hdt = new HWPFDocument(in);} catch (Exception e1) {e1.printStackTrace();}Fields fields = hdt.getFields();Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN) .iterator();while (it.hasNext()) {System.out.println(it.next().getType());}//替换读取到的word模板内容的指定字段Range range = hdt.getRange();for (Map.Entry<String, String> entry : map.entrySet()) { range.replaceText("$" + entry.getKey() + "$",entry.getValue());}//输出word内容文件流,提供下载response.reset();response.setContentType("application/x-msdownload");String fileName = "" + System.currentTimeMillis() + ".doc";response.addHeader("Content-Disposition", "attachment;filename="+ fileName);ByteArrayOutputStream ostream = new ByteArrayOutputStream();OutputStream servletOS = null;try {servletOS = response.getOutputStream();hdt.write(ostream);servletOS.write(ostream.toByteArray());servletOS.flush();servletOS.close();} catch (Exception e) {e.printStackTrace();}}}注:以上代码需要poi包, 可以下载。

Java?POI?生成Word文档(表格格式)

Java?POI?生成Word文档(表格格式)

Java POI 生成Word文档(表格格式)1.package com.seawater.controller;2.3.import org.apache.poi.xwpf.model.XWPFHeaderFooterPo licy;4.import ermodel.*;5.import org.openxmlformats.schemas.wordprocessingml.x 2006.main.*;6.7.import java.io.File;8.import java.io.FileOutputStream;9.import java.math.BigInteger;10.11.12.13.public class WordExportController {14.15.public static void main(String[] args)throws Exceptio n {16.//Blank Document17.XWPFDocument document= new XWPFDocument();18.19.//Write the Document in file system20.FileOutputStream out = new FileOutputStream(new Fi le("create_table.docx")); // 下载路径/文件名称21.22.23.//添加标题24.XWPFParagraph titleParagraph = document_createParagraph();25.//设置段落居中26.titleParagraph.setAlignment(ParagraphAlignment.CEN TER);27.28.XWPFRun titleParagraphRun = titleParagraph.createR un();29.titleParagraphRun.setText(";30.titleParagraphRun.setColor("000000");31.titleParagraphRun.setFontSize(20);32.33.34.//段落35.XWPFParagraph firstParagraph = document_createPar agraph();36.XWPFRun run = firstParagraph.createRun();37.run.setT ext(";38.run.setColor("696969");39.run.setFontSize(16);40.41.//设置段落背景颜色42.CTShd cTShd = run.getCTR().addNewRPr().addNewSh d();43.cTShd.setVal(STShd.CLEAR);44.cTShd.setFill("97FFFF");45.46.47.//换行48.XWPFParagraph paragraph1 = document_createParag raph();49.XWPFRun paragraphRun1 = paragraph1.createRun();50.paragraphRun1.setText("\r");51.52.53.//基本信息表格54.XWPFTable infoTable = document_createTable();55.//去表格边框Table.getCTTbl().getTblPr().unsetTblBorders();57.58.59.//列宽自动分割60.CTTblWidth infoTableWidth = infoTable.getCTTbl().ad dNewTblPr().addNewTblW();TableWidth.setType(STTblWidth.DXA);TableWidth.setW(BigInteger.valueOf(9072));63.64.65.//表格第一行66.XWPFTableRow infoTableRowOne = infoTable.getRow( 0);TableRowOne.getCell(0).setText("职位");TableRowOne.addNewTableCell().setText(": ;69.70.//表格第二行71.XWPFTableRow infoTableRowTwo = infoTable.createRo w();TableRowTwo.getCell(0).setText("姓名");TableRowTwo.getCell(1).setText(": seawater");74.75.//表格第三行76.XWPFTableRow infoTableRowThree = infoTable.create Row();TableRowThree.getCell(0).setText("生日");TableRowThree.getCell(1).setText(": xxx-xx-xx");79.80.//表格第四行81.XWPFTableRow infoTableRowFour = infoTable.createR ow();TableRowFour.getCell(0).setText("性别");TableRowFour.getCell(1).setText(": 男");84.85.//表格第五行86.XWPFTableRow infoTableRowFive = infoTable.createRo w();TableRowFive.getCell(0).setText("现居地");TableRowFive.getCell(1).setText(": xx");89.90.91.//两个表格之间加个换行92.XWPFParagraph paragraph = document_createParagr aph();93.XWPFRun paragraphRun = paragraph.createRun();94.paragraphRun.setT ext("\r");95.96.97.98.//工作经历表格99.XWPFTable ComTable = document_createTable();100.101.102.//列宽自动分割103.CTTblWidth comTableWidth = ComTable.getCTTbl().a ddNewTblPr().addNewTblW();TableWidth.setType(STTblWidth.DXA);TableWidth.setW(BigInteger.valueOf(9072));106.107.//表格第一行108.XWPFTableRow comTableRowOne = ComTable.getRo w(0);TableRowOne.getCell(0).setText("开始时间");TableRowOne.addNewTableCell().setText("结束时间");TableRowOne.addNewTableCell().setText("公司名称");TableRowOne.addNewTableCell().setText("title");113.114.//表格第二行115.XWPFTableRow comTableRowTwo = ComTable.createR ow();TableRowTwo.getCell(0).setText("2016-09-06");TableRowTwo.getCell(1).setText("至今");TableRowTwo.getCell(2).setText("seawater");TableRowTwo.getCell(3).setText(";120.121.//表格第三行122.XWPFTableRow comTableRowThree = ComTable.creat eRow();TableRowThree.getCell(0).setT ext("2016-09-06");TableRowThree.getCell(1).setT ext("至今");TableRowThree.getCell(2).setT ext("seawater");TableRowThree.getCell(3).setT ext(";127.128.129.CTSectPr sectPr = document.getDocument().getBody() .addNewSectPr();130.XWPFHeaderFooterPolicy policy = new XWPFHeaderF ooterPolicy(document, sectPr);131.132.//添加页眉133.CTP ctpHeader = CTP.Factory.newInstance();134.CTR ctrHeader = ctpHeader.addNewR();135.CTText ctHeader = ctrHeader.addNewT();136.String headerText = "Java POI create MS word file.";137.ctHeader.setStringValue(headerText);138.XWPFParagraph headerParagraph = new XWPFParagr aph(ctpHeader, document);139.//设置为右对齐140.headerParagraph.setAlignment(ParagraphAlignment.R IGHT);141.XWPFParagraph[] parsHeader = new XWPFParagraph[ 1];142.parsHeader[0] = headerParagraph;143.policy.createHeader(XWPFHeaderFooterPolicy.DEFAUL T, parsHeader);144.145.146.//添加页脚147.CTP ctpFooter = CTP.Factory.newInstance();148.CTR ctrFooter = ctpFooter.addNewR();149.CTText ctFooter = ctrFooter.addNewT();150.String footerText = "/zhouseawate r";151.ctFooter.setStringValue(footerText);152.XWPFParagraph footerParagraph = new XWPFParagra ph(ctpFooter, document);153.headerParagraph.setAlignment(ParagraphAlignment.C ENTER);154.XWPFParagraph[] parsFooter = new XWPFParagraph[ 1];155.parsFooter[0] = footerParagraph;156.policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT , parsFooter);157.158.159.document.write(out);160.out.close();161.System.out.println("create_table document written suc cess.");162.}163.164.165.}如果我们的表格不需要边框呢就加下面的代码:[java] view plain copyTable.getCTTbl().getTblPr().unsetTblBorders();infoTable换成自己的table名称就可以了。

Aspose.wordsJava基于模板生成word之纯文本内容

Aspose.wordsJava基于模板生成word之纯文本内容

Aspose.wordsJava基于模板⽣成word之纯⽂本内容⼀,创建word模板1.新建⼀个word⽂档2.分别给四个参数设置域(1)将⿏标置于想要设置域的地⽅(2)设置域名(3)设置好之后如下图所⽰⼆,项⽬1,引⼊maven依赖<dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>18.5</version><classifier>jdk16</classifier></dependency>2,加载授权⽂件public static boolean getLicense() {boolean result = false;try {InputStream is = AsposeToWordTest.class.getClassLoader().getResourceAsStream("license-word.xml"); License aposeLic = new License();aposeLic.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}return result;}3,获取值以及插⼊到模板中并⽣成新的⽂档public static void main(String[] args) throws Exception {// 验证Licenseif (!getLicense()) {return;}//模板wordString template = "E:\\test\\temp.docx";//⽬标wordString destdoc = "E:\\test\\edit.docx";//定义⽂档接⼝Document doc = new Document(template);//⽂本域String[] Flds = new String[]{"caseIssue","policeName", "caseName", "caseTime"};String caseIssue = "001";String policeName = "XX派出所";String caseName = "0727电动车盗窃案";String caseTime = "2018-07-26 12:20:22";//值Object[] Vals = new Object[]{caseIssue,policeName, caseName, caseTime};//调⽤接⼝doc.getMailMerge().execute(Flds, Vals);doc.save(destdoc);System.out.println("完成");}4,结果。

java 根据word模板生成word文件

java 根据word模板生成word文件

java 根据word模板生成word文件Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word 文件的功能。

下面是一个简单的示例代码,可以帮助您快速入门。

模板制作:offer,wps都行,我使用wps进行操作第一步制作模板CTRL+f9生成域------》鼠标右键编辑域------》选择邮件合并-----》在域代码后面加上英文${跟代码内的一致}。

这样模板就创建好了。

首先需要引入POI和freemarker的依赖:<!-- Apache POI --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document< /artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template< /artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document.docx</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId><version>2.0.2</version></dependency>接下来是一个简单的示例代码:public class WordGenerator {public static void main(String[] args) throws IOException, TemplateException {// 读取Word模板try {= null;//wordInputStream in = new (new File("模板文件.docx"));//注册xdocreport实例并加载FreeMarker模板引擎IXDocReport r = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Freemarker);// 生成Word文件//创建xdocreport上下文对象IContext context =r.createContext();//将需要替换的数据数据添加到上下文中//其中key为word模板中的域名,value是需要替换的值User user = new User("zhangsan", 18, "福建泉州");context.put("uesrname",user.getUsername());context.put("age", user.getAge()); context.put("address",user.getAddress());out = new (newFile("D://xxx.docx"));//处理word文档并输出r.process(context, out);} catch (IOException e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}}在这个示例代码中,我们读取了名为模板文件.docx的Word 模板,然后准备了一些数据,利用Freemarker模板引擎将数据填充到模板中,最后生成了一个名为xxx.docx的Word文件。

Javafreemarker生成word模板文件(如合同文件)及转pdf文件方法

Javafreemarker生成word模板文件(如合同文件)及转pdf文件方法

Javafreemarker⽣成word模板⽂件(如合同⽂件)及转pdf⽂件⽅法Java freemarker⽣成word模板⽂件(如合同⽂件)及转pdf⽂件⽅法创建模板⽂件ContractTemplate.docxContractTemplate.xml导⼊的Jar包compile("junit:junit")compile("org.springframework:spring-test")compile("org.springframework.boot:spring-boot-test")testCompile 'org.springframework.boot:spring-boot-starter-test'compile 'org.freemarker:freemarker:2.3.28'compile 'fakepath:aspose-words:19.5jdk'compile 'fakepath:aspose-cells:8.5.2'Java⼯具类 xml⽂档转换 Word XmlToDocx.javapackage com.test.docxml.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;/*** xml⽂档转换 Word*/public class XmlToDocx {/**** @param documentFile 动态⽣成数据的docunment.xml⽂件* @param docxTemplate docx的模板* @param toFilePath 需要导出的⽂件路径* @throws Exception*/public static void outDocx(File documentFile, String docxTemplate, String toFilePath,String key) throws Exception { try {File docxFile = new File(docxTemplate);ZipFile zipFile = new ZipFile(docxFile);Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();FileOutputStream fileOutputStream = new FileOutputStream(toFilePath);ZipOutputStream zipout = new ZipOutputStream(fileOutputStream);int len = -1;byte[] buffer = new byte[1024];while (zipEntrys.hasMoreElements()) {ZipEntry next = zipEntrys.nextElement();InputStream is = zipFile.getInputStream(next);// 把输⼊流的⽂件传到输出流中如果是word/document.xml由我们输⼊zipout.putNextEntry(new ZipEntry(next.toString()));if ("word/document.xml".equals(next.toString())) {InputStream in = new FileInputStream(documentFile);while ((len = in.read(buffer)) != -1) {zipout.write(buffer, 0, len);}in.close();} else {while ((len = is.read(buffer)) != -1) {zipout.write(buffer, 0, len);}is.close();}}zipout.close();} catch (Exception e) {e.printStackTrace();}}}Java⼯具类 word⽂档转换 PDF WordToPdf.javapackage com.test.docxml.utils;import com.aspose.cells.*;import com.aspose.cells.License;import com.aspose.words.*;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;/*** word⽂档转换 PDF*/public class WordToPdf {/*** 获取license许可凭证* @return*/private static boolean getLicense() {boolean result = false;try {String licenseStr = "<License>\n"+ " <Data>\n"+ " <Products>\n"+ " <Product>Aspose.Total for Java</Product>\n"+ " <Product>Aspose.Words for Java</Product>\n"+ " </Products>\n"+ " <EditionType>Enterprise</EditionType>\n"+ " <SubscriptionExpiry>20991231</SubscriptionExpiry>\n"+ " <LicenseExpiry>20991231</LicenseExpiry>\n"+ " <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>\n"+ " </Data>\n"+ " <Signature>0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuin + "</License>";InputStream license = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));License asposeLic = new License();asposeLic.setLicense(license);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** word⽂档转换为 PDF* @param inPath 源⽂件* @param outPath ⽬标⽂件*/public static File doc2pdf(String inPath, String outPath) {//验证License,获取许可凭证if (!getLicense()) {return null;}//新建⼀个PDF⽂档File file = new File(outPath);try {//新建⼀个IO输出流FileOutputStream os = new FileOutputStream(file);//获取将要被转化的word⽂档Document doc = new Document(inPath);// 全⾯⽀持DOC, DOCX,OOXML, RTF HTML,OpenDocument,PDF, EPUB, XPS,SWF 相互转换doc.save(os, com.aspose.words.SaveFormat.PDF);os.close();} catch (Exception e) {e.printStackTrace();}return file;}public static void main(String[] args) {doc2pdf("D:/1.doc", "D:/1.pdf");}}Java单元测试类 XmlDocTest.javapackage com.test.docxml;import com.test.docxml.utils.WordToPdf;import com.test.docxml.utils.XmlToDocx;import freemarker.template.Configuration;import freemarker.template.Template;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import java.io.File;import java.io.PrintWriter;import java.io.Writer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Locale;import java.util.Map;/*** 本地单元测试*/@RunWith(SpringJUnit4ClassRunner.class)//@RunWith(SpringRunner.class)@SpringBootTest(classes= TemplateApplication.class)@WebAppConfigurationpublic class XmlDocTest {//短租@Testpublic void testContract() throws Exception{String contractNo = "1255445544";String contractCorp = "银河宇宙⽆敌测试soft";String contractDate = "2022-01-27";String contractItem = "房地产交易中⼼";String contractContent = "稳定发展中的⽂案1万字";//doc xml模板⽂件String docXml = "ContractTemplate.xml"; //使⽤替换内容//xml中间临时⽂件String xmlTemp = "tmp-ContractTemplate.xml";//⽣成⽂件的doc⽂件String toFilePath = contractNo + ".docx";//模板⽂档String docx = "ContractTemplate.docx";//⽣成pdf⽂件String toPdfFilePath = contractNo + ".pdf";;String CONTRACT_ROOT_URL = "/template";Resource contractNormalPath = new ClassPathResource(CONTRACT_ROOT_URL + File.separator + docXml);String docTemplate = contractNormalPath.getURI().getPath().replace(docXml, docx);//设置⽂件编码(注意点1)Writer writer = new PrintWriter(new File(xmlTemp),"UTF-8");Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);configuration.setEncoding(Locale.CHINESE, Charset.forName("UTF-8").name());//设置配置(注意点3)configuration.setDefaultEncoding("UTF-8");String filenametest = contractNormalPath.getURI().getPath().replace(docXml, "");System.out.println("filenametest=" + filenametest);configuration.setDirectoryForTemplateLoading(new File(filenametest));// Template template = configuration.getTemplate(ContractConstants.CONTRACT_NORMAL_URL+orderType+type+".xml"); //设置模板编码(注意点2)Template template = configuration.getTemplate(docXml,"UTF-8"); //绝对地址Map paramsMap = new HashMap();paramsMap.put("contractCorp",contractCorp);paramsMap.put("contractDate",contractDate);paramsMap.put("contractNo",contractNo);paramsMap.put("contractItem",contractItem);paramsMap.put("contractContent",contractContent);template.process(paramsMap, writer);XmlToDocx.outDocx(new File(xmlTemp), docTemplate, toFilePath, null);System.out.println("do finish");//转成pdfWordToPdf.doc2pdf(toFilePath,toPdfFilePath);}}创建成功之后的⽂件如下:。

java利用word模版导出word文档详细说明

java利用word模版导出word文档详细说明
//定义Template对象
t = configuration.getTemplate(fileName);
//configuration.setDirectoryForTemplateLoading(new File("E:/"));
public class DocumentHandler {
private Configuration configuration = null;
public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
我用的jar包为freemarker-2.3.15.jar
首先把代码贴了,这是主程序
package com.tiger.document;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
}
public void createDoc(String dir,String fileName, String savePath,String[][] sDate) {

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⽂件的⽅法1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36package 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<String, Object> dataMap, String downloadType, StringsavePath){try{//加载需要装填的模板Templatetemplate = null;//加载模板⽂件configure.setClassForTemplateLoading(this.getClass(),"/com/favccxx/secret/templates"); //设置对象包装器configure.setObjectWrapper(newDefaultObjectWrapper());//设置异常处理器configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //定义Template对象,注意模板类型名字与downloadType要⼀致template= configure.getTemplate(downloadType + ".xml");//输出⽂档FileoutFile = new File(savePath);Writerout = null;3637 38 39 40 41 42 43 44 45 46 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模板生成WORD+文档

JAVA+根据WORD模板生成WORD+文档

/** * 把选定内容替换为设定文本 * @param selection Dispatch 选定内容 * @param newText String 替换为文本 */ public void replace(Dispatch selection,String newText) {
//设置替换文本 Dispatch.put(selection,"Text",newText); }
/* * 传入数据为 HashMap 对象,对象中的 Key 代表 word 模板中要替换的字段,Value 代表用来替换的值。 * word 模板中所有要替换的字段(即 HashMap 中的 Key)以特殊字符开头和结尾,如:$code$、$date$……, 以免执行错误的替换。 * 所有要替换为图片的字段,Key 中需包含 image 或者 Value 为图片的全路径(目前只判断文件后缀名 为:.bmp、 .jpg、.gif)。 * 要替换表格中的数据时,HashMap 中的 Key 格式为“table$R@N”,其中:R 代表从表格的第 R 行开始 替换,N 代表 word 模板中的第 N 张表格;Value 为 ArrayList 对象,ArrayList 中包含的对象统一为 String[],一条 String[] 代 表一行数据,ArrayList 中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第 三列、 第五列的数据,则第一条记录为 String[3] {“1”,”3”,”5”}。 */
for(int i = 0;i < count;i ++) {
Dispatch.call(selection,"MoveLeft"); } }
/** * 把选定内容或插入点向右移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveRight(Dispatch selection,int count) {

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并插⼊图⽚(⽔印)功能基本完成。

java导出word格式的文件

java导出word格式的文件

java导出word格式的⽂件1. 使⽤POI技术⽣成word格式的⽉报,实现功能根据⽇期进⾏预览,导出。

2. 使⽤template.docx作为word模板,参数使⽤特殊符号标识,封装数据(Map<String,String>); 通过IO读取模板替换参数,从⽽动态获取数据。

3. 预览的实现,由于web页⾯展⽰通过html或pdf来进⾏。

将word转为pdf后基本都会出现样式的不兼容问题,所以放弃。

最终我根据word的模板⼜⼿写了⼀个html对应的模板,参数使⽤的jsp的el表达式动态替换参数,从⽽动态获取数据。

暂时没有考虑word模板过多的情况。

4. 由于我做的系统的前端是easyui的框架,预览时的翻页使⽤了panel插件功能,批量导出使⽤的ZipEntry。

相关代码1 package com.bocsh.base.util;23 import java.io.ByteArrayOutputStream;4 import java.io.FileInputStream;5 import java.io.IOException;6 import java.util.List;7 import java.util.Map;8 import java.util.Map.Entry;9 import java.util.Set;101112//import org.apache.poi.POIXMLDocument;13 import ermodel.*;1415/**16 * 通过word模板⽣成新的word⼯具类17 *18 * @author zhiheng19 *20 *21 * XWPFDocument代表⼀个docx⽂档,其可以⽤来读docx⽂档,也可以⽤来写docx⽂档22 * XWPFParagraph代表⽂档、表格、标题等种的段落,由多个XWPFRun组成23 * XWPFRun代表具有同样风格的⼀段⽂本24 * XWPFTable代表⼀个表格25 * XWPFTableRow代表表格的⼀⾏26 * XWPFTableCell代表表格的⼀个单元格27 * XWPFChar 表⽰.docx⽂件中的图表28 * XWPFHyperlink 表⽰超链接29 * XWPFPicture 代表图⽚30 *31 *32 *33*/34public class WorderToNewWordUtils {3536/**37 * 判断表格是需要替换还是需要插⼊,判断逻辑有$为替换,表格⽆$为插⼊38 * @param inputUrl 模板存放地址39 * @param textMap 需要替换的信息集合40 * @param excelDataBytes ⽣成了新的数据流 word格式,存放容器41 * @return 成功返回true,失败返回false42*/43public static boolean changWord(String inputUrl,44 Map<String, String> textMap, Map<String,byte[]> excelDataBytes) {4546//模板转换默认成功47 boolean changeFlag = true;48 ByteArrayOutputStream writeToBytes = null;49try {50//获取docx解析对象51 XWPFDocument document = new XWPFDocument(new FileInputStream(inputUrl));52//解析替换⽂本段落对象53 WorderToNewWordUtils.changeText(document, textMap);54//解析替换表格对象55 WorderToNewWordUtils.changeTable(document, textMap);5657//⽣成了新的数据流 word 格式58 writeToBytes = new ByteArrayOutputStream();59 document.write(writeToBytes);60 excelDataBytes.put(textMap.get("year") + textMap.get("month"), writeToBytes.toByteArray());6162 } catch (IOException e) {63 e.printStackTrace();64 changeFlag = false;65 }finally{66try {67if(writeToBytes!=null)68 writeToBytes.close();69 } catch (IOException e) {70 e.printStackTrace();71 }72 }7374return changeFlag;7576 }777879/**80 * 替换段落⽂本81 * @param document docx解析对象82 * @param textMap 需要替换的信息集合83*/84public static void changeText(XWPFDocument document, Map<String, String> textMap){ 85//获取段落集合86 List<XWPFParagraph> paragraphs = document.getParagraphs();8788for (XWPFParagraph paragraph : paragraphs) {89//判断此段落时候需要进⾏替换90 String text = paragraph.getText();91if(checkText(text)){92 List<XWPFRun> runs = paragraph.getRuns();93for (XWPFRun run : runs) {94//替换模板原来位置95 run.setText(changeValue(run.toString(), textMap),0);96 }97 }98 }99100 }101102/**103 * 替换表格对象⽅法104 * @param document docx解析对象105 * @param textMap 需要替换的信息集合106*/107private static void changeTable(XWPFDocument document, Map<String, String> textMap){ 108//获取表格对象集合109 List<XWPFTable> tables = document.getTables();110for (int i = 0; i < tables.size(); i++) {111//只处理⾏数⼤于等于2的表格,且不循环表头112 XWPFTable table = tables.get(i);113if(table.getRows().size()>1){114//判断表格是需要替换还是需要插⼊,判断逻辑有$为替换,表格⽆$为插⼊115if(checkText(table.getText())){116 List<XWPFTableRow> rows = table.getRows();117//遍历表格,并替换模板118 eachTable(rows, textMap);119 }120 }121 }122123124 }125126127/**128 * 遍历表格129 * @param rows 表格⾏对象130 * @param textMap 需要替换的信息集合131*/132private static void eachTable(List<XWPFTableRow> rows ,Map<String, String> textMap){ 133for (XWPFTableRow row : rows) {134 List<XWPFTableCell> cells = row.getTableCells();135for (XWPFTableCell cell : cells) {136//判断单元格是否需要替换137if(checkText(cell.getText())){138 List<XWPFParagraph> paragraphs = cell.getParagraphs();139for (XWPFParagraph paragraph : paragraphs) {140 List<XWPFRun> runs = paragraph.getRuns();141for (XWPFRun run : runs) {142 run.setText(changeValue(run.toString(), textMap),0);143 }144 }145 }146 }147 }148 }149150151/**152 * 判断⽂本中时候包含$153 * @param text ⽂本154 * @return 包含返回true,不包含返回false155*/156private static boolean checkText(String text){157 boolean check = false;158if(text.indexOf("$")!= -1){159 check = true;160 }161return check;162163 }164165/**166 * 匹配传⼊信息集合与模板167 * @param value 模板需要替换的区域168 * @param textMap 传⼊信息集合169 * @return 模板需要替换区域信息集合对应值170*/171private static String changeValue(String value, Map<String, String> textMap){172 Set<Entry<String, String>> textSets = textMap.entrySet();173for (Entry<String, String> textSet : textSets) {174//匹配模板与替换值格式${key}175 String key = "${"+textSet.getKey()+"}";176if(value.indexOf(key)!= -1){177 value = textSet.getValue();178 }179 }180//模板未匹配到区域替换为空181if(checkText(value)){182 value = "0";183 }184return value;185 }186187188 }注意:1. html模板和word模板共⽤的数据模型2. 写这个功能前翻阅了⼤量的关于java导出word的博客,有⼤量的将word转为ftl格式再去操作,感觉不是很⽅便和直观。

JAVA操作WORD

JAVA操作WORD

JAVA操作WORDJava操作Word主要有两种方式:一种是使用Apache POI库进行操作,另一种是使用XML模板进行操作。

下面将详细介绍如何通过XML模板实现Java操作Word。

1.准备工作:2. 创建Word模板:首先,创建一个空的Word文档,将其保存为XML格式,作为Word的模板。

可以在Word中添加一些标记或占位符,用于后续替换。

3.导入POI和相关依赖:在Java项目中,导入以下依赖:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency>```4.读取模板文件:使用POI库读取Word模板文件,将其转换为XML格式的字符串,并保存为`template.xml`文件中。

```javaimport ermodel.XWPFDocument;import java.io.FileOutputStream;public class WordTemplateReaderpublic static void main(String[] args) throws ExceptionXWPFDocument document = new XWPFDocument(new FileInputStream("template.docx"));FileOutputStream out = new FileOutputStream("template.xml");document.write(out);out.close(;document.close(;}}```5.数据替换:读取template.xml文件,使用Java中的字符串替换功能,将模板中的占位符替换为实际的数据。

java实现的导出word文档

java实现的导出word文档

java实现的导出word⽂档之前没有做过类似的功能,所以第⼀次接触的时候费了我⼀天的时间来完成这个功能。

先说⼀下原理,其实就是通过修改后缀来完成的。

需要先⽤office2013做⼀个word模板,就是你想要⽣成的word的模板,保存为xml格式。

然后在线格式化⼀下,这样⽣成的代码⽐较规范,然后将后缀修改为ftl,内容为⼀下格式:、我使⽤的⽅法是通过Action跳转的⽅法来进⾏调⽤的,Action⽅法如下,[java] view plain copy print?1. public String exportProWorkOrder(){2.3. /** 取出参数**/4.5. /** 输出审批 **/6. Template t=null;7. PrintWriter wt = null;8.9. try {10. /** 查询数据 **/11. ProjectWorkOrder pwo = consultingProjectBo.findPWOMessage(18);12.13. Map<String,Object> dataMap=new HashMap<String,Object>();14.15. //getData(dataMap);16. /** 放置数据 **/17. consultingProjectBo.makeExportProWorkOrderData(pwo,dataMap);18. String fn = makeFileName(pwo);19.20. //FTL⽂件所存在的位置21. t = freeMarkerConfiguration.getTemplate("export_proworkorder.ftl"); //⽂件名22.23.24. //配置 Response 参数25. getResponse().setContentType(26. "application/msword; charset=UTF-8");27. getResponse().setHeader(28. "Content-Disposition",29. "Attachment;filename= "30. + new String(fn.toString().getBytes(31. //"UTF-8"),"UTF-8"));32. "gb2312"), "ISO8859_1"));//20151030 改为UTF-8 需要兼容性测试33. wt = getResponse().getWriter();34. t.process(dataMap, wt);34. t.process(dataMap, wt);35.36. } catch (IOException e) {37. e.printStackTrace();38. } catch (Exception e) {39. e.printStackTrace();40. } finally {41. if(wt!=null){42. wt.flush();43. wt.close();44. }45. }46. return null;47. }48.49. protected String makeFileName(ProjectWorkOrder pwo) {50. if(pwo==null){51. return "⽂件不存在";52. }53.54. String filename = "";55. if(pwo.getProjectTitle()!=null){56. filename = pwo.getProjectTitle() + "⼯程造价咨询项⽬⼯作交办单" + ".doc";57. }else{58. filename = "⼯程造价咨询项⽬⼯作交办单"+".doc";59. }60.61. return filename;62. }跳转进⼊⽅法中,期中放置数据的⽅法如下,[java] view plain copy print?1. public ProjectWorkOrder findPWOMessage(Integer projectId){2. SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );3. Project project = null;4. List<ProjectDepartment> list = null;5. ProjectEngineering pe = null;6. project = projectBo.findFull(projectId);7. list = projectDepartmentBo.findPDByProjectId(projectId);8. pe = projectEngineeringBo.findPEByProjectId(projectId);9. ProjectWorkOrder pwo = new ProjectWorkOrder();10. if(projectId != null){11. pwo.setProjectId(projectId);12. }13. if(project.getProject_title() != null){14. pwo.setProjectTitle(project.getProject_title());15. }16. if(project.getBegin_date() != null){17. pwo.setBeginDate(sdf.format(project.getBegin_date()));18. }19. if(project.getEnd_date() != null){20. pwo.setEndDate(sdf.format(project.getEnd_date()));21. }22. if(project.getProject_target() != null){23. pwo.setProjecTarget(project.getProject_target());24. }24. }25. if(project.getMember_id() != null){26. Member member = memberBo.getCacheMember(project.getMember_id());27. pwo.setMemberId(member.getMember_name());28. }29. if(pe.getPlan_no() != null){30. pwo.setPlanNu(pe.getPlan_no());31. }32. if(pe.getIncrement() != null){33. pwo.setInvestment(pe.getIncrement());34. }35. if(pe.getDo_item() != null){36. pwo.setDoItem(pe.getDo_item());37. }38. if(pe.getKey_point() != null){39. pwo.setKeyPoint(pe.getKey_point());40. }41. if(list != null){42. pwo.setChild(addtypePlus(list));43. }44. return pwo;45. }46. /**47. *将⼯程造价咨询项⽬⼯作交办单导出为word48. */49. @Override50. public void makeExportProWorkOrderData(ProjectWorkOrder pwo, Map<String, Object> dataMap) {51. if(pwo==null){52. return;53. }54. if(pwo.getProjectTitle() != null){55. dataMap.put("ptitle",pwo.getProjectTitle());//项⽬名称56. }else{57. dataMap.put("ptitle","⽆");58. }59. if(pwo.getProjectId() != null){60. dataMap.put("pid", pwo.getProjectId());//⼯程id61. }else{62. dataMap.put("pid", "0");63. }64. if(pwo.getBeginDate() != null){65. dataMap.put("begindate", pwo.getBeginDate());//项⽬开始时间66. }else{67. dataMap.put("begindate", "⽆");68. }69. if(pwo.getEndDate() != null){70. dataMap.put("endate", pwo.getEndDate());//结束⽇期71. }else{72. dataMap.put("endate", "⽆");73. }74. if(pwo.getProjecTarget() != null){75. dataMap.put("ptarget", pwo.getProjecTarget());//⽬标76. }else{77. dataMap.put("ptarget", "⽆");78. }79. if(pwo.getMemberId() != null){80. dataMap.put("pmemberid", pwo.getMemberId());//负责⼈81. }else{81. }else{82. dataMap.put("pmemberid", "⽆");83. }84. if(pwo.getPlanNu() != null){85. dataMap.put("plano", pwo.getPlanNu());//计划编号86. }else{87. dataMap.put("plano", "⽆");88. }if(pwo.getInvestment() != null){89. dataMap.put("investment", pwo.getInvestment());//总投资90. }else{91. dataMap.put("investment", "⽆");92. }93. if(pwo.getDoItem() != null){94. dataMap.put("doitem", pwo.getDoItem());//事项95. }else{96. dataMap.put("doitem", "⽆");97. }98. if(pwo.getKeyPoint() != null){99. dataMap.put("keypoint", pwo.getKeyPoint());//重点100. }else{101. dataMap.put("keypoint", "⽆");102. }103. if(pwo.getChild() != null){104. dataMap.put("list", pwo.getChild());//联系⼈列表105. }else{106. dataMap.put("list", "⽆");107. }108. SimpleDateFormat tempDate = new SimpleDateFormat("yyyy年MM⽉dd⽇"); 109. String datetime = tempDate.format(DateTimeUtil.getCurrDate());110. dataMap.put("datetime", datetime);111. }112. /**113. * 将单位类型数字转换为对应的字符114. */115. private List<ProjectDepartment> addtypePlus(List<ProjectDepartment> list){116. for (ProjectDepartment projectDepartment : list) {117. if(projectDepartment.getType() == 1){projectDepartment.setTypePlus("委托单位");} 118. if(projectDepartment.getType() == 2){projectDepartment.setTypePlus("建设单位");} 119. if(projectDepartment.getType() == 3){projectDepartment.setTypePlus("施⼯单位");} 120. if(projectDepartment.getType() == 4){projectDepartment.setTypePlus("监理单位");} 121. if(projectDepartment.getType() == 5){projectDepartment.setTypePlus("设计单位");} 122. if(projectDepartment.getType() == 6){projectDepartment.setTypePlus("编制单位");} 123. }124. return list;125. }配置⽂件的信息这⾥就不在多说了,同时需要修改ftl中的参数,修改⽅法如下,[html] view plain copy print?1. <w:r wsp:rsidRPr="002C3578">2. <w:rPr>3. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>4. <wx:font wx:val="宋体"/>5. <w:sz-cs w:val="21"/>6. </w:rPr>7. <w:t><![CDATA[${doitem}]]></w:t>7. <w:t><![CDATA[${doitem}]]></w:t>8. </w:r>与jsp中的⽅法基本⼀致,处理list,如果遇到循环的话,使⽤如下的⽅法,[html] view plain copy print?1. <#list list as bean><!-- Start 循环体 -->2. <w:tr wsp:rsidR="002C3578" wsp:rsidRPr="002C3578" wsp:rsidTr="002C3578">3. <w:trPr>4. <w:trHeight w:val="427"/>5. </w:trPr>6. <w:tc>7. <w:tcPr>8. <w:tcW w:w="534" w:type="dxa"/>9. <w:vmerge/>10. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>11. </w:tcPr>12. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">13. <w:pPr>14. <w:jc w:val="center"/>15. <w:rPr>16. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>17. <wx:font wx:val="宋体"/>18. <w:sz-cs w:val="21"/>19. </w:rPr>20. </w:pPr>21. </w:p>22. </w:tc>23. <w:tc>24. <w:tcPr>25. <w:tcW w:w="1596" w:type="dxa"/>26. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>27. </w:tcPr>28. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">29. <w:pPr>30. <w:spacing w:line="360" w:line-rule="auto"/>31. <w:jc w:val="center"/>32. <w:rPr>33. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>34. <wx:font wx:val="宋体"/>35. <w:sz-cs w:val="21"/>36. </w:rPr>37. </w:pPr>38. <w:r wsp:rsidRPr="002C3578">39. <w:rPr>40. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>41. <wx:font wx:val="宋体"/>42. <w:sz-cs w:val="21"/>43. </w:rPr>44. <w:t><![CDATA[${bean.typePlus}]]></w:t>45. </w:r>46. </w:p>47. </w:tc>48. <w:tc>48. <w:tc>49. <w:tcPr>50. <w:tcW w:w="2130" w:type="dxa"/>51. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>52. </w:tcPr>53. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">54. <w:pPr>55. <w:spacing w:line="360" w:line-rule="auto"/>56. <w:jc w:val="center"/>57. <w:rPr>58. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>59. <wx:font wx:val="宋体"/>60. <w:sz-cs w:val="21"/>61. </w:rPr>62. </w:pPr>63. <w:r wsp:rsidRPr="002C3578">64. <w:rPr>65. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>66. <wx:font wx:val="宋体"/>67. <w:sz-cs w:val="21"/>68. </w:rPr>69. <w:t><![CDATA[${bean.department_name}]]></w:t>70. </w:r>71. </w:p>72. </w:tc>73. <w:tc>74. <w:tcPr>75. <w:tcW w:w="2131" w:type="dxa"/>76. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>77. </w:tcPr>78. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578">79. <w:pPr>80. <w:spacing w:line="360" w:line-rule="auto"/>81. <w:jc w:val="center"/>82. <w:rPr>83. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>84. <wx:font wx:val="宋体"/>85. <w:sz-cs w:val="21"/>86. </w:rPr>87. </w:pPr>88. <w:r wsp:rsidRPr="002C3578">89. <w:rPr>90. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>91. <wx:font wx:val="宋体"/>92. <w:sz-cs w:val="21"/>93. </w:rPr>94. <w:t><![CDATA[${bean.linkman}]]></w:t>95. </w:r>96. </w:p>97. </w:tc>98. <w:tc>99. <w:tcPr>100. <w:tcW w:w="2131" w:type="dxa"/>101. <w:shd w:val="clear" w:color="auto" w:fill="auto"/>102. </w:tcPr>103. <w:p wsp:rsidR="0068277C" wsp:rsidRPr="002C3578" wsp:rsidRDefault="0068277C" wsp:rsidP="002C3578"> 104. <w:pPr>104. <w:pPr>105. <w:spacing w:line="360" w:line-rule="auto"/>106. <w:jc w:val="center"/>107. <w:rPr>108. <w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:hint="fareast"/>109. <wx:font wx:val="宋体"/>110. <w:sz-cs w:val="21"/>111. </w:rPr>112. </w:pPr>113. <w:r wsp:rsidRPr="002C3578">114. <w:rPr>115. <w:rFonts w:ascii="宋体" w:h-ansi="宋体"/>116. <wx:font wx:val="宋体"/>117. <w:sz-cs w:val="21"/>118. </w:rPr>119. <w:t><![CDATA[${bean.phone}]]></w:t>120. </w:r>121. </w:p>122. </w:tc>123. </w:tr>124. </#list><!-- End 循环体 -->这样就能导出想要的word⽂档,⼀定要记住,使⽤office2013,我试着⽤WPS,但是⽣成内容让我很懵逼,全是xml代码。

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

* @param newText
*
String 替换为文本
*/
public void replace(Dispatch selection, String newText)
{
//设置替换文本
Dispatch.put(selection, "Text", newText);
}
/**
* 全局替换
*
* @param selection
private Dispatch documents;
private Dispatch selection;
/** * 构造函数 */
public JavaToword() {
saveOnExit = true; if(word==null){ word = new ActiveXComponent("Word.Application");
public Dispatch select() {
return word.getProperty("Selection").toDispatch(); }
/**
* 把插入点移动到文件首位置
*
* @param selection
*
Dispatch 插入点
*/
public void moveStart(Dispatch selection)
Dispatch.call(document, "PrintOut");
Dispatch.call(document, "Close", new Variant(false)); objWord.invoke("Quit",new Variant[0]); word.invoke("Quit",new Variant[0]);
public class JavaToword {
private boolean saveOnExit;
/** * word 文档 */
Dispatch doc = null;
/** * word 运行程序对象 */
private ActiveXComponent word;
/** * 所有 word 文档 */
word.setProperty("Visible", new Variant(false)); } if(documents==null){ documents = word.getProperty("Documents").toDispatch(); } }
/**
* 打开文件
*
* @param inputDoc
this.table=Dispatch.call(tables,"Add" , range,new Variant(rowCount), new
Variant(colCount),new Variant(width)).toDispatch();
}
return this.table;
}
/**
* 设置当前表格指定行的背景色
*
String 要打开的文件,全路径
* @return Dispatch 打开的文件
*/
public Dispatch open(String inputDoc)
{
return Dispatch.call(documents, "Open", inputDoc).toDispatch();
}
/** * 选定内容 * * @return Dispatch 选定的范围或插入点 */
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(false)); Dispatch documents = objWord.getProperty("Documents").toDispatch(); Dispatch document = Dispatch.call(documents, "Open", outPath).toDispatch();
package com.env.util;
import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;
import com.jacob.activeX.ActiveXComponent; import Thread; import .Dispatch; import .Variant;
*
* @param rowIndex
* @param color
*
取值范围 0 < color < 17 默认:16 浅灰色 1:黑色 2:蓝色 3:浅
蓝 ...............
*/
public void setRowBgColor( int rowIndex, int color) {
this .getRow(rowIndex);
//全字匹配
Dispatch.put(find, "MatchWholeWord", "True");
//查找并选中
return Dispatch.call(find, "Execute").getBoolean();
}
/**
* 把选定内容替换为设定文本
*
* @param selection
*
Dispatch 选定内容
}
/**
* 根据模板、数据生成 word 文件
*
* @param inputPath
*
String 模板文件(包含路径)
* @param outPath
*
String 输出文件(包含路径)
* @param data* NhomakorabeaHashMap 数据包(包含要填充的字段、对应的数据)
*/
public void toWord(String inputPath, String outPath, HashMap data)
{
String oldText;
Object newValue;
try
{
doc = open(inputPath);
Dispatch selection = select();
Iterator keys = data.keySet().iterator(); while (keys.hasNext()) {
}
/////////////////////////////////////////////以下部分为动态导出增加部分 /**
* 打开一个 word */ public void openWord(String inPath){
doc = open(inPath); } /**
* 替换模版中对应的字符串 * @param data */ public void replaceTem(Map data){
String oldText; Object newValue; Dispatch selection = select();
Iterator keys = data.keySet().iterator(); while (keys.hasNext()) {
oldText = (String) keys.next(); newValue = data.get(oldText);
replaceAll(selection, oldText, newValue); } } /** * 保存文件路径 * @param path */ public void savePath(String path){ save(path);
if (doc != null){ close(doc);
close(doc); } }
}
public void printing(String inPath,String outPath,HashMap map){
toWord(inPath, outPath, map);
ActiveXComponent objWord = new ActiveXComponent("Word.Application"); Dispatch wordObject = (Dispatch) objWord.getObject();
*
Dispatch 选定内容或起始插入点
* @param oldText
*
String 要替换的文本
* @param newText
*
String 替换为文本
*/
public void replaceAll(Dispatch selection, String oldText, Object replaceObj)
*/
public boolean find(Dispatch selection, String toFindText)
{
//从 selection 所在位置开始查询
Dispatch find = word.call(selection, "Find").toDispatch();
//设置要查找的内容
/**
* 保存文件
*
* @param outputPath
*
String 输出文件(包含路径)
*/
public void save(String outputPath)
{
Dispatch.call((Dispatch) Dispatch.call(word, "WordBasic").getDispatch(),
相关文档
最新文档