一、制作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模板)相关推荐

  1. 【操作word】Java + POI导出富文本的内容到word文档

    这周工作中,遇到一个需求是需要将数据库中富文本内容导出到word文档里面,于是就采用POI技术实现了一下导出word文档的功能.(word文档是识别html内容的,所以富文本内容也自然能够识别.) 一 ...

  2. java导出word文档组件_java导出word文档(转)

    导出word文档有两种方式:第一种是使用POI,第二种是使用itext组件,下面逐渐介绍: 1.使用POI的方式:本方式目前没法改变字体样式,只能输出纯文本. /** * 试卷导出word文档 * @ ...

  3. 利用docx4j完美导出word文档(标签替换、插入图片、生成表格)

    最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索. 1 ...

  4. java将后台数据库查询到的数据导出word文档当中

    java将后台数据库查询到的数据导出word文档当中 之前项目需求使用Java导出word文档,一直没有进行整理,今天把它进行整理出来,以便以后使用到:下面是导出的word文档. // 前端报告表格 ...

  5. Springboot 项目导出word文档(文档内容包括数据以及服务器图片)

    Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...

  6. 【Java实现导出Word文档功能 XDocReport +FreeMarker】

    Java实现导出Word文档功能(XDocReport +FreeMarker) 前言 在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表.医院的患者统计报表.电商平台的 ...

  7. SSM框架集成导出Word文档功能 XDocReport +FreeMarker

             网上有很多关于使用XDocReport导出Word的文章,都差不多试用了一下,也看了一些评论,发现实现功能的过程当中大家还是会出现各种问题.现在我来把我自己实现的过程说一下,顺便总结 ...

  8. js导出word文档 可以兼容IE8+浏览器适配其他浏览器

    js导出word文档,兼容IE8浏览器 其他浏览器需要引入两个文件:FileSaver.js 和 jqueryWordExport.js 需要兼容IE8浏览器需要引用:FileSaver.js exc ...

  9. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

最新文章

  1. mysql的常用存储引擎_MySQL常见的三种存储引擎
  2. 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板
  3. 访华为5G首席科学家童文:针尖战略引领5G突破
  4. java数据类型_JAVA的数据类型
  5. 谷歌SEO和百度SEO的区别
  6. MySQL优化group by和distinct
  7. 哈哈哈,弟弟被卡桶里了......
  8. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
  9. Linux下文件操作命令cat(转)
  10. 51单片机控制步进电机正反转
  11. Excel单页导出以及多sheet导出
  12. 宽带拨号上服务器无响应,宽带拨号服务器无响应(图文)
  13. Power BI 学习三:数据整理和关系管理
  14. navicat转换word表格
  15. CTO创新思维与能力
  16. 常用127个ASK码对照表
  17. 工业级无线路由器无线客户端的配置教程
  18. 中国交通运输发展白皮书
  19. 智能科学的泉眼——人性论
  20. 高端大气上档次的搜索引擎......

热门文章

  1. win10“User Profile Service 服务未能登录,无法加载用户配置文件问题
  2. VSCode中Markdown 无法显示图片
  3. 虚拟机的显示屏幕修改大小
  4. 通信工程师传输与接入ATM网络组成和接口
  5. 房屋装修(卫生间/浴室)
  6. 【史上最强】据说是气死了99名老师的作文
  7. 网址大全(hao123和2345)
  8. 数据库电话号码查询显示中间四位用****代替的SQL语句
  9. 如何迅速打造敏捷团队
  10. IUSR_用户(Internet来宾账号)