热门标签 | 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文件内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • Git管理工具SourceTree安装与使用指南
    本文详细介绍了Git管理工具SourceTree的安装、配置及团队协作方案,旨在帮助开发者更高效地进行版本控制和项目管理。 ... [详细]
  • 在现代Web应用中,当用户滚动到页面底部时,自动加载更多内容的功能变得越来越普遍。这种无刷新加载技术不仅提升了用户体验,还优化了页面性能。本文将探讨如何实现这一功能,并介绍一些实际应用案例。 ... [详细]
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
  • This pull request introduces the ability to provide comprehensive paragraph configurations directly within the Create Note and Create Paragraph REST endpoints, reducing the need for additional configuration calls. ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
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社区 版权所有