IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 使用Aspose.word java和poi实现导出模板占位符替换为富文本 -> 正文阅读

[移动开发]使用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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章           查看所有文章
加:2022-03-13 21:56:51  更:2022-03-13 21:59:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:40:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码