一文详解使用java easyexcel导出文件的几种情况
情况一:简单的导出指定类型文档,不要求格式
filePath-文件路径// 设置响应头response.setContentType("application/octet-stream");// 字符集处理,确保文件名的正确显示response.setHeader("Content-Disposition","attachment;filename=" + new String(filename.getBytes()));// 读取文件内容并写入到响应输出流中Path filePath = Paths.get(filePath);try {Files.copy(filePath, response.getOutputStream());} catch (IOException e) {throw new BizException("文件导出失败");}
情况二:将各种命令格式(混乱)的数据导入到excel,这种情况需要注意视觉效果
为避免所有数据输出到一行,可新建一个集合,每一行放入一个新的List
List<String> row = new ArrayList<>();row.add(s); // 将每一行放入一个新的 List 中coms.add(row);
如果你输出的数据呈块状,这一块是输入这个命令,下边又是属于另外的命令,就考虑分隔开了,这里加了换行符
if (execCom.contains("\n")) {String[] split = execCom.split("\n");for (String s : split) {List<String> row = new ArrayList<>();row.add(s); // 将每一行放入一个新的 List 中coms.add(row);}}coms.add(Collections.singletonList("\n"));//用于不同命令之间的分隔coms.add(Collections.singletonList("\n"));
输出的时候可指定sheet,定义本列格式
try {EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//列宽度自适应.sheet("sheet1").doWrite(coms);} catch (Exception e) {log.info("文件导出失败: {}", e.getMessage());throw new BizException("文件导出失败。");}
情况三:将指定数据按类型导出到一个excel文件的不同的sheet,这里一个类型可能包含多个不同的物品,每个物品都有对应的信息
1)准备数据
将数据按类型保存到集合,再写入文件,这里注意同一类型的数据保存同一个物品的所有信息,不然达不到效果
Map<String, Map<String, List<List<String>>>> data = new HashMap<>();if (CollectionUtils.isNotEmpty(list)) {Map<String,List<YourClass>> map = list.stream().collect(Collectors.groupingBy(YourClass::getType));map.forEach((k,v)->{Map<String, List<List<String>>> deData = new HashMap<>();for (YourClass de : v) {List<InfoVo> infoVoList = previewTemplate(de.getId());List<List<String>> coms = new ArrayList<>();infoVoList.forEach(template -> {String execCom = template.getExecCommand();if (execCom.contains("\n")) {String[] split = execCom.split("\n");for (String s : split) {List<String> row = new ArrayList<>();row.add(s); // 将每一行放入一个新的 List 中coms.add(row);}}coms.add(Collections.singletonList("\n"));coms.add(Collections.singletonList("\n"));deData.put(de.getType(), coms);});}data.put(k, deData);});}
2)创建对象
ExcelWriter writer = EasyExcel.write(outputStream).build();//可用于导出大量数据,效率高
3)遍历角色数据
// 遍历每个角色的数据for (Map.Entry<String, Map<String, List<List<String>>>> roleEntry : roleDeviceData.entrySet()) {String role = roleEntry.getKey();Map<String, List<List<String>>> devices = roleEntry.getValue();// 创建一个新的Sheet页WriteSheet writeSheet = EasyExcel.writerSheet(role).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();// 准备要写入的数据List<List<String>> dataToWrite = new ArrayList<>();int maxRowCount = devices.values().stream().mapToInt(List::size).max().orElse(0);for (int i = 0; i < maxRowCount; i++) {List<String> row = new ArrayList<>();for (List<List<String>> deviceData : devices.values()) {if (i < deviceData.size()) {row.addAll(deviceData.get(i));} else {row.add("\n"); // 如果当前行没有数据,填充空字符串}}dataToWrite.add(row);}
4)写入数据
try {writer.write(dataToWrite,writeSheet);} catch (Exception e) {log.info("写入数据到Sheet页 {}", e.getMessage());}
5)导出文件,关闭输出流
writer.finish();try {outputStream.flush();outputStream.close();} catch (IOException e) {throw new RuntimeException(e);}
情况四:导出数据到指定格式文件(比如上边是不分列的文字,中间是标题,下边是对应数据格式)
此时可通过定义不同集合再合并的形式达到效果。
// 创建一个List集合来存储前几行备注信息List<String> headList = new ArrayList<>();headList.add("#以“#”开头的行是注释行。");
List<List<String>> headRow = new ArrayList<>();// 写入数据到Excelfor (String line : headList) {headRow.add(Arrays.asList(line));}
//创建标题行集合
List<List<String>> titleRow = new ArrayList<>();titleRow.add(Arrays.asList("#*名称",“对象”,“类型”));
//定义数据集合
List<List<String>> dataRow = new ArrayList<>();
并存放相应数据,可在数据遍历时定义一维集合达到分行目的
集合合并
//集合合并
List<List<String>> all = new ArrayList<>();all.addAll(headRow);all.addAll(titleRow);all.addAll(dataRow);
try {//写出数据到浏览器端EasyExcel.write(response.getOutputStream()).sheet("sheet1").doWrite(all);} catch (Exception e) {throw new BizException(String.format("sheet1:%s", e.getMessage()));}
相关文章:
一文详解使用java easyexcel导出文件的几种情况
情况一:简单的导出指定类型文档,不要求格式 filePath-文件路径// 设置响应头response.setContentType("application/octet-stream");// 字符集处理,确保文件名的正确显示response.setHeader("Content-Disposition","…...
【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)
博客主页: [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 💯前言💯C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 💯 std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::sync_with_st…...
NUXT3学习日记四(路由中间件、导航守卫)
前言 在 Nuxt 3 中,中间件(Middleware)是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑,像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用,也可以只在特定页…...
数据科学与SQL:组距分组分析 | 区间分布问题
目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言,一个记录对应的指标值的绝对值,肯定落在所有指标值的绝对值的最小值和最大值构成的区间内,根据一定的算法&#x…...
odoo18中模型的常用字段类型
字段的公共属性: Char 字符类型,对应数据库中varchar类型,除了通用类型外接收另外两个参数: size: 字符长度,超出的长度将被截断 trim: 默认True,是否字段值应该被去空白。 Text 文本类型,对应数据库…...
【如何用更少的数据作出更好的决策】-gpt生成
如何用更少的数据作出更好的决策 用更少的数据作出更好的决策是一种能力的体现,需要结合有效的方法、严谨的逻辑以及对问题的深刻理解。以下是一些可以帮助你实现这一目标的策略: 明确目标 在收集和分析数据之前,先明确你的决策目标是什么…...
ara::com 与 AUTOSAR 元模型的关系总结
原文链接:AUTOSAR_EXP_ARAComAPI的7章笔记(6) 整体说明 先是表明此前解释 ara::com API 思想和机制时未涉及具体 AP 元模型清单部分,本章旨在阐明 ara::com 与相关元模型部分的关系,且是较高层次的基本理解性介绍&am…...
springboot整合hive
springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…...
浅谈 proxy
应用场景 Vue2采用的defineProperty去实现数据绑定,Vue3则改为Proxy,遇到了什么问题? - 在Vue2中不能检测数组和对象的变化 1. 无法检测 对象property 的添加或移除 var vm new Vue({data:{a:1} })// vm.a 是响应式的vm.b 2 // vm.b 是…...
Ansys Maxwell:SheetScan - 导入材料特性曲线
你好, 在这篇博文中,我展示了如何使用 Ansys Maxwell“SheetScan”工具导入材料特性数据集。在这篇博文中,我展示了如何导入复杂磁导率实部数据集以用于涡流(频率相关)求解器,并以 Ferroxcube 磁芯材料规格…...
解决 Android 单元测试 No tests found for given includes:
问题 报错: Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决,将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…...
人工智能的核心思想-神经网络
神经网络原理 引言 在理解ChatGPT之前,我们需要从神经网络开始,了解最简单的“鹦鹉学舌”是如何实现的。神经网络是人工智能领域的基础,它模仿了人脑神经元的结构和功能,通过学习和训练来解决复杂的任务。本文将详细介绍神经网络…...
JAVA中的Lamda表达式
JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性,用于简化代码,特别是在处理函数式编程时。Lambd…...
锂电池学习笔记(一) 初识锂电池
前言 锂电池近几年一直都是很热门的产品,充放电管理更是学问蛮多,工作生活中难免会碰到,所以说学习锂电池是工程师的必备知识储备,今天学习锂电池的基本知识,分类,优缺点,循序渐进 学习参考 【…...
深度学习2
四、tensor常见操作 1、元素值 1.1、获取元素值 tensor.item() 返回tensor的元素;只能在一个元素值使用,多个报错,当存在多个元素值时需要使用索引进行获取到一个元素值时在使用 item。 1.2、元素值运算 tensor对元素值的运算:…...
第六节-AppScan扫描报告
第六节-AppScan扫描报告 1.加载扫描结果 1.点击【打开】 2.选择之前保存过的扫描结果 3.等待加载完成 2.领导查看的报告 1.点击【报告】 2.模板选择为【缺省值】 3.最低严重性选择为【中】,测试类型选择为【应用程序】 4.点击【布局】 5.选择【其他徽标】&#x…...
【c++丨STL】stack和queue的使用及模拟实现
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…...
基于SpringBoot的在线教育系统【附源码】
基于SpringBoot的在线教育系统 效果如下: 系统登录页面 系统管理员主页面 课程管理页面 课程分类管理页面 用户主页面 系统主页面 研究背景 随着互联网技术的飞速发展,线上教育已成为现代教育的重要组成部分。在线教育系统以其灵活的学习时间和地点&a…...
Kafka-副本分配策略
一、上下文 《Kafka-创建topic源码》我们大致分析了topic创建的流程,为了保持它的完整性和清晰度。细节并没有展开分析。下面我们就来分析下副本的分配策略以及副本中的leader角色的确定逻辑。当有了副本分配策略,才会得到分区对应的broker,…...
市场波动不断,如何自我提高交易心理韧性?
交易市场,一个由无数变量交织而成的复杂领域,常常因各方因素的微妙变化而掀起波澜。在这里,机遇与挑战并存,诱人的利润与潜在的风险如影随形,共同考验着每一位交易员的智慧与心理承受能力。在这样的环境下,…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
