带有富文本数据如何导出word文档(使用mht模板)
一、制作mht模板
使用word(不能用wps)制作好导出后想要的样子,并使用占位符填充,例如${NAME},设置好格式,另存为.mht格式的文件。之后用文本编辑器打开(我用的notepad++),检查一下(绑定语句可能会有‘=’或者空格),表格遍历需要手动加上<#list ··· as ···>,将文件放到项目中指定路径。
二、从数据库获取数据(dataMap)
怎么获取就不说了, 一般用<String,Object>的Map接收,value值可能是String,或者是Map、List(模板中可能会有表格),也可能是富文本数据,一般来说富文本数据也是一串字符串,这里要注意从数据库取出来时要对数据进行处理(存入数据库时可能将单引号双引号替换为占位符,这个要具体结合项目和前台代码),富文本数据存入到List集合中(richHtmlList),之后还要进一步处理。
三、处理数据
将富文本数据的集合进行组织处理,如果有img元素,需要将img元素分开进行单独处理
以下是部分代码,详细代码可以看原文档
public static void createDocFile(Map<String, Object> dataMap,List<String> richHtmlList,String templateName,HttpServletRequest request) throws Exception{ Template t = null;configuration.setDefaultEncoding("UTF-8");try{t = configuration.getTemplate(templateName,"UTF-8");}catch(Exception e){e.printStackTrace(); }//富文本数据另行处理List<String> htmlContentList = new ArrayList<String>();List<String> htmlImageList = new ArrayList<String>();List<String> htmlImageRefList = new ArrayList<String>();for(String str : richHtmlList){htmlHandler(str,request,htmlContentList,htmlImageList,htmlImageRefList);}dataMap.put("htmlContentList",htmlContentList);dataMap.put("htmlImageList",htmlImageList);dataMap.put("htmlImageRefList",htmlImageRefList);//处理数据WordHtmlGeneratorHelper.handleAllObject(dataMap);String fileName = "temp"+(int)(Math.random()*100000)+".doc";File f = new File(fileName);try { Writer w = new OutputStreamWriter(new FileOutPutStream(f),"utf-8"); t.process(dataMap, w); w.close(); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } return f;
}
public static void htmlHandler(String html,HttpServletRequest request,List<String> htmlContentList,List<String> htmlImageList,List<String> htmlImageRefList) throws Exception{RichHtmlHandler htmlHander = new RichHtmlHandler(html);htmlHander.setDocSrcLocationPrex(file:///C:/213792E5);htmlHander.setDocSrcParent("dwxfdzbgl_template.files");htmlHander.setNextPartId("01D1DDB9.9B20C780");htmlHander.setShapeidPrex("_x0000_i1025");htmlHander.setSpidPrex("_x0000_i");htmlHander.setTypeid("#_x0000_t75");htmlHander.handledHtml(request,true);//======handledDocBody block======\nString htmlString = htmlHandler.getHandledDocBodyBlock()+"\n";htmlContentList.add(htmlString);//======handledBase64Block==========StringBuffer htmlImageSb = new StringBuffer();if(htmlHandler.getDocBase64BlockResults()!=null&&htmlHandler.getDocBase64BlockResults().size()>0){for(String item : getDocBase64BlockResults()) {htmlImageSb.append(item+"\n");} }htmlImageList.add(htmlImageSb.toString());//xmlimgHrefStringBuffer htmlImageRefSb = new StringBuffer();if(htmlHandler.getXmlImgRefs()!=null && htmlHandler.getXmlImgRefs().size()>0){for(String item : htmlHandler.getXmlImgRefs()){htmlImageRefSb.append(item+"\n");}}htmlImageRefList.add(htmlImageRefSb.toString());
}
由于mht文件是采用的是“us-ascii”编码,所以dataMap中所有中文字符必须换成3Dus-asci,十进制Ascii码。
public static void handleAllObject(Map<String, Object> dataMap){//处理数据for (Map.Entry<String, Object> entry : dataMap.entrySet()){Object item=entry.getValue();//判断object是否是primitive type if(isPrimitiveType(item.getClass())){if(item.getClass().equals(String.class)){item=WordHtmlGeneratorHelper.string2Ascii((String)item);entry.setValue(item);}}else if(isCollection(item.getClass())){for (Object itemobject : (Collection)item) {WordHtmlGeneratorHelper.handleObject2Ascii(itemobject);}}else if(isMap(item.getClass())){Collection<String> values = ((Map)item).values();for(String value : values){WordHtmlGeneratorHelper.handleObject2Ascii(value);}}else{WordHtmlGeneratorHelper.handleObject2Ascii(item);}}
}private static boolean isPrimitiveType(Class<?> clazz){return clazz.isEnum() ||CharSequence.class.isAssignableFrom(clazz) ||Number.class.isAssignableFrom(clazz) ||Date.class.isAssignableFrom(clazz);
}private static boolean isCollection(Class<?> clazz){return Collection.class.isAssignableFrom(clazz);
}private static boolean isCollection(Class<?> clazz){return Map.class.isAssignableFrom(clazz);
}
原文:http://www.cnblogs.com/liaofeifight/p/5484891.html
相关源代码:http://files.cnblogs.com/files/liaofeifight/word.rar
源代码中缺少对Map类型数据的处理,上面贴出的代码就是修改后的部分,
如果处理的数据较复杂,比如每个元素都是Map的List,则上面的方法无法处理后无效,博主的解决办法是在获取数据时直接调用string2Ascii()方法转换中文
public static String string2Ascii(String source){if(source==null || source==""){return null;}StringBuilder sb=new StringBuilder();char[] c=source.toCharArray();for(char item : c){String itemascii="";if(item>=19968 && item<40623){itemascii=itemascii="&#"+(item & 0xffff)+";";}else{itemascii=item+"";}sb.append(itemascii);}return sb.toString();
}
带有富文本数据如何导出word文档(使用mht模板)相关推荐
- 【操作word】Java + POI导出富文本的内容到word文档
这周工作中,遇到一个需求是需要将数据库中富文本内容导出到word文档里面,于是就采用POI技术实现了一下导出word文档的功能.(word文档是识别html内容的,所以富文本内容也自然能够识别.) 一 ...
- java导出word文档组件_java导出word文档(转)
导出word文档有两种方式:第一种是使用POI,第二种是使用itext组件,下面逐渐介绍: 1.使用POI的方式:本方式目前没法改变字体样式,只能输出纯文本. /** * 试卷导出word文档 * @ ...
- 利用docx4j完美导出word文档(标签替换、插入图片、生成表格)
最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索. 1 ...
- java将后台数据库查询到的数据导出word文档当中
java将后台数据库查询到的数据导出word文档当中 之前项目需求使用Java导出word文档,一直没有进行整理,今天把它进行整理出来,以便以后使用到:下面是导出的word文档. // 前端报告表格 ...
- Springboot 项目导出word文档(文档内容包括数据以及服务器图片)
Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...
- 【Java实现导出Word文档功能 XDocReport +FreeMarker】
Java实现导出Word文档功能(XDocReport +FreeMarker) 前言 在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表.医院的患者统计报表.电商平台的 ...
- SSM框架集成导出Word文档功能 XDocReport +FreeMarker
网上有很多关于使用XDocReport导出Word的文章,都差不多试用了一下,也看了一些评论,发现实现功能的过程当中大家还是会出现各种问题.现在我来把我自己实现的过程说一下,顺便总结 ...
- js导出word文档 可以兼容IE8+浏览器适配其他浏览器
js导出word文档,兼容IE8浏览器 其他浏览器需要引入两个文件:FileSaver.js 和 jqueryWordExport.js 需要兼容IE8浏览器需要引用:FileSaver.js exc ...
- freemarker导出word文档
使用freemarker导出word文档的过程 **************************************************************************** ...
最新文章
- mysql的常用存储引擎_MySQL常见的三种存储引擎
- 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板
- 访华为5G首席科学家童文:针尖战略引领5G突破
- java数据类型_JAVA的数据类型
- 谷歌SEO和百度SEO的区别
- MySQL优化group by和distinct
- 哈哈哈,弟弟被卡桶里了......
- struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
- Linux下文件操作命令cat(转)
- 51单片机控制步进电机正反转
- Excel单页导出以及多sheet导出
- 宽带拨号上服务器无响应,宽带拨号服务器无响应(图文)
- Power BI 学习三:数据整理和关系管理
- navicat转换word表格
- CTO创新思维与能力
- 常用127个ASK码对照表
- 工业级无线路由器无线客户端的配置教程
- 中国交通运输发展白皮书
- 智能科学的泉眼——人性论
- 高端大气上档次的搜索引擎......