热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Java中利用POI优雅的导出Excel文件详解

这篇文章主要给大家介绍了关于Java中如何利用POI优雅的导出Excel文件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

故事是这样开始的: 公司给排了几天的工期,让完成 2 个功能模块的开发。其中有一个场景是这样的,从 Excel 导入数据,要求数据不能重复。用户可以下载导入失败的 Excel 文件。

这样就有 2 种实现

  • 将失败数据存储数据库,需要下载时生成 Excel 下载即可
  • 将失败数据生成 Excel 文件存储文件服务器,然后返回下载链接。

老大要求按方案二进行。好吧,导出 Excel 是再常见不过的功能了,然而总是觉得以前写的不够优雅,所以决定进行简单的封装,以适应简单场景的 Excel 导出。

实现

Excel 导出的数据源一般是数据库中查询的数据。在 Java 开发这种面向对象的设计中,数据一般都是以对象为载体,填充在集合中的。所以入参之一便设计为 Collection 集合类。

导出的 Excel 一般需要表头说明每列数据的含义,这里计划用注解+反射来进行定义。Excel 无论是通过 HttpServletResponse 还是 File 存储,本质上都是 IO 流操作。

具体实现如下:

pom.xml

  
   org.apache.poi
   poi-ooxml
   4.1.2
  

注解定义

该注解添加在字段上,标识哪些字段需要导出到 Excel,并且添加表头说明。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelHeader {

 /**
  * 表头
  * @return
  */
 String value() default "";

 /**
  * 列索引
  * @return
  */
 int columnIndex() default 0;
}

实体类

以下实体类中根据注解可知,age 字段不需要导出到 Excel。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

 @ExcelHeader(value = "账号")
 private String username;

 @ExcelHeader(value = "密码")
 private String password;

 @ExcelHeader(value = "生日")
 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 private LocalDateTime birthday;

 // 该字段没有添加注解, Excel不导出
 private Integer age;

 public User(String username, String password, LocalDateTime birthday) {
  this.username = username;
  this.password = password;
  this.birthday = birthday;
 }
}

单元测试

注释已经足够清晰,这里不再过多复述。

@Slf4j
class IdcPoiApplicationTests {

 @Test
 void contextLoads() throws NoSuchFieldException, IllegalAccessException, IOException {
  // 创建模拟数据
  User user1 = new User("admin", "123456", LocalDateTime.now());
  User user2 = new User("test", "123456", LocalDateTime.now());
  List users = Arrays.asList(user1, user2);

  // 文件路径
  String basePath = "/Users/cuishiying/Documents/spring-cloud-learning/idc-poi/oss/";
  String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls";

  // 将Excel写入文件
  HSSFWorkbook workbook = exportExcel(users, User.class);
  workbook.setSheetName(0,"sheetName");//设置sheet的Name

  // 无论是通过HttpServletResponse导出还是导出到本地磁盘,本质都是IO操作,所以这里将IO操作提取到外层。
  workbook.write(new File(basePath + File.separator + fileName));
 }

 /**
  *
  * @param data 需要导出的数据
  * @param clz 数据对应的实体类
  * @param  泛型
  * @return Excel文件
  * @throws NoSuchFieldException
  * @throws IllegalAccessException
  */
 public  HSSFWorkbook exportExcel(List data, Class clz) throws NoSuchFieldException, IllegalAccessException {

  Field[] fields = clz.getDeclaredFields();
  List headers = new LinkedList<>();
  List variables = new LinkedList<>();

  // 创建工作薄对象
  HSSFWorkbook workbook=new HSSFWorkbook();//这里也可以设置sheet的Name
  // 创建工作表对象
  HSSFSheet sheet = workbook.createSheet();
  // 创建表头
  Row rowHeader = sheet.createRow(0);

  // 表头处理
  for (int h = 0; h  aClass = t.getClass();
   // 填充列数据
   for (int j = 0; j 

总结

上边的案例只是表达基本设计思路,并不严谨。大家项目中使用的话还请斟酌。

到此这篇关于Java中利用POI优雅的导出Excel文件的文章就介绍到这了,更多相关Java用POI导出Excel文件内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 利用Apache构建高效稳定的Web服务器环境
    本文详细介绍了如何利用Apache构建高效稳定的Web服务器环境。首先,概述了Apache服务器的基本概念及其安装步骤,并深入探讨了相关配置文件的设置方法。接着,通过具体的实验环境示例,展示了服务端(域名:zhangpp63.cn,IP地址:192.168.1.63)和客户端的配置过程,确保读者能够全面理解并实际应用这些技术。此外,还提供了一些优化建议,以提高服务器的性能和稳定性。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • Jedis接口分类详解与应用指南
    本文详细解析了Jedis接口的分类及其应用指南,重点介绍了字符串数据类型(String)的接口功能。作为Redis中最基本的数据存储形式,字符串类型支持多种操作,如设置、获取和更新键值对等,适用于广泛的应用场景。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 如何在 Node.js 环境中将 CSV 数据转换为标准的 JSON 文件格式? ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
author-avatar
訫梦沁_245
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有