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

【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】

poi导出excel模板——通过建造者模式+策略模式+函数式接口实现

  • poi导出excel示例
  • 优化思路
  • 代码实现
  • 补充
    • 建造者模式
    • 策略模式

poi导出excel示例

首先我们现看一下poi如何导出excel,这里举个例子:目前想要导出一个Map<sex,List>信息,sex作为一个sheet页,Person信息包含姓名、年龄、籍贯等,在Person下还有一个List属性,里面包含名称、时长等,这里需要通过http的response导出文件

代码如下:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;public class ExcelExportExample {public static void exportToResponse(Map<String, List<Person>> data, HttpServletResponse response) {try {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // 对于.xlsx格式// 或者使用 response.setContentType("application/vnd.ms-excel"); 对于.xls格式response.setHeader("Content-Disposition", "attachment; filename=output.xlsx"); // 文件名可以根据需要修改try (Workbook workbook = new XSSFWorkbook()) { // 或者使用 HSSFWorkbook for .xls 格式for (Map.Entry<String, List<Person>> entry : data.entrySet()) {String sheetName = entry.getKey();List<Person> personList = entry.getValue();Sheet sheet = workbook.createSheet(sheetName);// 创建表头行Row headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("Name");headerRow.createCell(1).setCellValue("Age");headerRow.createCell(2).setCellValue("Hometown");headerRow.createCell(3).setCellValue("Hobby Name");headerRow.createCell(4).setCellValue("Hobby Duration");int rowNum = 1;for (Person person : personList) {Row row = sheet.createRow(rowNum++);// 填充 Person 基本信息Cell nameCell = row.createCell(0);nameCell.setCellValue(person.getName());Cell ageCell = row.createCell(1);ageCell.setCellValue(person.getAge());Cell hometownCell = row.createCell(2);hometownCell.setCellValue(person.getHometown());// 填充 Hobby 列表int hobbyColNum = 3;List<Hobby> hobbies = person.getHobbies();for (Hobby hobby : hobbies) {Cell hobbyNameCell = row.createCell(hobbyColNum++);hobbyNameCell.setCellValue(hobby.getName());Cell hobbyDurationCell = row.createCell(hobbyColNum++);hobbyDurationCell.setCellValue(hobby.getDuration());}}}try (OutputStream out = response.getOutputStream()) {workbook.write(out);} catch (IOException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {// 创建一个示例的 Map,每个 key 对应一个工作表(sheet)// 实际数据应根据业务需求和数据源进行设置// 示例中只包含了一个性别和一个 Person,你需要填充实际数据Map<String, List<Person>> data = createSampleData();// 获取 HttpServletResponse 对象并将数据导出到响应HttpServletResponse response = getHttpServletResponse(); // 你需要自行实现获取 HttpServletResponse 对象的方式exportToResponse(data, response);}

优化思路

代码中,可以看到创建工作簿、设置表头行、设置数据等操作都集中在一起,耦合性较高。如果后面再增加设置样式、设置不同类型单元格的样式,会全部集中到对workbook的操作上,而workbook又在开始时就创建了。
如果将workbook的创建于数据填充进行解耦。并且将创建工作簿、设置表头行、设置数据等操作作为一个公有方法抽取出来,可以供其他导出excel的业务进行使用。形成一个导出excel的公有类。
可以使用建造者模式+策略模式进行设计

代码实现

这里代码通过贴图方式介绍😂😂😂
在这里插入图片描述
首先介绍一下包,这里的样式形成一个策略接口,并且有一个默认实现,在strategy包下。然后是templete包,这里是存放具体业务的模板(比如有表头文字、属性映射等等),包含具体样式实现。
然后是一个建造器,用来构建workbook,这也是主要代码。所有代码放到了一个xssf包下,这里用到了excel2007的.xlsx格式的,其实也可以增加excel97的.xls格式。

建造器代码如下:

  1. 首先是workbook,因为在构造方法是需要传入这个workbook,并且是不可变对象,所以设置为final。
  2. 然后是将单元格样式设置为默认样式
  3. 下面就是对不同操作的方法抽取,分别有:创建sheet,设置样式,设置表头、设置数据等,当然,也可以扩展,比如设置列宽,行高这些内容。
  4. 在创建sheet中,使用到了setActiveSheet方法,这个让sheet创建后置为活动,以后就对这个shee进行操作,适合多sheet的表格文件。同时,在后面的操作中也能获取到当前操作的sheet。
    在这里插入图片描述
  5. 设置data这里,因为不同业务的数据格式、操作是不同的,因此没有通过参数方式直接传入数据,而是提供了函数式接口,让其在调用时能对当前这个sheet进行操作,从而设置数据。同时也可以设置样式。

样式策略接口代码如下:
这里只提供了列头样式和内容样式两个接口,其实可以进行扩展,比如指定sheet样式、行高、列宽等,可以将这些功能都抽取出来,用了修饰最终的workbook。
在这里插入图片描述
默认的样式策略实现如下:这里较为简单,就不做过多赘述。
在这里插入图片描述
具体使用
在这里插入图片描述
使用就比较简单了,只需要创建出建造器,我这里是有不同的sheet,传入了不同的值。然后填充列头,数据即可。
在这里插入图片描述
最后通过网络流导出,使用try-resource释放流。

补充

建造者模式

建造者模式是一种创建型设计模式,它用于构建复杂对象,将对象的构建步骤解耦并提供更好的控制和可读性。这种模式通常适用于需要创建具有多个可选参数或配置选项的对象,以确保对象构建过程灵活且易于理解。
举例就是springboot的启动的创建,典型的示例是 SpringApplicationBuilder 类,它用于创建 Spring Boot 应用程序的构建器

public class MySpringBootApp {public static void main(String[] args) {new SpringApplicationBuilder().sources(MySpringBootApp.class).bannerMode(Banner.Mode.CONSOLE).run(args);}
}

这样的创建型设计模式通常和行为型设计模式进行结合使用。

策略模式

策略模式是一种行为设计模式,它允许在运行时选择算法或行为的不同实现。这种模式定义了一组算法,将它们封装成独立的策略对象,并使它们可以互相替换。策略模式有助于使算法的选择独立于使用它们的客户端。
举个例子
Spring Boot 源码中广泛使用了策略模式,尤其在处理各种配置和扩展点时。一个典型的例子是 Spring Boot 的属性处理,其中使用了多种策略来解析配置属性。

Spring Boot 中的属性解析机制是通过 org.springframework.boot.context.properties.ConfigurationProperties 注解来实现的,它支持不同的属性源(如 application.properties、application.yml、环境变量等)和不同的解析策略。

@ConfigurationProperties("myapp")
public class MyProperties {private String property1;private int property2;// 省略 getter 和 setter// 配置属性解析策略@ConfigurationPropertiesBindingpublic static class MyPropertiesConverter implements Converter<String, MyProperties> {@Overridepublic MyProperties convert(String source) {// 解析配置属性并返回 MyProperties 对象// 这里可以根据不同的解析策略来处理属性的转换}}
}

在上述示例中,我们使用了 @ConfigurationProperties 注解来声明要处理的属性前缀(myapp),并定义了一个内部的属性解析策略类 MyPropertiesConverter,它实现了 Converter<String, MyProperties> 接口。

Spring Boot 的属性绑定机制将根据不同的属性源(例如 application.properties 文件或环境变量)自动选择相应的属性解析策略(例如 MyPropertiesConverter),并将属性值解析为 MyProperties 对象。

相关文章:

【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】

poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel&#xff0c;这里举个例子&#xff1a;目前想要导出一个Map<sex,List>信息&#xff0c;sex作为…...

自适应模糊PID控制器在热交换器温度控制中的应用

热交换器是一种常见的热能传递设备&#xff0c;广泛应用于各个工业领域。对热交换器温度进行有效控制具有重要意义&#xff0c;可以提高能源利用效率和产品质量。然而&#xff0c;受到热传导特性和外部环境变化等因素的影响&#xff0c;热交换器温度控制难度较大。本文提出一种…...

【系统救援】 Ubuntu重启失败,报错:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY

问题定位及处理 查看错误信息&#xff1a;/dev/sda3 contains a file system with errors, check forced. /dev/sda3: Inodes that were part of a corrupted orphan linked list found. /dev/sda3: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY. (i.e., without -a or -p o…...

【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…...

第九章 排序【数据结构】【精致版】

第九章 排序【数据结构】【精致版】 前言版权第九章 排序9.1 概述9.2 插入类排序9.2.1 直接插入排序**1-直接插入排序.c** 9.2.2 折半插入排序**2-折半插入排序.c** 9.2.3 希尔排序 9.3 交换类排序9.3.1冒泡排序**4-冒泡排序.c** 9.3.2 快速排序**5-快速排序.c** 9.4 选择类排…...

基于element-plus定义表格行内编辑配置化

文章目录 前言一、新增table组件二、使用步骤 前言 在 基于element-plus定义表单配置化 基础上&#xff0c;封装个Element-plus的table表格 由于表格不同于form组件&#xff0c;需自定义校验器&#xff0c;以下组件配置了单个校验&#xff0c;及提交统一校验方法&#xff0c;且…...

WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo

一、理解Three.js Three.js是一个用于WebGL渲染的JavaScript库。它提供了一组工具和类&#xff0c;用于创建和渲染3D图形和动画。简单理解&#xff08;并不十分准确&#xff09;&#xff0c;Three.js之于WebGL&#xff0c;好比&#xff0c;jQuery.js之于JavaScript。 OpenGL …...

2022年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有n个按名称排序的商品,使用对分查找法搜索任何一商品,最多查找次数为5次,则n的值可能为?()(2分) A.5 B.15 C.30 D.35 答案:C 答案解析:对分查找最多查找次数m与个数之间n的…...

确定性 vs 非确定性:GPT 时代的新编程范式

分享嘉宾 | 王咏刚 责编 | 梦依丹 出品 | 《新程序员》编辑部 在 ChatGPT 所引爆的新一轮编程革命中&#xff0c;自然语言取代编程语言&#xff0c;在只需编写提示词/拍照就能出程序的时代&#xff0c;未来程序员真的会被简化为提示词的编写员吗&#xff1f;通过提示词操纵 …...

【Linux奇遇记】我和Linux的初次相遇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:Linux奇遇记系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 前端和后端的介绍 1.前端 2.后端 3.前后端区别 Linux在前后端开发中的角色 如何学习Linux 去进行程序开发 Linux的常见根目…...

剪贴板劫持--PasteJacker的使用

启动 PasteJacker [1] Windows [2] Linux [3] Exit第一次是让我们选择要攻击针对的目标系统&#xff0c;这里以Windows系统为例&#xff0c;即我自己的物理机 因此键入 1 &#xff0c;回车 [1] Download and execute a msfvenom backdoor using certutil (Web delivery Past…...

说一下vue2的响应式原理?

vue2采用数据代理数据劫持发布订阅模式的方法。 在初始化vue实例时&#xff0c;会把data对象和data对象的属性都添加到vm对象中&#xff0c;通过object.defineProperty()进行数据代理&#xff0c;用vm对象的属性来代理data对象的属性&#xff0c;并在Observer类中递归遍历data…...

如何使用CORS和CSP保护前端应用程序安全

前端应用在提供无缝用户体验方面起着核心作用。在当今互联网的环境中&#xff0c;第三方集成和API的普及使得确保强大的安全性至关重要。安全漏洞可能导致数据盗窃、未经授权访问以及品牌声誉受损。本文将向您展示如何使用CORS和CSP为您的网页增加安全性。 嗨&#xff0c;大家好…...

C/C++输出硬币翻转 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C硬币翻转 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C硬币翻转 2021年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 假设有N个硬币(N为不大于5000的正整数)&#xff0c;从1…...

ipad可能会在iOS 16中失去智能家居中心功能

在iOS 16测试版代码中发现的文本表明苹果将放弃对iPad家庭中心的支持 家庭app迎来重大改版&#xff0c;未来更将对智能家居互联互通标准Matter提供支持。 即使某一款智能家居设备再优秀&#xff0c;只要它没有接入HomeKit&#xff0c;那么就不能在苹果的家庭app中直接管理控制。…...

maven打包可运行jar

普通java程序 <build><finalName>JavaDeviceClient</finalName><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><…...

Arcgis连接Postgis数据库(Postgre入门十)

效果 步骤 1、矢量数据首先有在postgis数据库中 这个postgis数据库中的一个空间数据&#xff0c;数据库名称是test3&#xff0c;数据表名称是test 2、Arcgis中连接postgis数据库中 3、成功连接 可以将数据拷贝或导入到gdb数据库中...

【蓝桥杯选拔赛真题17】C++时间换算 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++时间换算 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <...

【腾讯云 HAI域探秘】探索AI绘画之路:利用腾讯云HAI服务打造智能画家

目录 前言1 使用HAI服务作画的步骤1.1 注册腾讯云账户1.2 创建算力服务器1.3 进入模型管理界面1.4 汉化界面1.5 探索AI绘画 2 模型参数的含义和调整建议2.1 模型参数的含义和示例2.2 模型参数的调整建议 3 调整参数作画的实践和效果3.1 实践说明3.2 实践效果13.3 实践效果23.4 …...

安卓常见设计模式10------责任链模式(Kotlin版)

1. W1 是什么&#xff0c;什么是责任链模式&#xff1f;​ 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于将请求的发送者和接收者解耦&#xff0c;并将请求沿着一个处理链进行传递&#xff0c;直到有一个处理者能…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...