java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据
-
java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据
-
使用插件:spire.doc
-
创建工具类,上代码:
import com.spire.doc.Document; import com.spire.doc.Table; import com.spire.doc.TableCell; import com.spire.doc.TableRow; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; import org.apache.commons.collections4.map.LinkedMap; import org.springframework.stereotype.Component;import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;/*** 向插入Word数据工具类* @author yyds*/ @Component public class WordInsertDataUtil {/*** 根据书签向Word插入数据; type=1插入文本,type=2插入图片, type=3插入复选框。。。。* @param bookmarks* @param bookMarkDatas*/public void insertDataByBookmarks(Document doc, BookmarksNavigator bookmarks, List<Map<String, String>> bookMarkDatas){for (int i = 0; bookMarkDatas.size() > 0 && i < bookMarkDatas.size(); i++) {Map<String, String> bookMarkData = bookMarkDatas.get(i);if ("1".equals(bookMarkData.get("type"))){bookmarks.moveToBookmark(bookMarkData.get("bookMark"));bookmarks.replaceBookmarkContent(bookMarkData.get("value"), true);} else if ("2".equals(bookMarkData.get("type"))){bookmarks.moveToBookmark(bookMarkData.get("bookMark"));Paragraph para = new Paragraph(doc);//图片位置DocPicture picture = para.appendPicture(bookMarkData.get("picPath"));//图片高picture.setHeight(Float.parseFloat(bookMarkData.get("heigth")));//图片宽picture.setWidth(Float.parseFloat(bookMarkData.get("width")));picture.setTextWrappingStyle(TextWrappingStyle.Through);bookmarks.insertParagraph(para);} else if ("3".equals(bookMarkData.get("type"))){bookmarks.moveToBookmark(bookMarkData.get("bookMark"));bookmarks.replaceBookmarkContent(bookMarkData.get("value"), true);TextSelection selection = doc.findString(bookMarkData.get("check"),true,true);TextRange tr1 = selection.getAsOneRange();tr1.getCharacterFormat().setFontName("Wingdings");//除了16进制,也可以用10进制来表示这个符号,复选框打勾是82doc.replace(selection.getSelectedText(), "\uF0FE", true, true);} else if("4".equals(bookMarkData.get("type"))){bookmarks.moveToBookmark(bookMarkData.get("bookMark"));bookmarks.replaceBookmarkContent(bookMarkData.get("value"), true);TextSelection selection = doc.findString(bookMarkData.get("uncheck"),true,true);TextRange tr1 = selection.getAsOneRange();tr1.getCharacterFormat().setFontName("Wingdings");//除了16进制,也可以用10进制来表示这个符号,复选框打勾是82doc.replace(selection.getSelectedText(), "\uF0A8", true, true);}}}/*** 向Word中的表格插入行* @param table* @param dataList* @param startRow*/public void insertTable(Table table, List<String[]> dataList, int startRow){for (int i = startRow; i < startRow + dataList.size(); i++) {TableRow row = table.getRows().get(i - 1).deepClone();table.getRows().insert(i, row);TableRow jtcyRow = table.getRows().get(i);for (int j = 0; j < dataList.get(i - startRow).length; j++) {TableCell cell = jtcyRow.getCells().get(j);cell.getChildObjects().clear();TextRange range = cell.addParagraph().appendText(dataList.get(i - startRow)[j]);range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);range.getCharacterFormat().setFontName("宋体");range.getCharacterFormat().setFontSize(11);jtcyRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);jtcyRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);}}}/*** 删除行* @param table 表格* @param startRow 起始行* @param removeNum 删除几行*/public void removeTableRows(Table table, int startRow, int removeNum){for (int i = 0; i < removeNum; i++) {TableRow jtcyRow = table.getRows().get(startRow - 1);table.getRows().remove(jtcyRow);}}public Map<String, String> generalCheckBox(LinkedMap<String, String> dictMap, String bookMark, String checkValue){//todo 多选未开发List<String> valueList = Arrays.asList(checkValue.split(","));StringBuilder sbd = new StringBuilder();int startNum = 1;String checkSymbol = "";for(Map.Entry<String, String> entry : dictMap.entrySet()){String symbol = "symbol" + startNum;sbd.append(symbol);if (valueList.contains(entry.getValue())){checkSymbol = symbol;}startNum++;}Map<String, String> bookMarkMap = new HashMap<>();bookMarkMap.put("bookMark", bookMark);bookMarkMap.put("value", sbd.toString());bookMarkMap.put("type", "3");bookMarkMap.put("check", checkSymbol);return bookMarkMap;} } -
使用方法(仅供参考,自行调试):
-
根据书签插入数据
//打开Word模板 Document doc = new Document(new FileInputStream(templatePath)); //获取所有书签 BookmarksNavigator bookmarks = new BookmarksNavigator(doc); //业务数据 List<Map<String, String>> bookMarkDatas = new ArrayList<>(); //年-插入文本 Map<String, String> nian = new HashMap<>(); nian.put("bookMark", "NIAN"); nian.put("value", bdcdjPermit2.getNian()); nian.put("type", "1"); bookMarkDatas.add(nian); //图片-插入图片 String tpPath = objectMap.get("TP").toString(); Map<String, String> tp = new HashMap<>(); tp.put("bookMark", "TP"); tp.put("picPath", tpPath); tp.put("heigth", "18"); tp.put("width", "13"); tp.put("type", "2"); bookMarkDatas.add(tp); //向Word模板中插入数据 wordInsertDataUtil.insertDataByBookmarks(doc, bookmarks, bookMarkDatas); -
Word中插入表格
//打开Word模板 Document doc = new Document(new FileInputStream(templatePath)); //获取所有书签 BookmarksNavigator bookmarks = new BookmarksNavigator(doc); //获取第一个section Section section = doc.getSections().get(0);//获取表格 Table table = section.getTables().get(0); //业务数据 JSONObject result; //直接替换书签数据 bookmarks.moveToBookmark("TEST"); if (Utils.notEmpty(result.get("test"))) {bookmarks.replaceBookmarkContent(result.getString("test"), true); } //插入表格行的起始位置 int startNum = 22; //插入的行数 int insertNum = 0; //放表格数据列表 List<String[]> tableDataList = new ArrayList<>(); String[] insertData = {test, tset, etst, etts}; tableDataList.add(insertData); insertNum++; //插入行数据 wordInsertDataUtil.insertTable(table, dyDataList, startNum); //删除行数据 wordInsertDataUtil.removeTableRows(table, startNum, 1);
-
相关文章:
java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据
java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据 使用插件:spire.doc 创建工具类,上代码: import com.spire.doc.Document; import com.spire.doc.…...
Java基础知识快速盘点(二)
一,类型转换 隐式转换 将一个类型转换为另一个类型时,系统默认转换常量优化机制算术运算时类型的隐式转换(byte,short在算术运算时都会转换为int)char类型在进行运算时会根据其编码值进行运算 显式转换 二࿰…...
企业降本增效的催化剂:敏捷迭代
伴随着开源技术的大爆发,新一代的软件技术如雨后春笋般层出不穷。每家企业在硬件及软件开发上都有许多开源技术可选,目的还是在于提高效率,降低开发成本。 本篇文章,带大家了解下促进企业降本增效的重要理念:敏捷迭代…...
MySQL入门篇-MySQL高级窗口函数简介
备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL高级窗口函数 窗口函数在复杂查询以及数据仓库中应用得比较频繁 与sql打交道比较多的技术人员都需要掌握 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数据sql脚本 分析函数有3个基本组成…...
什么是 API(应用程序接口)?
API(应用程序接口)是一种软件中介,它允许两个不相关的应用程序相互通信。它就像一座桥梁,从一个程序接收请求或消息,然后将其传递给另一个程序,翻译消息并根据 API 的程序设计执行协议。API 几乎存在于我们…...
如何在外网访问内网的 Nginx 服务?
计算机业内人士对Nginx 并不陌生,它是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,除了nginx外,类似的apache、tomcat、IIS这几种都是主流的中间件。 Nginx 是在 BSD-like 协议下发行的&…...
vue2中defineProperty和vue3中proxy区别
区别一:defineProperty 是对属性劫持,proxy 是对代理对象 下面我们针对一个对象使用不同的方式进行监听,看写法上有什么不同。 // 原始对象 const data {name: Jane,age: 21 }defineProperty defineProperty 只能劫持对象的某一个属性&…...
将bean注入Spring容器的五种方式
前言 我们在项目开发中都用到Spring,知道对象是交由Spring去管理。那么将一个对象加入到Spring容器中,有几种方法呢,我们来总结一下。 ComponentScan Component ComponentScan可以放在启动类上,指定要扫描的包路径;…...
C生万物 | 常量指针和指针常量的感性理解
文章目录📚引言✒常量指针🔍介绍与分析📰小结与记忆口诀✒指针常量🔍介绍与分析📰小结与记忆口诀👉一份凉皮所引发的故事👈总结与提炼📚引言 本文我们来说说大家很困惑的两个东西&am…...
python 打包工具 pyinstaller和Nuitka区别
1.1 使用需求 这次也是由于项目需要,要将python的代码转成exe的程序,在找了许久后,发现了2个都能对python项目打包的工具——pyintaller和nuitka。 这2个工具同时都能满足项目的需要: 隐藏源码。这里的pyinstaller是通过设置key来…...
Python解题 - CSDN周赛第28期
上一期周赛问哥因为在路上,无法参加,但还是抽空登上来看了一下题目。4道题都挺简单的,有点遗憾未能参加。不过即使参加了,手速也未必能挤进前十。 本期也是一样,感觉新增的题目都偏数学类,基本用不到所谓的…...
DNS记录类型有哪些,分别代表什么含义?
DNS解析将域名指向IP地址,是互联网中的一项重要服务。而由于业务场景不同,在设置DNS解析时,需要选择不同的记录类型。网站管理人员需要准确了解每一种DNS记录类型所代表的含义和用途,才能满足不同场景的解析需求。本文中科三方简单…...
ICLR 2022—你不应该错过的 10 篇论文(上)
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 ICLR 2023已经放榜,但是今天我们先来回顾一下去年的ICLR 2022! ICLR 2022将于2022年 4 月 25 日星期一至 4 月 29 日星期五在线举行(连续第三年!…...
HydroD 实用教程(三)环境数据
目 录一、前言二、Location三、Wind Profile四、Directions五、Water5.1 Wave Spectrums5.2 Current Profile5.3 Frequency Set5.4 Phase Set5.5 Wave Height5.6 Regular Wave Set六、参考文献一、前言 SESAM (Super Element Structure Analysis Module)…...
第四章 统计机器学习
机器学习:从数据中学习知识; 原始数据中提取特征;学习映射函数f;通过映射函数f将原始数据映射到语义空间,即寻找数据和任务目标之间的关系; 机器学习: 监督学习:数据有标签&#x…...
Redis第一讲
目录 一、Redis01 1.1 NoSql 1.1.1 NoSql介绍 1.1.2 NoSql起源 1.1.3 NoSql的使用 1.2 常见NoSql数据库介绍 1.3 Redis简介 1.3.1 Redis介绍 1.3.2 Redis数据结构的多样性 1.3.3 Redis应用场景 1.4 Redis安装、配置以及使用 1.4.1 Redis安装的两种方式 1.4.2 Redi…...
Java面试题-消息队列
消息队列 1. 消息队列的使用场景 六字箴言:削峰、异步、解耦 削峰:接口请求在某个时间段内会出现峰值,服务器在达到峰值的情况下会奔溃;通过消息队列将请求进行分流、限流,确保服务器在正常环境下处理请求。异步&am…...
基于离散时间频率增益传感器的P级至M级PMU模型的实现(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
9个相见恨晚的提升办公效率的网站!
推荐9个完全免费的神器网站,每一个都是功能强大,完全免费,良心好用,让你相见恨晚。 1:知犀思维导图 https://www.zhixi.com/ 知犀思维导图是一个完全免费的宝藏在线思维导图工具。它完全免费,界面简洁唯美…...
java的双亲委派模型-附源码分析
1、类加载器 1.1 类加载的概念 要了解双亲委派模型,首先我们需要知道java的类加载器。所谓类加载器就是通过一个类的全限定名来获取描述此类的二进制字节流,然后把这个字节流加载到虚拟机中,获取响应的java.lang.Class类的一个实例。我们把实…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
