推荐做幻灯片搜图网站/seo软件工具

推荐做幻灯片搜图网站,seo软件工具,lumen 做企业网站,网站模板下载工具Excel 多 Sheet 导入导出功能完整实现指南 一、环境依赖 1. Maven 依赖 <!-- EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version> </dependency>…

Excel 多 Sheet 导入导出功能完整实现指南


一、环境依赖
1. Maven 依赖
<!-- EasyExcel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency><!-- Spring Boot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、核心工具类封装
1. Excel 导出工具类
public class ExcelExportUtils {/*** 动态导出多 Sheet Excel(无需模板)* @param sheetDataMap key: Sheet名称, value: 数据列表(需保证列表元素类型一致)*/public static void exportDynamicMultiSheet(Map<String, List<Object>> sheetDataMap,String filename,HttpServletResponse response) throws IOException {// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build()) {WriteCellStyle headerStyle = createHeaderStyle();for (Map.Entry<String, List<Object>> entry : sheetDataMap.entrySet()) {String sheetName = entry.getKey();List<Object> dataList = entry.getValue();if (CollectionUtils.isEmpty(dataList)) {throw new IllegalArgumentException("Sheet [" + sheetName + "] 数据不能为空");}Class<?> dtoClass = dataList.get(0).getClass();WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).head(dtoClass).headStyle(headerStyle).build();excelWriter.write(dataList, writeSheet);}}}private static WriteCellStyle createHeaderStyle() {WriteCellStyle style = new WriteCellStyle();style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());style.setHorizontalAlignment(HorizontalAlignment.CENTER);WriteFont font = new WriteFont();font.setBold(true);font.setFontHeightInPoints((short) 12);style.setWriteFont(font);return style;}
}
2. Excel 导入工具类
public class ExcelImportUtils {/*** 导入多 Sheet Excel* @param file      上传的文件* @param sheetMap  key: Sheet名称, value: 该Sheet对应的DTO类*/public static Map<String, List<?>> importMultiSheet(MultipartFile file,Map<String, Class<?>> sheetMap) throws IOException {Map<String, List<?>> resultMap = new LinkedHashMap<>();try (ExcelReader excelReader = EasyExcel.read(file.getInputStream()).build()) {for (Map.Entry<String, Class<?>> entry : sheetMap.entrySet()) {String sheetName = entry.getKey();Class<?> dtoClass = entry.getValue();GenericSheetListener<Object> listener = new GenericSheetListener<>();ReadSheet readSheet = EasyExcel.readSheet(sheetName).head(dtoClass).registerReadListener(listener).build();excelReader.read(readSheet);resultMap.put(sheetName, listener.getDataList());}}return resultMap;}/** 通用数据监听器 */private static class GenericSheetListener<T> implements ReadListener<T> {private final List<T> dataList = new ArrayList<>();@Overridepublic void invoke(T data, AnalysisContext context) {dataList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 可添加日志或后处理逻辑}public List<T> getDataList() {return dataList;}}
}

三、DTO 类定义
1. 用户信息 DTO(对应 Sheet1)
public class UserDTO {@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄", index = 1)private Integer age;// 必须有无参构造方法public UserDTO() {}// Getters & Setters
}
2. 产品信息 DTO(对应 Sheet2)
public class ProductDTO {@ExcelProperty(value = "产品ID", index = 0)private Long id;@ExcelProperty(value = "产品名称", index = 1)private String name;// 必须有无参构造方法public ProductDTO() {}// Getters & Setters
}

四、Service 层实现
@Service
public class ExcelService {/*** 导出 Excel*/public void exportExcel(HttpServletResponse response) {Map<String, List<Object>> sheetDataMap = new LinkedHashMap<>();// Sheet1: 用户数据List<Object> users = Arrays.asList(new UserDTO("张三", 25),new UserDTO("李四", 30));sheetDataMap.put("用户信息", users);// Sheet2: 产品数据List<Object> products = Arrays.asList(new ProductDTO(1L, "笔记本电脑"),new ProductDTO(2L, "智能手机"));sheetDataMap.put("产品信息", products);// 调用工具类ExcelExportUtils.exportDynamicMultiSheet(sheetDataMap, "export_data.xlsx", response);}/*** 导入 Excel*/public void importExcel(MultipartFile file) {// 定义 Sheet 映射关系Map<String, Class<?>> sheetMap = new LinkedHashMap<>();sheetMap.put("用户信息", UserDTO.class);sheetMap.put("产品信息", ProductDTO.class);// 解析数据Map<String, List<?>> dataMap = ExcelImportUtils.importMultiSheet(file, sheetMap);// 处理业务逻辑List<UserDTO> users = (List<UserDTO>) dataMap.get("用户信息");List<ProductDTO> products = (List<ProductDTO>) dataMap.get("产品信息");// 保存到数据库...}
}

五、Controller 层实现
@RestController
@RequestMapping("/api/excel")
public class ExcelController {@Autowiredprivate ExcelService excelService;/*** 导出 Excel*/@GetMapping("/export")public void exportExcel(HttpServletResponse response) {excelService.exportExcel(response);}/*** 导入 Excel*/@PostMapping("/import")public ResponseEntity<String> importExcel(@RequestParam("file") MultipartFile file) {try {excelService.importExcel(file);return ResponseEntity.ok("文件导入成功");} catch (Exception e) {return ResponseEntity.status(500).body("导入失败: " + e.getMessage());}}
}

六、关键概念解释
1. 监听器(ReadListener
  • 作用
    在 Excel 导入过程中,逐行读取数据并处理,避免一次性加载全量数据到内存。
  • 核心方法
    • invoke(T data, AnalysisContext context):每读取一行数据时触发。
    • doAfterAllAnalysed(AnalysisContext context):当前 Sheet 解析完成后触发。
  • 使用场景
    • 数据收集(存储到 List)。
    • 数据校验(如字段非空检查)。
    • 批量插入数据库(累积一定数量后批量操作)。
2. @ExcelProperty 注解
  • 功能:定义 Java 字段与 Excel 列的映射关系。
  • 参数
    • value:对应 Excel 列名。
    • index:指定列位置(从 0 开始)。
  • 示例
    @ExcelProperty(value = "姓名", index = 0)
    private String name;
    
3. 样式配置(WriteCellStyle
  • 用途:控制单元格样式(如字体、颜色、对齐方式)。
  • 常用配置项
    • setFillForegroundColor: 背景色。
    • setHorizontalAlignment: 水平对齐。
    • setWriteFont: 字体配置(加粗、字号)。

七、常见问题
1. 类型转换异常
  • 表现ClassCastException
  • 原因:DTO 类字段类型与 Excel 单元格数据类型不匹配。
  • 解决:使用 @DateTimeFormat 或自定义转换器。
2. 表头不匹配
  • 表现:数据未正确映射到字段。
  • 原因@ExcelPropertyvalueindex 配置错误。
  • 解决:检查 DTO 类注解与 Excel 列名是否一致。
3. 内存溢出
  • 表现:大文件解析时内存占用过高。
  • 解决:确保使用监听器模式,避免一次性加载全部数据。

八、扩展功能
1. 自定义数据转换器
public class CustomConverter implements Converter<LocalDate> {@Overridepublic LocalDate convertToJavaData(ReadConverterContext<?> context) {return LocalDate.parse(context.getReadCellData().getStringValue(), DateTimeFormatter.ISO_DATE);}
}// 注册转换器
EasyExcel.read(inputStream).registerConverter(new CustomConverter()).build();
2. 复杂表头合并
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").head(Collections.singletonList(Arrays.asList("主标题", "子标题1", "子标题2"))).build();

九、总结

通过本方案可实现:

  • 动态导出:无需模板,根据 DTO 类自动生成表头。
  • 高效导入:逐行解析,内存占用低。
  • 类型安全:通过泛型和注解保证数据一致性。
  • 灵活扩展:支持自定义样式、转换器、校验逻辑。

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

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

相关文章

全流程剖析需求开发:打造极致贴合用户的产品

全流程剖析需求开发&#xff1a;打造极致贴合用户的产品 一、需求获取&#xff08;一&#xff09;与用户沟通1.面谈2.问卷调查3.会议讨论 &#xff08;二&#xff09;观察用户工作&#xff08;三&#xff09;收集现有文档 二、需求分析&#xff08;一&#xff09;提炼关键需求&…

SQL语句及其应用(中)(DQL语句之单表查询)

SQL语句的定义: 概述: 全称叫 Structured Query Language, 结构化查询语言, 主要是实现 用户(程序员) 和 数据库软件(例如: MySQL, Oracle)之间交互用的. 分类: DDL: 数据定义语言, 主要是操作 数据库, 数据表, 字段, 进行: 增删改查(CURD) 涉及到的关键字: create, drop, …

5000元组装一台本地运行中、小模型主机,参考配置 (运行DeepSeek、Qwen)

5000元组装一台本地运行中、小模型主机&#xff0c;参考配置 &#xff08;运行DeepSeek、Qwen) 5000元中、小模型主机 DeepSeek、Qwen 各精度模型推荐启动方式 模型名称 参数量 精度 模型大小 推荐运行模式 DeepSeek R1 7b Q4 5 GB LM Studio纯GPU 14b Q4 9 GB LM…

【新手初学】SQL注入getshell

一、引入 木马介绍&#xff1a; 木马其实就是一段程序&#xff0c;这个程序运行到目标主机上时&#xff0c;主要可以对目标进行远程控制、盗取信息等功能&#xff0c;一般不会破坏目标主机&#xff0c;当然&#xff0c;这也看黑客是否想要搞破坏。 木马类型&#xff1a; 按照功…

Containerd+Kubernetes搭建k8s集群

虚拟机环境设置&#xff0c;如果不是虚拟机可以忽略不看 1、安装配置containerd 1.1 添加 Kubernetes 官方仓库 安装cri-tools的时候需要用到 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kub…

应用待机分组管控是啥

1. 应用待机群组是啥&#xff1f; Android 9 引入了一个新功能&#xff0c;叫应用待机群组。简单来说&#xff0c;就是根据你最近使用应用的频率和时间&#xff0c;系统会把应用分成不同的“群组”。每个群组的应用能用的系统资源不一样&#xff0c;比如后台任务、闹钟、网络请…

C/C++后端开发面经

字节跳动 客户端开发 实习 一面(50min) 自我介绍是否愿意转语言,是否只愿意搞后端选一个项目来详细谈谈HTTP和HTTPS有什么区别?谈一下HTTPS加密的具体过程&#xff1a; 非对称加密 对称加密 证书认证的方式 非对称加密是为了保证对称密钥的安全性。 对称…

【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程(持续更新)

【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路&#xff08;持续更新&#xff09; 写在前面&#xff1a; 1、A题、C题将会持续更新&#xff0c;陆续更新发布文章 2、赛题交流咨询Q群&#xff1a;1037590285 3、全家桶依旧包含&#xff1a; 代码、…

如何让 history 记录命令执行时间?Linux/macOS 终端时间戳设置指南

引言:你真的会用 history 吗? 有没有遇到过这样的情况:你想回顾某个重要命令的执行记录,却发现 history 只列出了命令序号和内容,根本没有时间戳?这在运维排查、故障分析、甚至审计时都会带来极大的不便。 想象一下,你在服务器上误删了某个文件,但不知道具体是几点执…

CI/CD-Jenkins安装与应用

CI/CD-Jenkins安装与应用 Docker安装Jenkins docker-compose.yaml version: "3.8" # # 自定义网络配置 # networks:cicd:driver: bridgeservices:jenkins:# 尽量使用新版本的Jenkins, 低版本的Jenkins的有些插件使用不了# jenkins/jenkins:lts-jdk17是长期支持版…

验证Linux多进程时间片切换的程序

​​ 一、软件需求 在同时运行多个CPU密集型进程时&#xff0c;需采集以下统计信息&#xff1a; 当前运行在逻辑CPU上的进程ID每个进程的运行进度百分比 实验程序设计要求&#xff1a; 1. 命令行参数 参数说明示例值n并发进程数量3total总运行时长&#xff08;毫秒&…

IvorySQL:兼容Oracle数据库的开源PostgreSQL

今天给大家介绍一款基于 PostgreSQL 开发、兼容 Oracle 数据库的国产开源关系型数据库管理系统&#xff1a;IvorySQL。 IvorySQL 由商瀚高软件提供支持&#xff0c;主要的功能特性包括&#xff1a; 完全兼容 PostgreSQL&#xff1a;IvorySQL 基于 PostgreSQL 内核开发&#xf…

QT音乐播放器(1):数据库保存歌曲

实现功能&#xff1a;用数据库保存本地导入和在线搜索的歌曲记录 目录 一. 保存本地添加的歌曲 1. 使用QSettings &#xff08;1&#xff09;在构造函数中&#xff0c;创建对象。 &#xff08;2&#xff09;在导入音乐槽函数中&#xff0c;保存新添加的文件路径&#xff0c…

Spring AI MCP 架构详解

Spring AI MCP 架构详解 1.什么是MCP? MCP 是一种开放协议&#xff0c;它对应用程序向大语言模型&#xff08;LLMs&#xff09;提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种…

数据结构(并查集,图)

并查集 练习版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//长分支改为相同节点int FindRoot(int x){}bool InSet(int x1, int x2)…

数据结构:探秘AVL树

本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式&#xff1a;左单旋&#xff0c;右单旋&#xff0c;左右双旋&#xff0c;右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…

电源系统的热设计与热管理--以反激式充电器为例

前言 反激电源常用于各种电子设备中&#xff0c;比如充电器、适配器等&#xff0c;它们通过变压器进行能量转换。高温环境可能对电子元件造成影响&#xff0c;特别是像MOSFET、二极管、变压器这样的关键部件&#xff0c;导致效率变低&#xff0c;甚至可能导致功能失效。还有安…

linux课程学习二——缓存

一.文件io与标准io的一个区别 遇到死循环可以ctrl c结束进程 使用printf输出&#xff0c;输出没有问题 用wirte输出&#xff0c;参数1&#xff0c;可以理解为上面介绍的linux标准文件描述符的1&#xff08;STDOUT&#xff09;标准输出&#xff0c;我们加上一个死循环while&…

Kafka中的消息如何分配给不同的消费者?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的消息如何分配给不同的消费者&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的消息如何分配给不同的消费者&#xff1f; 在 Kafka 中&#xff0c;消息是通过 主题&#xff08;Topic&#xff09; 进行组织的&…

stock-pandas,一个易用的talib的替代开源库。

原创内容第841篇&#xff0c;专注智能量化投资、个人成长与财富自由。 介绍一个ta-lib的平替——我们来实现一下&#xff0c;最高价突破布林带上轨&#xff0c;和最低价突破布林带下轨的可视化效果&#xff1a; cross_up_upper stock[high].copy()# cross_up_upper 最高价突破…