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

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。

相关文章:

  • 服务器遭受攻击如何处理(记录排查)
  • Redis入门02-基础概念
  • 分类预测 | Matlab实现KOA-CNN-BiLSTM-selfAttention多特征分类预测(自注意力机制)
  • 亲测解决Pytorch TypeError: object of type ‘numpy.int64‘ has no len()
  • 微服务框架SpringcloudAlibaba+Nacos集成RabbitMQ
  • C语言assert函数:什么是“assert”函数
  • 【Java 进阶篇】Java中的响应输出字节数据
  • MySQL - 覆盖索引、回表查询
  • Nacos | 使用 Nginx 转发 Nacos2.x 端口的注意事项
  • 多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布
  • 【开发新的】apache common BeanUtils忽略null值
  • C# Onnx 用于边缘检测的轻量级密集卷积神经网络LDC
  • Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器
  • P2107 小Z的AK计划
  • 如何读懂深度学习python项目,以`Multi-label learning from single positive label`为例
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译]CSS 居中(Center)方法大合集
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Git的一些常用操作
  • Java多态
  • nodejs:开发并发布一个nodejs包
  • Spring-boot 启动时碰到的错误
  • springMvc学习笔记(2)
  • Vue.js 移动端适配之 vw 解决方案
  • vue数据传递--我有特殊的实现技巧
  • ------- 计算机网络基础
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用 QuickBI 搭建酷炫可视化分析
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • $.ajax()参数及用法
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (九)c52学习之旅-定时器
  • (转)甲方乙方——赵民谈找工作
  • .form文件_一篇文章学会文件上传
  • .NET 设计模式初探
  • .NET的数据绑定
  • .NET上SQLite的连接
  • .NET文档生成工具ADB使用图文教程
  • .Net中间语言BeforeFieldInit
  • //解决validator验证插件多个name相同只验证第一的问题
  • /var/lib/dpkg/lock 锁定问题
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ C++ ] STL---string类的模拟实现
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android]如何调试Native memory crash issue
  • [AutoSAR系列] 1.3 AutoSar 架构