Java操作word

生命无罪,健康万岁,我是laity。

我曾七次鄙视自己的灵魂:

第一次,当它本可进取时,却故作谦卑;

第二次,当它在空虚时,用爱欲来填充;

第三次,在困难和容易之间,它选择了容易;

第四次,它犯了错,却借由别人也会犯错来宽慰自己;

第五次,它自由软弱,却把它认为是生命的坚韧;

第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;

第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。

动态数据生成word报表,其实是前端的活(前端做简单),如果这个活现在担任在"各位"后端身上,就希望本文能够给予你一定的帮助吧!

Java操作Word

方案一

使用easypoi + jfree
操作比较简单,如果你的报表生成也简单的情况推荐使用;
有需要的小伙伴可以直接看Java生成Word

问题

  • 这个是比较好实现的,但easypoi问题太多,而且版本兼容性差的很;
  • 有兴趣的小伙伴可以去看开源仓库;
  • 就是按下葫芦浮起瓢,你懂我的意思吧。

方案二

poi-tl
个人认为是比较好用,但是如果后端动态数据过多的情况下,建议还是由前端来做为好,双方都可以轻松。
官方文档
文档很详细,该有的都有,就是封装几个poi-tl相关工具类

依赖导入

        <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version></dependency>

工具类

/*** Poi-tl模板引擎官方文档:http://deepoove.com/poi-tl/1.10.x/* @author: Laity* @Project: JavaLaity* @Description: word工具类*/
@Slf4j
public class WordUtil {/*** 根据模板填充内容生成word,并下载*/public static void downloadWord(HttpServletResponse response, XWPFTemplate template) {ServletOutputStream outputStream;try {//out = new FileOutputStream(filePath);//输出路径(下载到指定路径)// 将填充之后的模板写入filePathoutputStream=response.getOutputStream();//将template写到OutputStream中template.write(outputStream);outputStream.flush();outputStream.close();template.close();} catch (Exception e) {e.printStackTrace();}}/*** 只得到这个对象本身的所有属性名及属性值* @param target 目标对象* @return Map集合* @throws IntrospectionException 反射异常*/public static Map<String,Object> getOnlySelfFieldNameAndValue(Object target) throws IntrospectionException {Map<String,Object> map=new HashMap<>();Class<?> clazz = target.getClass();Field[] tableFields = clazz.getDeclaredFields();getAllFieldNameAndValue(target,map,tableFields,clazz);return map;}/*** 递归获取某个类及其所有父类的所有字段*/private static Field[] getSuperClassFields(Field[] tableFields, Class<?> clazz) {Class<?> superClazz = clazz.getSuperclass();if (superClazz.equals(Object.class)) {return tableFields;}Field[] tableSuperFields = superClazz.getDeclaredFields();Field[] c = new Field[tableFields.length + tableSuperFields.length];System.arraycopy(tableFields, 0, c, 0, tableFields.length);System.arraycopy(tableSuperFields, 0, c, tableFields.length, tableSuperFields.length);getSuperClassFields(c, superClazz);return c;}
}

Controller层

/*** https://deepoove.com/poi-tl/1.10.x/#hack-loop-table* @author: Laity* @Project: JavaLaity* @Description: word导出接口层*/
@RestController
@RequestMapping("/word")
@Slf4j
public class WordController {@Value("${file.readPath}")private String basePath;@GetMapping("/test")public void jiangDu(HttpServletResponse response){response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;fileName=test.docx");/* word模板地址*/String resource=basePath+"test.docx";Map<String, Object> map=new HashMap<>();// 放测试数据 - 也可以嵌套map,也可以放对象,根据自己的数据进行数据处理map.put("title", "测试");// 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板(compile)+渲染数据(render)/*-------------------策略渲染---------------------*/LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); // 这个有很多方式,有需要直接看文档// Configure config = Configure.builder().bind("你设置的标签名", 你的渲染策略:policy).build();XWPFTemplate template = XWPFTemplate.compile(resource, config).render(map);//这里进行导出WordUtil.downloadWord(response,template);}
}

文章中的逻辑代码较为简单,建议去看官方文档来进行使用

问题

  • 资源消耗相比较之下较大些

前端Vue操作Word(easy)

  • jszip
    • jszip是一个用于创建、读取和编辑.zip文件的JavaScript库,且API的使用也很简单。
  • jszip-utils
    • jszip-utils是与jszip一起使用的跨浏览器的工具库
    • 使用getBinaryContent():读取并获得模板文件的二进制内容

  • docxtemplater
    • docxtemplater是一种邮件合并工具,它以编程方式使用,处理条件、循环,并且可以扩展为表格、HTML、图像等。
  • FileSaver
    • FileSaver.js 是在客户端保存文件的解决方案,非常适合需要生成文件,或者保存不应该发送到外部服务器的敏感信息的应用。
    • 使用saveAs(blob, “test.docx”):将目标文件对象保存为目标类型的文件,并命名

人生如一场修行。得意时,一日看尽长安花;艰难时,潦倒新停浊酒杯。但生命的跋涉不能回头,哪怕畏途巉岩不可攀,也要会当凌绝顶;哪怕无人会登临意,也要猛志固常在。我是Laity,正在前行的Laity。

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

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

相关文章

类脑计算与大规模拓扑分析的几个关键技术问题

类脑计算与大规模拓扑分析的几个关键技术问题 1&#xff1a;构造一个类脑模型&#xff0c;需要我们实现自动拓扑模型构造模块&#xff0c;而现在的水平是人工手动编辑&#xff0c;费时费力&#xff0c;模型的尺度也很有限 2&#xff1a;在神经元这个层次里面&#xff0c;我们需…

【NI-DAQmx入门】传感器基础知识

1.什么是传感器&#xff1f; 传感器可将真实的现象&#xff08;例如温度或压力&#xff09;转换为可测量的电流和电压&#xff0c;因而对于数据采集应用必不可少。接下来我们将介绍您所需的测量类型及其对应的传感器类型。在开始之前&#xff0c;您还可以先了解一些传感器术语&…

SpringBoot面试题8:运行 Spring Boot 有哪几种方式?Spring Boot 需要独立的容器运行吗?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:运行 Spring Boot 有哪几种方式? 运行Spring Boot应用有多种方式,具体取决于你的需求和环境。以下是几种常见的运行Spring Boot应用的方式: 使…

Linux进程程序替换

一、单进程下的程序替换 使用execl进行程序替换&#xff0c;先执行execl前面的代码&#xff0c;在execl处替换成其它进程的代码和数据继续执行&#xff0c;后面的内容就不执行了&#xff0c;因此只打印before 二、程序替换原理 前面我们fork创建子进程&#xff0c;子进程会继承…

在全新ubuntu上用gpu训练paddleocr模型遇到的坑与解决办法

目录 一. 我的ubuntu版本![在这里插入图片描述](https://img-blog.csdnimg.cn/297945917309494ab03b50764e6fb775.png)二.首先拉取paddleocr源代码三.下载模型四.训练前的准备1.在源代码文件夹里创造一个自己放东西的文件2.准备数据2.1数据标注2.2数据划分 3.改写yml配置文件4.…

PostGreSQL:数据表继承

PostGreSQL手册的简史部分介绍到&#xff1a;被称为PostGreSQL的对象关系型数据库管理系统&#xff0c;由美国加州大学伯克利 分校编写的POSTGRES软件包发展而来。经过十几年的发展&#xff0c;PostGreSQL目前是世界上最先进的开源数据库。 The object-relational database man…

C++编程题目------平面上的最接近点对(分治算法)

题目描述 给定平面上n个点&#xff0c;找出其中的一对点的距离&#xff0c;使得在这n个点的所有点对中&#xff0c;该距离为所有点对中最小的。 输入格式 第一行一个整数 n&#xff0c;表示点的个数。 接下来 n 行&#xff0c;每行两个实数 x,y &#xff0c;表示一个点的行…

torch.distributed.elastic.multiprocessing.api: [ERROR] failed (exitcode: -7)

在docker中运行时&#xff0c;由于配置的共享内存不足导致。新建docker时&#xff0c;shm-size设个大点的值。 不设置时&#xff0c;默认值时64M

Vue 的双向数据绑定是如何实现的?

目录 1. 响应式数据 2. v-model 指令 3. 实现原理 4. 总结 Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;它以其强大的双向数据绑定能力而闻名。双向数据绑定使得数据在视图和模型之间保持同步&#xff0c;并且任一方的变化都会自动反映到另一方。那么&#xff0c;…

数据库和表的相关操作

文章目录 一 数据库的相关操作1.1 显示当前所有的数据库1.2 创建数据库1.3 使用数据库1.4 删除数据库 二 常用数据类型2.1 数值类型2.2 字符串类型2.3 日期类型 三 表的操作3.1 创建表3.2 查看表结构3.3 查看有哪些表3.4 删除表 四 重点内容总结 一 数据库的相关操作 1.1 显示…

python: 判断一个变量是不是class类

在一些时候&#xff0c;我们对函数或者类实例化的时候的传参进行判断是否是类&#xff0c;并做相应实例化处理&#xff0c;那么需要判断是否其是类(也就是你自建的 class XXX) 所以要想判断一个变量是不是类&#xff0c;总结了下面几种办法。 1. try except try:obj MyVari…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper&#xff1a; https://arxiv.org/abs/2103.10385 Code&#xff1a; https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲&#xff0c;今天如果有这样两句评论&#xff1a; 1. 什么苹果啊&#xff0c;都没有苹果味&#xff0c…

rust std

目录 一&#xff0c;std基本数据结构 1&#xff0c;std::option 2&#xff0c;std::result 二&#xff0c;std容器 1&#xff0c;vector 三&#xff0c;std算法 1&#xff0c;排序 2&#xff0c;二分 &#xff08;1&#xff09;vector二分 &#xff08;2&#xff09;…

【C++代码】分割等和子集,目标和,一和零,零钱兑换,动态规划--代码随想录

题目&#xff1a;分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 初步想法排序后双指针&#xff0c;发现不行 class Solution { public:bool canPartition(vector<int>&…

计讯物联外贸公司--佰沃恩应邀出席第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛

10月22日&#xff0c;以“数智创新能动未来”为主题的第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛于集美海景皇冠假日酒店正式启幕。此论坛聚焦集美区战略前沿产业&#xff0c;汇聚来自全国各地优秀的企业家、高校及科研院所专家学者&#xff0c;并邀请相关领域的亲…

【案例实战】NodeJS+Vue3+MySQL实现列表查询功能

这篇文章&#xff0c;给大家带来一个列表查询的功能&#xff0c;从前端到后端的一个综合案例实战。 采用vue3作为前端开发&#xff0c;nodejs作为后端开发。 首先我们先来看一下完成的页面效果。点击分页&#xff0c;可以切换到上一页、下一页。搜索框可以进行模糊查询。 后端…

CSRF 篇

一、CSRF 漏洞&#xff1a; 1、漏洞概述&#xff1a; &#xff08;1&#xff09;一般情景&#xff1a; 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作&#xff0c;通常是在受害者已经登录到特定网站的情况下。 &#xff0…

长沙某公司面经总结 - 失败版

1.Java语言的特征 Java的三大特性&#xff1a;封装、继承、多态 面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征&#xff1a; 继承&#xff1a;继承是从已有类得到继承信息创建新类的过程 封装&#xff1a;封装是把数据和操作数据的方法绑定起来&#xff0c;对…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架&#xff0c;它提供了用于构建图形用…