当前位置: 首页 > news >正文

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模板中替换书签数据&#xff0c;插入图片&#xff0c;插入复选框&#xff0c;插入Word中表格的行数据&#xff0c;删除表格行数据 使用插件&#xff1a;spire.doc 创建工具类&#xff0c;上代码&#xff1a; import com.spire.doc.Document; import com.spire.doc.…...

Java基础知识快速盘点(二)

一&#xff0c;类型转换 隐式转换 将一个类型转换为另一个类型时&#xff0c;系统默认转换常量优化机制算术运算时类型的隐式转换&#xff08;byte&#xff0c;short在算术运算时都会转换为int&#xff09;char类型在进行运算时会根据其编码值进行运算 显式转换 二&#xff0…...

企业降本增效的催化剂:敏捷迭代

伴随着开源技术的大爆发&#xff0c;新一代的软件技术如雨后春笋般层出不穷。每家企业在硬件及软件开发上都有许多开源技术可选&#xff0c;目的还是在于提高效率&#xff0c;降低开发成本。 本篇文章&#xff0c;带大家了解下促进企业降本增效的重要理念&#xff1a;敏捷迭代…...

MySQL入门篇-MySQL高级窗口函数简介

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL高级窗口函数 窗口函数在复杂查询以及数据仓库中应用得比较频繁 与sql打交道比较多的技术人员都需要掌握 如需要scott用户下建表及录入数据语句&#xff0c;可参考:scott建表及录入数据sql脚本 分析函数有3个基本组成…...

什么是 API(应用程序接口)?

API&#xff08;应用程序接口&#xff09;是一种软件中介&#xff0c;它允许两个不相关的应用程序相互通信。它就像一座桥梁&#xff0c;从一个程序接收请求或消息&#xff0c;然后将其传递给另一个程序&#xff0c;翻译消息并根据 API 的程序设计执行协议。API 几乎存在于我们…...

如何在外网访问内网的 Nginx 服务?

计算机业内人士对Nginx 并不陌生&#xff0c;它是一款轻量级的 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;除了nginx外&#xff0c;类似的apache、tomcat、IIS这几种都是主流的中间件。 Nginx 是在 BSD-like 协议下发行的&…...

vue2中defineProperty和vue3中proxy区别

区别一&#xff1a;defineProperty 是对属性劫持&#xff0c;proxy 是对代理对象 下面我们针对一个对象使用不同的方式进行监听&#xff0c;看写法上有什么不同。 // 原始对象 const data {name: Jane,age: 21 }defineProperty defineProperty 只能劫持对象的某一个属性&…...

将bean注入Spring容器的五种方式

前言 我们在项目开发中都用到Spring&#xff0c;知道对象是交由Spring去管理。那么将一个对象加入到Spring容器中&#xff0c;有几种方法呢&#xff0c;我们来总结一下。 ComponentScan Component ComponentScan可以放在启动类上&#xff0c;指定要扫描的包路径&#xff1b;…...

C生万物 | 常量指针和指针常量的感性理解

文章目录&#x1f4da;引言✒常量指针&#x1f50d;介绍与分析&#x1f4f0;小结与记忆口诀✒指针常量&#x1f50d;介绍与分析&#x1f4f0;小结与记忆口诀&#x1f449;一份凉皮所引发的故事&#x1f448;总结与提炼&#x1f4da;引言 本文我们来说说大家很困惑的两个东西&am…...

python 打包工具 pyinstaller和Nuitka区别

1.1 使用需求 这次也是由于项目需要&#xff0c;要将python的代码转成exe的程序&#xff0c;在找了许久后&#xff0c;发现了2个都能对python项目打包的工具——pyintaller和nuitka。 这2个工具同时都能满足项目的需要&#xff1a; 隐藏源码。这里的pyinstaller是通过设置key来…...

Python解题 - CSDN周赛第28期

上一期周赛问哥因为在路上&#xff0c;无法参加&#xff0c;但还是抽空登上来看了一下题目。4道题都挺简单的&#xff0c;有点遗憾未能参加。不过即使参加了&#xff0c;手速也未必能挤进前十。 本期也是一样&#xff0c;感觉新增的题目都偏数学类&#xff0c;基本用不到所谓的…...

DNS记录类型有哪些,分别代表什么含义?

DNS解析将域名指向IP地址&#xff0c;是互联网中的一项重要服务。而由于业务场景不同&#xff0c;在设置DNS解析时&#xff0c;需要选择不同的记录类型。网站管理人员需要准确了解每一种DNS记录类型所代表的含义和用途&#xff0c;才能满足不同场景的解析需求。本文中科三方简单…...

ICLR 2022—你不应该错过的 10 篇论文(上)

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 ICLR 2023已经放榜&#xff0c;但是今天我们先来回顾一下去年的ICLR 2022&#xff01; ICLR 2022将于2022年 4 月 25 日星期一至 4 月 29 日星期五在线举行&#xff08;连续第三年&#xff01;&#xf…...

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 &#xff08;Super Element Structure Analysis Module&#xff09;…...

第四章 统计机器学习

机器学习&#xff1a;从数据中学习知识&#xff1b; 原始数据中提取特征&#xff1b;学习映射函数f&#xff1b;通过映射函数f将原始数据映射到语义空间&#xff0c;即寻找数据和任务目标之间的关系&#xff1b; 机器学习&#xff1a; 监督学习&#xff1a;数据有标签&#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. 消息队列的使用场景 六字箴言&#xff1a;削峰、异步、解耦 削峰&#xff1a;接口请求在某个时间段内会出现峰值&#xff0c;服务器在达到峰值的情况下会奔溃&#xff1b;通过消息队列将请求进行分流、限流&#xff0c;确保服务器在正常环境下处理请求。异步&am…...

基于离散时间频率增益传感器的P级至M级PMU模型的实现(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

9个相见恨晚的提升办公效率的网站!

推荐9个完全免费的神器网站&#xff0c;每一个都是功能强大&#xff0c;完全免费&#xff0c;良心好用&#xff0c;让你相见恨晚。 1&#xff1a;知犀思维导图 https://www.zhixi.com/ 知犀思维导图是一个完全免费的宝藏在线思维导图工具。它完全免费&#xff0c;界面简洁唯美…...

java的双亲委派模型-附源码分析

1、类加载器 1.1 类加载的概念 要了解双亲委派模型&#xff0c;首先我们需要知道java的类加载器。所谓类加载器就是通过一个类的全限定名来获取描述此类的二进制字节流&#xff0c;然后把这个字节流加载到虚拟机中&#xff0c;获取响应的java.lang.Class类的一个实例。我们把实…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...