springboot实现导出含有富文本的数据到word
作者:互联网
前言
一开始客户要求做word导出时,只是将系统的一个表单内容导出到word中,没有富文本的数据。这种情况导出word就很简单,制作好word模板后,直接使用easypoi的api就行。后来表单的一个文本框改为了富文本,同时也要求导出的时候呈现的格式和富文本中输入的格式一样。这时候easypoi就行不通了,搜索了网上资料以及结合自己的项目要求做了一下总结。
技术点剖析
- 由于富文本存入数据库的字符串是带有html元素标签的,所以使用doc为文件为导出模板是不行的,它无法将这种字符串翻译成html的形式,只会展示出带有html标签的字符,所以需要重新构建模板文件使得它能支持html文本
- 富文本如果含有图片,需要进行额外的处理
- 不能使用easypoi的api,涉及到中文字符的转码需要自行处理
解决方案
创建新的模板
这里使用.mht类型的文件作为模板文件,制作的方法如下:
- 首先先制作一个doc类型的模板文件,设计好表单的样式,填入占位符
- 调整好格式后,将doc文件另存为.mht文件
- 可以使用notepad++打开.mht文件,虽然看不懂里面的内容,但是可以看到之前设计的占位符是存在的
代码阶段的思路就是:
1.读取模板文件的内容
2.获得需要导出的内容,可以是一个map,也可以是一个对象
3.使用导出内容替换掉模板内容字符串的占位符
4.经过转码处理之后输出到输出流里进行导出
代码处理
Map<String, String> resultMap = initExportStringMap(caseInfo, caseDealInfo);
OutputStream os = null;
//导出word
try {
//获取模板文件的路径
File file = ResourceUtils.getFile("classpath:static/excel/市长热线来电受理登记表.mht");
String templeteContent = FileUtils.readTemplete(file);
if (StringUtils.isNoneBlank(templeteContent)) {
//替换模板文件的占位符
templeteContent = DownloadUtil.replaceTempleteContenet(templeteContent, resultMap);
//转码
templeteContent = FileUtils.string2ASCII(templeteContent);
os = response.getOutputStream();
response.reset();
response.setCharacterEncoding("utf-8");
//导出为doc格式
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment; filename=" + "市长热线来电受理登记表");
byte[] b = templeteContent.getBytes("UTF-8");
os.write(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.flush();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
读取资源文件
/**
* 读取资源文件中的mht模板文件
* @param file
* @return
* @throws IOException
*/
public static String readTemplete(File file)throws IOException{
StringBuffer buffer = new StringBuffer("");
BufferedReader br = null;
try {
buffer = new StringBuffer("");
br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
while (br.ready()){
buffer.append((char)br.read());
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
if(br!=null){
br.close();
}
}
return buffer.toString();
}
替换占位符很简单,replace方法就可
转码处理
/**
* 完成占位符替换后需要将mht字符转码,因为mht采用3Dus-ascii编码,
* 该编码格式为10进制的ASCII码(非16进制)
* 如果不进行处理,会导致最终导出的文件中有中文乱码
* @param s
* @return
*/
public static String string2ASCII(String s) {
if(s==null||"".equals(s)) {
return null;
}
char[] chars=s.toCharArray();
StringBuffer asciiString=new StringBuffer();
int n=0;
for(char c:chars) {
n=c;
String a="";
if((19968<=n && n<40623)) {
a="&#"+n+";";
}else {
a=c+"";
}
asciiString.append(a);
}
return asciiString.toString();
}
这样导出就做好了,导出的doc文档打开后会默认使用web视图打开,可切换视图查看效果
KKALL1314 发布了52 篇原创文章 · 获赞 6 · 访问量 2万+ 私信 关注标签:文件,word,springboot,导出,br,mht,文本,templeteContent,模板 来源: https://blog.csdn.net/KKALL1314/article/details/103967372