java读取word文件转html

一.pom引入依赖

<dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.12.0</version><classifier>jdk16</classifier>
</dependency>

二.代码实现

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();// 把流转化为Documentcom.aspose.words.Document doc = new com.aspose.words.Document(inputStream);doc.save(baos, saveOptions);// 将html文件转化为Document,方便后续使用jsoup的操作Document htmlDoc = Jsoup.parse(baos.toString());// 解析DocumenttableList = 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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nn.relu和F.rulu的区别

先来看看nn.ReLU的源码&#xff0c;可以看到其实在forward中nn.relu是调用了F.relu函数的&#xff1a; class ReLU(Module):r"""Applies the rectified linear unit function element-wise::math:\text{ReLU}(x) (x)^ \max(0, x)Args:inplace: can optionall…

Error:cannot launch node of type [map_server/map_server]

查看是否安装map_server软件包 rospack find map_server查看是否正确配置ROS环境变量 echo $ROS_PACKAGE_PATH如果没有安装map_server软件包 sudo apt-get install ros-noetic-map-server重新编译 catkin_make

网络安全--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统&#xff08;平台&#xff09;的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括&#xff1a;靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

Python WebSocket 客户端教程

WebSocket 是一种在客户端和服务器之间实现双向通信的协议&#xff0c;常用于实时聊天、实时数据更新等场景。Python 提供了许多库来实现 WebSocket 客户端&#xff0c;本教程将介绍如何使用 Python 构建 WebSocket 客户端。 什么是 WebSocket WebSocket 是一种基于 TCP 协议…

使用 Kettle 完成数据 ETL

文章目录 使用 Kettle 完成数据 ETL数据清洗数据处理 使用 Kettle 完成数据 ETL 现在我们有一份网站的日志数据集&#xff0c;准备使用Kettle进行数据ETL。先将数据集加载到Hadoop集群中&#xff0c;然后对数据进行清洗&#xff0c;最后加载到Hive中。 在本地新建一个数据集文…

RocketMQ-RocketMQ集群实践

搭建RocketMQ可视化管理服务 下载可视化客户端源码下载 | RocketMQ 这里只提供了源码&#xff0c;并没有提供直接运行的jar包。将源码下载下来后&#xff0c;需要解压并进入对应的目录&#xff0c;使用maven进行编译。(需要提前安装maven客户端) mvn clean package -Dmaven.t…

Spring Boot 3.2 新特性之 RestClient

SpringBoot 3.2引入了新的 RestClient 用于http接口调用&#xff0c;采用了 fluent API 的风格&#xff0c;可以进行链式调用。 具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-jdbc-client 一、概述 RestClient 是一个类似于 RestTem…

RPC和REST对比

RPC和REST对比 参考学习 RPC 和 REST 之间有什么区别&#xff1f; 当我们对比RPC和REST时&#xff0c;其实是在对比RPC风格的API和REST风格的API&#xff0c;后者通常成为RESTful API。 远程过程调用&#xff08;RPC&#xff09;和 REST 是 API 设计中的两种架构风格。API …

「Swift」取消UITableView起始位置在状态栏下方开始

前言&#xff1a;在写页面UI时发现&#xff0c;当隐藏了NavigationBar时&#xff0c;即使UITableView是从(0,0)进行布局&#xff0c;也会一直在手机状态栏下方进行展示布局&#xff0c;而我的想法是希望UITableView可以从状态栏处就进行展示布局 当前页面展示&#xff1a; 问题…

qt-C++笔记之QStringList

qt-C笔记之QStringList —— 杭州 2023-12-03 code review! 文章目录 qt-C笔记之QStringList1.1.《Qt官方文档》第一部分翻译&#xff1a;继承自QList\<QString\>-初始化-添加字符串1.2.迭代字符串1.3.join()和split()1.4.filter()1.5.lastIndexOf()1.6.indexOf()1.7.…

最有效的wordpress禁止生成缩略图教程

把以下代码加入你的主题 functions.php 文件即可。 // 禁用自动生成的图片尺寸由www.wwttl.com提供学习 function shapeSpace_disable_image_sizes($sizes) {unset($sizes[thumbnail]); // disable thumbnail sizeunset($sizes[medium]); // disable medium sizeun…

stream流操作List对象,指定属性,取差集、交集

差集 // 差集 (list1 - list2 list1 中不同数据)List<Person> reduce1 list1.stream().filter(a -> !list2.stream().map(b -> b.getAge() "&" b.getName()).collect(Collectors.toList()).contains(a.getAge() "&" a.getName()…

【Delphi】实现彩色日志显示框(TRichEdit Helper)

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…

简单3D姿态基线模型网络架构与验证【SIM】

在这篇文章中&#xff0c;我们将回顾 ICCV’17 上提出的 Simple 3D Pose Baseline &#xff0c;即用于 3d 人体姿势估计的简单而有效的基线&#xff0c;也称为 SIM。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在…

基础组件总结(以Element UI组件库为例)

一般对一个组件的使用方式&#xff1a; 每一个组件都有被绑定的数据&#xff0c; &#xff08;1&#xff09;首先会对组件的数据初始化&#xff08;a.data中赋初值 b. 在生命周期函数created或mounted中为变量赋予初值&#xff09; &#xff08;2&#xff09;由于不同组件的…

C语言扫雷小游戏

以下是一个简单的C语言扫雷小游戏的示例代码&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>#define BOARD_SIZE 10#define NUM_MINES 10int main() { int board[BOARD_SIZE][BOARD_SIZE]; int num_flags, num_clicks; int …

threadlocal - 黑马程序员

目录 1、ThreadLocal介绍1.2 ThreadLocal基本使用1.2.1、常用方法1.2.2 使用案例 1.3 ThreadLocal类与synchronized关键字 2、运用场景_事务案例3、ThreadLocal的内部结构4、 ThreadLocal的核心方法源码5、ThreadLocalMap源码分析5.2 弱引用和内存泄漏 课程地址&#xff1a; ht…

Android Camera2使用

一 简介 1.1 Camera API&#xff1a; 这是旧版本的相机API&#xff0c;也称为Camera1 API。它提供了较简单的使用方式&#xff0c;适用于旧版Android设备。但它存在一些限制&#xff0c;如性能不佳、操作复杂等 1.2 Camera2 API&#xff1a; 这是新版本的相机API&#xff0…

LeetCode [简单] 对称二叉树二叉树的直径

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; //对称二叉树 /*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public TreeNode(int val0, TreeNode leftnu…

Blender学习笔记:小车狂奔动画

文章目录 路旁小树汽车尾气移动 教程地址&#xff1a;八个案例教程带你从0到1入门blender【已完结】 小车建模 路旁小树 1 添加摄像机&#xff0c;在小车下面拉一个平面&#xff0c;覆盖到摄像机的观察视窗。复制一层平面&#xff0c;收窄变成小车两侧的路面&#xff0c;编辑…