java读取word文件转html

一.pom引入依赖

java 复制代码
<dependency>
	<groupId>com.aspose</groupId>
	<artifactId>aspose-words</artifactId>
	<version>15.12.0</version>
	<classifier>jdk16</classifier>
</dependency>

二.代码实现

java 复制代码
package com.example.demo.handler;

import com.alibaba.fastjson.JSONObject;
import com.aspose.words.HtmlSaveOptions;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.*;

@Component
public class WordAnalysis {
    /**
     * 解析word
     * @param multipartFile 前端接收的文件,根据自己的需求也可以将MultipartFile转换为File
     * @return TitleTreeVO 存放标题的实体
     */
    public List wordAnalysis(MultipartFile multipartFile) throws IOException {
        byte[] byteArr = multipartFile.getBytes();
        InputStream inputStream = new ByteArrayInputStream(byteArr);
        List tableList = new ArrayList();
        try {
            // 设置转化的格式
            HtmlSaveOptions saveOptions = new HtmlSaveOptions();
            saveOptions.setExportImagesAsBase64(false);
            // 将所有word中的图片放在临时文件夹中,并将html中的链接替换为临时文件夹中绝对路径
            String property = System.getProperty("java.io.tmpdir");
            saveOptions.setImagesFolder(property);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 把流转化为Document
            com.aspose.words.Document doc = new com.aspose.words.Document(inputStream);
            doc.save(baos, saveOptions);
            // 将html文件转化为Document,方便后续使用jsoup的操作
            Document htmlDoc = Jsoup.parse(baos.toString());
            // 解析Document
            tableList = analysisDoc(htmlDoc);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            inputStream.close();
        }
        return tableList;
    }

    /**
     * 解析Document,按需写,样例只写了表格处理
     * @param htmlDoc
     * @return
     */
    public List analysisDoc(Document htmlDoc) {
        Elements tables = htmlDoc.getElementsByTag("table");
        List tableList = new ArrayList();
        for (int i = 0; i < tables.size(); i++) {
            Map<String, Object> tableInfo = new HashMap<>();
            UUID uuid = UUID.randomUUID();
            Element table = tables.get(i);
//            String tableName = table.previousElementSibling().text();
//            if ("".equals(tableName)) {
//                tableName = table.nextElementSibling().text();
//            }
            tableInfo.put("tableId", uuid);
            tableInfo.put("tableName", "表"+(i+1));
            tableInfo.put("tableHtml", tables.get(i).toString());
            Elements rows = table.select("tr");
            List rowList = new ArrayList();
            for (Element row: rows) {
                if (!row.attributes().get("style").contains("height:0pt")) {
                    List rowInfo = new ArrayList();
                    Elements cells = row.select("td");
                    for (Element cell: cells) {
                        JSONObject cellInfo = new JSONObject();
                        String data = cell.text();
                        int rowspan = new Integer(cell.attributes().get("rowspan")=="" ? "1" : cell.attributes().get("rowspan"));
                        int colspan = new Integer(cell.attributes().get("colspan")=="" ? "1" : cell.attributes().get("colspan"));
                        System.out.print(data + "\t");
                        cellInfo.put("content", data);
                        cellInfo.put("rowspan", rowspan);
                        cellInfo.put("colspan", colspan);
                        rowInfo.add(cellInfo);
                    }
                    System.out.println();
                    rowList.add(rowInfo);
                }
            }
            tableInfo.put("tableContent", rowList);
            tableList.add(tableInfo);
        }
        return tableList;
    }
}
相关推荐
醇氧6 分钟前
【Windows】从守护到终结:解析一个 Java 服务的优雅停止脚本
java·开发语言·windows
努力发光的程序员6 分钟前
互联网大厂Java求职面试实录
java·jvm·线程池·多线程·hashmap·juc·arraylist
小鹿学程序11 分钟前
FileZilla连接到虚拟机
java·服务器·开发语言
Haooog17 分钟前
Docker面试题(不定时更新)
java·docker·面试
feathered-feathered27 分钟前
Redis基础知识+RDB+AOF(面试)
java·数据库·redis·分布式·后端·中间件·面试
毕设源码-赖学姐29 分钟前
【开题答辩全过程】以 高校排课系统的优化设计与实现为例,包含答辩的问题和答案
java·eclipse
q_191328469529 分钟前
基于SpringBoot2+Vue2的行业知识答题考试系统
java·vue.js·spring boot·mysql·毕业设计·计算机毕业设计·演示文稿
上78将30 分钟前
Java中既有编译执行又有解释执行,这个怎么理解?
java·开发语言
鹏北海-RemHusband31 分钟前
微前端实现方式:HTML Entry 与 JS Entry 的区别
前端·javascript·html
Mr_Xuhhh32 分钟前
JAVA期末重点
java·开发语言·python