告别XML模板的繁琐!Word文档导出,easy!
word模板导出
最近项目中有个功能,导出月报,发现同事使用了docx格式模板,感觉比之前转成xml的简单多了,这边记录下使用方法。
xml方式导出word,模板太复杂了
资料
poi-tl
一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性
官方文档地址 ,还是很详细的,有多个场景的示例
如何使用
- 必要的标签知识
- 文字
{{var}}
- 数据模型:
String :文本TextRenderData :有样式的文本HyperlinkTextRenderData :超链接和锚点文本Object :调用 toString() 方法转化为文本
-
图片
图片标签以@开始:{{@var}}
- 数据模型:
String :图片url或者本地路径,默认使用图片自身尺寸ByteArrayPictureRenderDataFilePictureRenderDataUrlPictureRenderData
-
表格行循环
配合插件-LoopRowTableRenderPolicy
-
图标
- 多系列图表指的是条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、散点图等
数据模型ChartMultiSeriesRenderData
- 单系列图表指的是饼图(3D饼图)、圆环图等。
- 引入依赖
<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.2</version></dependency>
- 简单的demo
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.ChartMultiSeriesRenderData;
import com.deepoove.poi.data.Charts;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.policy.RenderPolicy;
import org.springframework.stereotype.Service;import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @program: learn_summary* @description:* @author: zzg@xnj* @create: 2025-03-10 15:58**/
@Service
public class WordService {public void makeWord(){HashMap<String, Object> dates = new HashMap<>();//字符串String wenzi="这个是文字";dates.put("wenzi", wenzi);//单个图片
// dates.put("pic", Pictures.ofUrl( "https://img.tukuppt.com/ad_preview/00/10/23/5c992ae114e20.jpg!/fw/980").size(200, 200).create());dates.put("pic", "https://img.tukuppt.com/ad_preview/00/10/23/5c992ae114e20.jpg!/fw/980");//多个图片ArrayList<String> urls = new ArrayList<>();urls.add("https://pic.52112.com/2020/04/13/JPG-200413_328/gCaPae4zjp_small.jpg");urls.add("https://img.tukuppt.com/ad_preview/00/10/23/5c992ae114e20.jpg!/fw/980");dates.put("pictures", createPictureList("picture",urls,200,200));//插件使用HashMap<String, RenderPolicy> policyHashMap = new HashMap<>();//表格 使用LoopRowTableRenderPolicyLoopRowTableRenderPolicy loopRowTableRenderPolicy = new LoopRowTableRenderPolicy();ArrayList<HashMap<String, String>> tables = new ArrayList<>();HashMap<String, String> map = new HashMap<>();map.put("name", "大豆");map.put("count", "18");map.put("price", "100");tables.add(map);map = new HashMap<>();map.put("name", "黄豆");map.put("count", "38");map.put("price", "110");tables.add(map);dates.put("goods",tables);policyHashMap.put("goods", loopRowTableRenderPolicy);//图表ChartMultiSeriesRenderData chart = Charts.ofMultiSeries("商品售卖情况", new String[] { "大豆", "黄豆" }).addSeries("北京", new Double[] { 15.0, 6.0 }).addSeries("上海", new Double[] { 223.0, 119.0 }).create();dates.put("barChart", chart);try {WordService.createWordOfList("E:\\data\\text2.doc",new FileInputStream("E:\\data\\word_template.docx"),dates,policyHashMap);} catch (FileNotFoundException e) {e.printStackTrace();}}private List<Map<String, PictureRenderData>> createPictureList(String mapKey,List<String> urls,int width, int height) {List<Map<String, PictureRenderData>> list = new ArrayList<>();for (String url : urls) {list.add(createPictureMap(mapKey,url, width, height));}return list;}private Map<String, PictureRenderData> createPictureMap(String mapKey,String imgUrl, int width, int height) {Map<String, PictureRenderData> map = new HashMap<>();map.put(mapKey, Pictures.ofUrl( imgUrl).size(width, height).create());return map;}/*** 创建word文档* @param outputPath 输出路径* @param templatePath 模板路径* @param data 数据* @param placeholderPolicy 占位标签使用插件* @return*/public static boolean createWordOfList(String outputPath, InputStream templatePath, Map<String, Object> data, Map<String, RenderPolicy> placeholderPolicy) {try {FileOutputStream out = new FileOutputStream(outputPath);BufferedOutputStream bos = new BufferedOutputStream(out);// 使用Configure.ConfigureBuilder而不是BuilderConfigureBuilder builder = Configure.builder();// 动态绑定插件if (placeholderPolicy!=null) {for (Map.Entry<String, RenderPolicy> entry : placeholderPolicy.entrySet()) {builder.bind(entry.getKey(), entry.getValue());}}Configure configure = builder.build();// 读取模板并渲染数据XWPFTemplate template = XWPFTemplate.compile(templatePath, configure).render(data);try {template.write(bos);template.close();} catch (Exception e) {e.printStackTrace();return false;}out.flush();bos.flush();} catch (Exception e) {e.printStackTrace();return false;}return true;}}
- 模板
相关文章:
告别XML模板的繁琐!Word文档导出,easy!
word模板导出 最近项目中有个功能,导出月报,发现同事使用了docx格式模板,感觉比之前转成xml的简单多了,这边记录下使用方法。 xml方式导出word,模板太复杂了 资料 poi-tl 一个基于Apache POI的Word模板引擎,也是一个免费开源的Jav…...
LeetCode 3280 将日期转换为二进制表示
【算法实战】日期转二进制:两种解法的思路与优化(附代码解析) 一、问题描述 给定一个yyyy-mm-dd格式的日期字符串,要求将年、月、日分别转为无前导零的二进制,并保持year-month-day格式。 示例:输入2025-…...
基于SpringBoot的“考研互助平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“考研互助平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…...
在线Doc/Docx转换为PDF格式 超快速转换的一款办公软件 文档快速转换 在线转换免费转换办公软件
小白工具https://www.xiaobaitool.net/files/word-pdf/提供了一项非常实用的在线服务——将Doc或Docx格式的文档快速转换为PDF格式。这项服务不仅操作简单,而且转换效率高,非常适合需要频繁处理文档转换的用户。 服务特点: 批量转换&#x…...
3.14-进程间通信
进程间通信 IPC 进程间通信的原理,借助进程之间使用同一个内核,借助内核,传递数据。 进程间通信的方法 管道:最简单。信号:开销小。mmap映射:速度最快,非血缘关系之间。socket(本…...
大模型AI多智能体系统(Multi-Agent Systems, MAS)技术介绍
一、多智能体系统的定义与核心概念 多智能体系统(MAS)是由多个具备自主决策能力的智能体(Agent)组成的分布式系统。每个智能体能够感知环境、执行动作,并通过协作或竞争实现个体或集体目标。其核心特征包括: 自主性:智能体无需外部指令即可独立决策(如MetaGPT中的角色…...
web3区块链
Web3 是指下一代互联网,也被称为“去中心化互联网”或“区块链互联网”。它是基于区块链技术构建的,旨在创建一个更加开放、透明和用户主导的网络生态系统。以下是关于 Web3 的一些关键点: ### 1. **核心概念** - **去中心化**࿱…...
Alembic 实战指南:快速入门到FastAPI 集成
一、快速开始 1.1 简介 Alembic 是一个基于 SQLAlchemy 的数据库迁移工具,主要用于管理数据库模式(Schema)的变更,例如新增表、修改字段、删除索引等,确保数据库结构与应用程序的 ORM 模型保持一致。 Alembic 通过版…...
【视频】V4L2、ffmpeg、OpenCV中对YUV的定义
1、常见的YUV格式 1.1 YUV420 每像素16位 IMC1:YYYYYYYY VV-- UU– IMC3:YYYYYYYY UU-- VV– 每像素12位 I420: YYYYYYYY UU VV =>YUV420P YV12: YYYYYYYY VV UU =>YUV420P NV12: YYYYYYYY UV UV =>YUV420SP(最受欢迎格式) NV21: YYYYYYYY VU VU =>YUV420SP…...
ubuntu20.04装nv驱动的一些坑
**1.一定要去bios里面关闭secure boot,否则驱动程序需要签名,安装了的驱动无法被识别加载 2.假如没有关闭secure boot然后装了驱动,然后再去关闭secure boot,可能会导致进入不了ubuntu的情况 此时,先恢复secure boot&…...
【SpringMVC】常用注解:@SessionAttributes
1.作用 用于多次执行控制器方法间的参数共享 2.属性 value:用于指定存入的属性名称 type:用于指定存入的数据类型 3.示例 先写JSP代码 <a href"demo1/putMethod">存入 SessionAttribute</a><br><a href"demo…...
阿里云企业邮箱出现故障怎么处理?
阿里云企业邮箱出现故障怎么处理? 以下是处理阿里云企业邮箱故障的详细分步指南,帮助您快速定位问题并恢复邮箱正常使用: 一、初步排查:确认故障范围与现象 确定影响范围 全体用户无法使用 → 可能为阿里云服务端故障或网络中断。…...
C# Enumerable类 之 集合操作
总目录 前言 在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合…...
LVGL移植到6818开发板
一、移植步骤 1.lv_config.h 配置文件启动 framebuffer 2、lv_config.h 配置文件关闭SDL 2.修改main.c 去掉SDL输入设备 3.修改Makefile 文件启动交叉编译 去掉警告参数 去掉SDL库 4.交叉编译代码 make clean #清空 ⭐ 必须要清空一次再编译! 因为修改了 lv_con…...
深入理解 `ParameterizedTypeReference`:解决 Java 泛型擦除问题
在 Java 中,由于类型擦除的存在,我们在使用 RestTemplate 获取带有泛型的 HTTP 响应时,可能会遇到 泛型信息丢失 的问题。而 ParameterizedTypeReference<T> 正是用来解决这个问题的。 本文将深入解析 ParameterizedTypeReference 的作…...
如何使用Python的matplotlib.pyplot绘制热图和损失图
在Python的数据可视化中,matplotlib是一个非常重要的库。而matplotlib.pyplot作为其中一个模块,提供了许多绘制各种图形的函数。今天,我们就来聊聊如何利用这个库来绘制热图和损失图,通过这两个图形展示数据,让我们一起…...
【数据分享】2000—2024年我国省市县三级逐月归一化植被指数(NDVI)数据(Shp/Excel格式)
之前我们分享过2000—2024年逐月归一化植被指数(NDVI)栅格数据(可查看之前的文章获悉详情),该数据来源于NASA定期发布的MOD13A3数据集!很多小伙伴拿到数据后反馈栅格数据不太方便使用,问我们能不…...
数据结构---堆栈和列
一、堆栈 1.栈堆:具有一定操作约束的线性表;(只在一端做插入删除) 2.栈的顺序存储结构: 由一个一维数组和一个记录栈顶元素位置的变量组成。定义方式如下: 3.入栈操作: 注意:&…...
威胁驱动的网络安全方法论
摘要 目前的网络安全风险管理实践很大程度上是由合规性要求驱动的,这使得公司/组织不得不在安全控制和漏洞上投入人力/物力。(风险管理涉及多个方面,包括资产、威胁、漏洞和控制,并根据事故发生的可能性及造成的影响进行评估。威胁…...
搭建Spring Boot Admin监控系统
什么是Spring Boot Admin Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源工具。它提供了一个用户友好的 Web 界面,用于集中管理和监控多个 Spring Boot 应用程序的运行状态、健康状况、日志、配置等信息。 Spring Boot Admin 的核心功能 应用…...
P2730 魔板 (写了巨久..有一些数字,字符,字符串之间的转换规则)
ac代码: #include<iostream> #include<map> #include<queue> using namespace std; map<string,int>mp1,mp2; map<string,string>mp3; queue<string>q; string str,res"12345678"; void pri(string str){if(resstr)…...
MinIo前后端实现
这几天想玩玩Minio,整体来说简单使用起来不复杂(当然也有可能是我配置的太少了) Minio下载 我是通过Dokcer在虚拟机上下载的(Docker真好用啊) 拉取Minio镜像 docker pull minio/minio启动Minio容器 docker run -d …...
mesh开发解析
开源的Mesh网络协议栈及相关项目: 1.B.A.T.M.A.N.(Better Approach to Mobile Ad-hoc Networking)• 简介:B.A.T.M.A.N.是一种用于多跳自组织网络的路由协议,适用于无线Mesh网络。它通过优化数据传输路径,确保网络的高可靠性和动…...
使用netlify部署github的vue/react项目或本地的dist,国内也可以正常访问
提供简洁的部署流程和丰富功能,如自定义域名、自动构建和服务器端功能。通过连接到 Git 仓库实现持续部署,每次推送代码都会自动构建和发布,支持无服务器函数,允许在前端项目中实现后端逻辑,提供直观的用户界面来管理和…...
LinuX---Shell正则表达式
正则表达式 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配…...
[Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
温馨提示 这关涉及的知识点较多, 写的很长, 中间留了很多错误引导(本人在实验时遇到的问题, 或许你们也会遇到), 在后文才逐步解释源码分析 跟前几关一样, 更改了 WAF 的过滤字段这个关卡, 只有0, 1, (单引号), $, <, \ , ( , )可以用解题分析(实验这些命令, 可以先在自己本…...
基于PySide6与CATIA Automation的批量截图处理系统开发实践
引言 本文完整实现了基于PySide6 GUI框架与CATIA Automation技术的批量截图处理系统。系统支持对CATIA文件(.CATPart/.CATProduct)的自动化截图、图像优化及批量导出,通过模块化架构设计实现了超过200%的效率提升。本文将从技术架构、核心算…...
AI开发软件:开启智能时代的钥匙
在当今数字化时代,人工智能(AI)已不再是一个遥远的概念,而是深入到我们生活和工作的方方面面,成为推动各行业变革与发展的核心力量。AI 开发软件作为实现人工智能技术落地的关键工具,正引领着一场前所未有的…...
73.HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三)
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三) 文章目录 HarmonyOS NEXT PicturePreviewImage组件…...
【模拟算法】
目录 替换所有的问号 提莫攻击 Z 字形变换 外观数列 数青蛙(较难) 模拟算法:比葫芦画瓢。思路较简单,考察代码能力。 1. 模拟算法流程,一定要在演草纸上过一遍流程 2. 把流程转化为代码 替换所有的问号 1576. 替…...
Spring Cloud 中的服务注册与发现: Eureka详解
1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时,URL 是写死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时,这个 URL 就需要相应地变…...
WireShark自动抓包
背景 异常流量检测是当前保护网络空间安全的重要检测方法。 对流量的研究,首先需要在系统中进行抓包,并对包进行分析。 这里对WireShark自动抓包进行简要介绍。 操作步骤 1、选择“捕获”>“选项”。 2、在Input下,选择要抓包的网络接…...
Redis 的应用场景
缓存: 作为缓存层,加速数据访问,减轻数据库压力,常用于网页、数据库查询结果的缓存。 会话存储: 存储用户会话信息,支持分布式系统中的会话共享。 消息队列: 利用列表和发布/订阅功能…...
React使用路由表
目录 前言 实现步骤 1. 安装依赖 2. 创建路由配置文件 高级配置 嵌套路由配置 对比两种配置方式 传统 JSX 方式 路由表方式优势 完整功能示例 带路由守卫的配置 注意事项 总结 前言 React Router 从 v6 版本开始支持类似 Vue 的集中式路由表配置方式,通…...
嵌入式C语言中堆栈管理与数据存储的精髓
在嵌入式开发中,理解C语言的内存管理和数据存储机制是至关重要的。本文将从堆栈管理和数据存储两个方面,深入探讨C语言在嵌入式Linux开发中的应用。 一、堆栈管理 1.1 栈的初始化与作用 栈是C语言运行的基础,主要用于存储函数参数、局部变量、函数返回值和编译器生成的临时…...
Linux系统之less命令的基本使用
Linux系统之less命令的基本使用 一、less命令介绍二、less命令的使用帮助2.1 less命令的帮助信息2.2 less命令主要选项解释 三、less命令的基本使用3.1 查看文件内容3.2 结合管道使用 四、注意事项 一、less命令介绍 在Linux和Unix类操作系统中,文件浏览是一项常见的…...
【免费】1949-2020年各省人均GDP数据
1949-2020年各省人均GDP数据 1、时间:1952-2020年 2、来源:国家统计局、统计年鉴 3、指标:各省人均GDP 4、范围:31省 5、指标解释:人均GDP(Gross Domestic Product per capita)是指一个国家…...
三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg
前言 在当今的短视频时代,高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻,还是制作 GIF、去除广告,剪辑都是必不可少的一环。 然而,批量处理大量视频并非易事,常见的挑战…...
angular中下载接口返回文件
目录 一、URL.createObjectURL() 一、URL.createObjectURL() createObjectURL属于js的原生方法,位于window.URL上,用于将Blob或者File文件转换为可以临时的URL地址进行显示 **注意**:Angular 的 HttpClient 默认将响应解析为 JSON 对象16。…...
自定义tiptap插件
本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~ 具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘…...
爬虫基础之爬取豆瓣同城信息(保存为csv excel 数据库)
网站:长沙最近一周戏剧活动_豆瓣 温馨提示: 本案例仅供学习交流使用 本案例所使用的模块 requests(发送HTTP请求)pandas(数据保存模块)lxml(用于解析数据模块)csv(用于保存为csv文件)pymysql(用于操作数据库)parsel(解析数据的模块) 确定爬取的信息内容: 戏剧的名称…...
MongoDB Vs Elasticsearch
文章目录 前言一、核心区别二、优缺点MongoDBElasticsearch 三、如何选择四、结合使用总结 前言 MongoDB 和 Elasticsearch 在存储、查询方式、使用场景等方面有较大区别,以下是它们的核心区别、各自优缺点以及实际使用中的选择建议。 一、核心区别 对比项MongoDB…...
《蓝耘容器全栈技术指南:企业级云原生与异构计算实战大全》
在数字化转型的浪潮中,容器技术已成为企业构建云原生架构的核心引擎,而蓝耘容器凭借其轻量化内核、异构计算支持及混合云调度能力,正成为企业级应用的首选方案。本文基于《蓝耘容器全栈技术指南》,结合实战案例与技术原理…...
【Android】RuntimeShader 应用
1 简介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)编写着色器代码,底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…...
python 提取视频中的音频
在Python中提取视频中的音频,你可以使用moviepy库,这是一个非常强大且易于使用的库,专门用于视频编辑。以下是如何使用moviepy来提取视频中的音频的步骤: 安装moviepy 首先,你需要安装moviepy。你可以通过pip安装它&a…...
HTML+CSS基础(了解水平)
html 的介绍 学习目标 能够知道html的作用 1. html的定义 2. html的定义 HTML 的全称为:HyperText Mark-up Language, 指的是超文本标记语言。 标记:就是标签, <标签名称> </标签名称>, 比如: <html></html>、<h1><…...
提示词工程(Prompt Engineering)
https://www.bilibili.com/video/BV1PX9iYQEry 一、懂原理,要知道 为什么有的指令有效,有的指令无效为什么同样的指令有时有效,又是无效怎么提升指令有效的概率 大模型应用架构师想什么? 怎样能更准确?答࿱…...
MySQL中的B+树索引经验总结
一、什么是B树 B树是一种二叉树,由二叉查找树,平衡二叉树,B树演化而来。 请看上图 B树的特点: 1)非叶子节点不存放数据,只存放键值,数据都存放在叶子节点中。 2)叶子节点都在同一…...
社交网络分析实战(NetworkX分析Twitter关系图)
目录 社交网络分析实战(NetworkX分析Twitter关系图)1. 引言2. 项目背景与意义3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法3.3 数据集示例4. 社交网络分析理论4.1 节点度数与度分布4.2 网络密度4.3 中心性指标5. GPU加速在社交网络分析中的应用6. PyQt GUI与交互式可视…...
Windows功能之FTP服务器搭建
一、创作背景 之前有用linux系统搭建过ftp服务器,最近想着用windows系统也顺便搭建一个,看网上有第三方服务软件一键部署,记得windows可以不借助第三方软件就可以搭建,就想顺便操作试试,结果老是连接不上,费…...