富文本转word保存

重要的事放前面
引入poi时出现了很多包版本不兼容的事故
以下是我的一套pom配置

<!--word操作工具类-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.6.0-beta1</version>
            <exclusions>
                <exclusion>
                    <artifactId>poi-ooxml-schemas</artifactId>
                    <groupId>org.apache.poi</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.11</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-full</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>

注:我的可能不是最好的,但是凑活着可以正常运行
poi版本已经出到1.12了这里为什么要用1.6呢!
因为如果自己写富文本标签转换很费时费劲
在网上找到了一个poi版本1.6的富文本转word的开源代码
代码地址:https://gitee.com/xuwangcheng/html-to-word.git
所以咱们就站巨人的肩膀上了,为这个位作者点赞。

由于poi的版本过低,若依原生态的excel转换工具中有很多jar包是跟poi冲突的!
所以上面的pom文件有一些exclusion排除一些冲突jar包不引入!

在开发中注意doc.close会报错,writeToFile方法也不可以使用了,需要自己调用最原始字符流写入文件的方法。

主要实现:
1.H(1,2,3,4,5,6,7)标题标签识别
2.br 阴影标签识别
3.s|del|strike 删除划线标签识别
4.i 网址标签识别
5.li 队列标签识别
6.p 字段标签识别
7.l|ul 队列标签识别
8.span 字段标签识别
9.b|strong 粗体标签识别
10.sup 样式标签识别
11.table 别个标签识别
12.th 表头单元格标签识别
13.u 下划线标签识别
14.img 图片标签识别

  • img可以识别到png,jpg,jpeg后缀
  • 图片可以自定义大小
  • 图片来源可以是二进制和网络图片链接

代码如下:

/**
     * 新增会议纪要信息
     */
//    @PreAuthorize("@ss.hasPermi('system:mettingRecord:add')")
    @Log(title = "会议纪要信息", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody YyMettingRecord yyMettingRecord) throws IOException {

        //生成docx文件
        Configure config = Configure.newBuilder().build();
        AbstractRenderPolicy htmlRenderPolicy = null;
        // 使用自己写的策略处理
        htmlRenderPolicy = HtmlToWordUtil.createHtmlRenderPolicy(null);
        config.customPolicy("mettingContent", htmlRenderPolicy);
        //表格配置
        config.customPolicy("detail_table", new DetailTablePolicy());

        headTextStyle.setFontFamily("Hei");
        headTextStyle.setFontSize(9);
        headTextStyle.setColor("7F7F7F");

        headStyle.setBackgroundColor("F2F2F2");
        headStyle.setAlign(STJc.CENTER);

        rowStyle = new TableStyle();
        rowStyle.setAlign(STJc.CENTER);

        meetingEndStyle.setColor("00ff7f");
        meetingEndStyle.setFontSize(12);

        DetailData detailTable = new DetailData();
        List<RowRenderData> mettingEnds = new ArrayList<>();

        Map<String, Object> map = new HashMap<String, Object>();

        ArrayList<RowRenderData> rowRenderDatas = new ArrayList<>();
        map.put("mettingName",yyMettingRecord.getMettingName());
        map.put("mettingSummary",yyMettingRecord.getMettingSummary());
        map.put("mettingType",yyMettingRecord.getMettingType());
        map.put("mettingTheme",yyMettingRecord.getMettingTheme());
        map.put("mettingContent",yyMettingRecord.getMettingContent());
        map.put("detail_table",detailTable);
        InputStream resourceAsStream = YyMettingRecordController.class.getClassLoader().getResourceAsStream("docx/mettingTemplate.docx");
        XWPFTemplate template = XWPFTemplate.compile(resourceAsStream, config);
        template.render(map);
        String exportFilePath = profile + "/file/upload/" + System.currentTimeMillis()+ "会议纪要" + ".docx";
        yyMettingRecord.setFilePath(exportFilePath);
        FileOutputStream out = new FileOutputStream(exportFilePath);
        template.write(out);
        out.flush();
        out.close();

        //文件上传到minion中
        String url = minioUrl + "/file/upload";
        File file = new File(exportFilePath);
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        // 创建一个多部分实体构建器
        //文件名称中文乱码问题在create()后面加上:.setMode(HttpMultipartMode.RFC6532);
        MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
        builder.addBinaryBody("file", file);
        // 将构建的实体设置为HttpPost请求的实体
        HttpEntity multipartEntity = builder.build();
        httpPost.setEntity(multipartEntity);
        // 执行HTTP请求
        HttpResponse responsePost = httpClient.execute(httpPost);
        // 处理响应
        String responseBody = EntityUtils.toString(responsePost.getEntity());
        JSONObject jsonFileUrl =  JSON.parseObject(responseBody);
        JSONArray jsonFileUrls = new JSONArray();
        jsonFileUrls.add(jsonFileUrl);
        yyMettingRecord.setFileUrl(jsonFileUrls);
        file.delete();//删除临时文件
        yyMettingRecord.setSeeUsers(new String(seeUsers));
        return toAjax(yyMettingRecordService.insertYyMettingRecord(yyMettingRecord));
    }

上面代码有些改动,还请见解!
最后生成word临时文件然后再存进minio,其实应该也可以直接二进制存进去!这个没有细看。

具体工具类如下:https://gitee.com/crcrwork/html2word.git

Logo

快速构建 Web 应用程序

更多推荐