springboot实现导出含有富文本的数据到word

前言

一开始客户要求做word导出时,只是将系统的一个表单内容导出到word中,没有富文本的数据。这种情况导出word就很简单,制作好word模板后,直接使用easypoi的api就行。后来表单的一个文本框改为了富文本,同时也要求导出的时候呈现的格式和富文本中输入的格式一样。这时候easypoi就行不通了,搜索了网上资料以及结合自己的项目要求做了一下总结。

技术点剖析

  • 由于富文本存入数据库的字符串是带有html元素标签的,所以使用doc为文件为导出模板是不行的,它无法将这种字符串翻译成html的形式,只会展示出带有html标签的字符,所以需要重新构建模板文件使得它能支持html文本
  • 富文本如果含有图片,需要进行额外的处理
  • 不能使用easypoi的api,涉及到中文字符的转码需要自行处理

解决方案

创建新的模板

这里使用.mht类型的文件作为模板文件,制作的方法如下:

  1. 首先先制作一个doc类型的模板文件,设计好表单的样式,填入占位符
    springboot实现导出含有富文本的数据到word_第1张图片
  2. 调整好格式后,将doc文件另存为.mht文件
    在这里插入图片描述
  3. 可以使用notepad++打开.mht文件,虽然看不懂里面的内容,但是可以看到之前设计的占位符是存在的
    springboot实现导出含有富文本的数据到word_第2张图片
代码阶段的思路就是:
1.读取模板文件的内容
2.获得需要导出的内容,可以是一个map,也可以是一个对象
3.使用导出内容替换掉模板内容字符串的占位符
4.经过转码处理之后输出到输出流里进行导出

代码处理

Map 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视图打开,可切换视图查看效果

你可能感兴趣的:(Java后台,springboot)