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

前言

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

技术点剖析

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

解决方案

创建新的模板

这里使用.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视图打开,可切换视图查看效果

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
好的,您想要了解如何使用SpringBoot实现将给定数据导出到Excel吗? 首先,您需要在pom.xml中添加以下依赖项: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 这些依赖项将帮助您使用Apache POI库来生成Excel文件。 接下来,您需要创建一个方法,该方法将使用POI库将数据写入Excel文件。以下是一个简单的示例: ```java public void exportDataToExcel(List<YourDataClass> dataList) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Your sheet name"); // create header row Row header = sheet.createRow(0); header.createCell(0).setCellValue("Header 1"); header.createCell(1).setCellValue("Header 2"); header.createCell(2).setCellValue("Header 3"); // create data rows int rowNumber = 1; for (YourDataClass data : dataList) { Row row = sheet.createRow(rowNumber++); row.createCell(0).setCellValue(data.getField1()); row.createCell(1).setCellValue(data.getField2()); row.createCell(2).setCellValue(data.getField3()); } // write to file try { FileOutputStream outputStream = new FileOutputStream("Your file path"); workbook.write(outputStream); workbook.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 您可以将此方法添加到适当的控制器类中,并将数据列表作为参数传递。接下来,您可以将此方法公开为对外的API,以便其他应用程序也可以调用它。 这就是使用SpringBoot数据导出到Excel的基本步骤。希望对您有所帮助!
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值