其他分享
首页 > 其他分享> > springboot实现导出含有富文本的数据到word

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

作者:互联网

前言

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

技术点剖析

解决方案

创建新的模板

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

  1. 首先先制作一个doc类型的模板文件,设计好表单的样式,填入占位符
    doc模板文件
  2. 调整好格式后,将doc文件另存为.mht文件
    在这里插入图片描述
  3. 可以使用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