使用Aspose.word java和poi实现导出模板占位符替换为富文本

1、处理方案

    
    /**
     * 缓存富文本的占位符信息
     */
    private static Set<String> richTxtDateSet = new HashSet<String>();
    
    /**
     * 解析docx文档
     * @Title exportWord07
     * @description 解析docx文档
     * @param content
     * @param map
     * @return byte
     */
    public static byte[] exportWord07(byte[] content, Map<String, Object> map) {
        // 处理普通替换,表渲染等非富文本情况,同时将获取到的富文本占位符加到richTxtDateSet中
        // 处理的时候Docx的时候将获取到的占位符run信息全部清空,重新设置一遍占位符,避免后面的docx转html后,占位符被拆分,从而导致无法获取html中的占位符进而替换失败
        // resolveDocx是指自己的处理逻辑,内容比较复杂,但处理的原理大同小异
        byte[] result = resolveDocx(content, map);
        // 处理富文本
        return resolveRichTxt(result, map, SaveFormat.DOCX);
    }

    /**
     * @Title: exportWord03
     * @Description: 解析doc文档
     * @param content
     * @param param
     * @return: byte
     */
    public static byte[] exportWord03(byte[] content, Map<String, Object> param){
        // doc字节转docx字节
        content = AsposeWordUtils.docToDocx(content);
        // 处理普通替换,表渲染等非富文本情况,同时将获取到的富文本占位符加到richTxtDateSet中
        // 处理的时候Docx的时候将获取到的占位符run信息全部清空,重新设置一遍占位符,避免后面的docx转html后,占位符被拆分,从而导致无法获取html中的占位符进而替换失败
        // resolveDocx是指自己的处理逻辑,内容比较复杂,但处理的原理大同小异
        byte[] result = resolveDocx(content, param);
        // 处理富文本
        return resolveRichTxt(result, param, SaveFormat.DOC);
    }
   
    /**
     * 处理富文本内容
     * @Title: resolveRichTxt
     * @Description: 处理富文本内容
     * @param content
     * @param map
     * @return: byte
     */
    private static byte[] resolveRichTxt(byte[] content, Map<String, Object> map, int saveFormat) {
        // 将源文档转成html后,将富文本占位符替换为对应富文本,在转回word字节数组
        String htmlStr = byteToHtmlStr(content);
        for (String placeHolder : richTxtDateSet) {
            try {
                htmlStr = htmlStr.replace(placeHolder, getRealValue(placeHolder, map).toString());
            } catch (Exception e) {
                logger.error("富文本处理异常", e);
            }
        }
        richTxtDateSet.clear();
        return AsposeWordUtils.htmlToWord(htmlStr.getBytes(StandardCharsets.UTF_8), saveFormat);
    }

    /**
     * word字节数组转为html字符串
     * @Title: byteToHtmlStr
     * @Description: word字节数组转为html字符串
     * @param content
     * @return: String
     */
    private static String byteToHtmlStr(byte[] content) {
        String result = "";
        try {
            byte[] htmlContent = AsposeWordUtils.wordToHtml(content);
            InputStream is = new ByteArrayInputStream(htmlContent);
            InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8);
            BufferedReader reader = new BufferedReader(streamReader);
            String line;
            StringBuilder html = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                html.append(line);
            }
            reader.close();
            result = String.valueOf(html);
        } catch (IOException e) {
            logger.error("html转字符串异常", e);
        }
        return result;
    }

2、AsposeWordUtils工具类

   /**
     * html字节数组转word字节数组
     * @Title: htmlToWordTest
     * @Description: html字节数组转word字节数组
     * @param content html字节数组
     * @param toType 值为SaveFormat.DOCX或SavaFormat.Doc对应的值
     * @return: byte
     */
    public static byte[] htmlToWord(byte[] content, Integer toType) {
        byte[] result = new byte[1];
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            InputStream is = new ByteArrayInputStream(content);
            Document doc = new Document();
            DocumentBuilder builder = new DocumentBuilder(doc);
            InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8);
            BufferedReader reader = new BufferedReader(streamReader);
            String line;
            StringBuilder html = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                html.append(line);
            }
            reader.close();
            builder.insertHtml(String.valueOf(html));
            doc.save(os, toType);
            log.info("html转word成功!");
            result = os.toByteArray();
        } catch (Exception e) {
            log.error("html转word失败!", e);
        }
        return result;
    }

    /**
     * word字节数组转html字节数组
     * @Title: wordToHtml
     * @Description: word字节数组转html字节数组
     * @param content doc、docx字节数组
     * @return: byte
     */
    public static byte[] wordToHtml(byte[] content) {
        byte[] result = new byte[1] ;
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            InputStream sbs = new ByteArrayInputStream(content);
            Document document = new Document(sbs);
            HtmlSaveOptions options = new HtmlSaveOptions(SaveFormat.HTML);
            options.setExportImagesAsBase64(true);
            document.save(os, options);
            log.info("html转word成功!");
            result = os.toByteArray();
        } catch (Exception e) {
            log.error("word转html失败!", e);
        }
        return result;
    }

	/**
     * 将doc字节数组转换为docx字节数组
     * 如果反过来将docx转doc,将会导致部分doc文件打不开
     * 想完美解决docx转doc请转到文章末尾的文章
     * @Title: docToDocx
     * @Description: 将doc字节数组转换为docx字节数组
     * @param content doc字节流
     * @return: byte
     */
    public static byte[] docToDocx(byte[] content) {
        byte[] result = new byte[1];
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            InputStream sbs = new ByteArrayInputStream(content);
            com.aspose.words.Document doc = new com.aspose.words.Document(sbs);
            doc.save(os, SaveFormat.DOCX);
            result = os.toByteArray();
        } catch (Exception e) {
            log.error("doc转Docx失败!", e);
        }
        return result;
    }

Java使用aspose.word完美实现docx转doc

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值