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

一文详解使用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导出文件的几种情况

情况一&#xff1a;简单的导出指定类型文档&#xff0c;不要求格式 filePath-文件路径// 设置响应头response.setContentType("application/octet-stream");// 字符集处理&#xff0c;确保文件名的正确显示response.setHeader("Content-Disposition","…...

【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 &#x1f4af;前言&#x1f4af;C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 &#x1f4af; std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::sync_with_st…...

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…...

数据科学与SQL:组距分组分析 | 区间分布问题

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言&#xff0c;一个记录对应的指标值的绝对值&#xff0c;肯定落在所有指标值的绝对值的最小值和最大值构成的区间内&#xff0c;根据一定的算法&#x…...

odoo18中模型的常用字段类型

字段的公共属性: Char 字符类型&#xff0c;对应数据库中varchar类型&#xff0c;除了通用类型外接收另外两个参数&#xff1a; size: 字符长度&#xff0c;超出的长度将被截断 trim: 默认True&#xff0c;是否字段值应该被去空白。 Text 文本类型&#xff0c;对应数据库…...

【如何用更少的数据作出更好的决策】-gpt生成

如何用更少的数据作出更好的决策 用更少的数据作出更好的决策是一种能力的体现&#xff0c;需要结合有效的方法、严谨的逻辑以及对问题的深刻理解。以下是一些可以帮助你实现这一目标的策略&#xff1a; 明确目标 在收集和分析数据之前&#xff0c;先明确你的决策目标是什么…...

ara::com 与 AUTOSAR 元模型的关系总结

原文链接&#xff1a;AUTOSAR_EXP_ARAComAPI的7章笔记&#xff08;6&#xff09; 整体说明 先是表明此前解释 ara::com API 思想和机制时未涉及具体 AP 元模型清单部分&#xff0c;本章旨在阐明 ara::com 与相关元模型部分的关系&#xff0c;且是较高层次的基本理解性介绍&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去实现数据绑定&#xff0c;Vue3则改为Proxy&#xff0c;遇到了什么问题&#xff1f; - 在Vue2中不能检测数组和对象的变化 1. 无法检测 对象property 的添加或移除 var vm new Vue({data:{a:1} })// vm.a 是响应式的vm.b 2 // vm.b 是…...

Ansys Maxwell:SheetScan - 导入材料特性曲线

你好&#xff0c; 在这篇博文中&#xff0c;我展示了如何使用 Ansys Maxwell“SheetScan”工具导入材料特性数据集。在这篇博文中&#xff0c;我展示了如何导入复杂磁导率实部数据集以用于涡流&#xff08;频率相关&#xff09;求解器&#xff0c;并以 Ferroxcube 磁芯材料规格…...

解决 Android 单元测试 No tests found for given includes:

问题 报错&#xff1a; Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决&#xff0c;将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…...

人工智能的核心思想-神经网络

神经网络原理 引言 在理解ChatGPT之前&#xff0c;我们需要从神经网络开始&#xff0c;了解最简单的“鹦鹉学舌”是如何实现的。神经网络是人工智能领域的基础&#xff0c;它模仿了人脑神经元的结构和功能&#xff0c;通过学习和训练来解决复杂的任务。本文将详细介绍神经网络…...

JAVA中的Lamda表达式

JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性&#xff0c;用于简化代码&#xff0c;特别是在处理函数式编程时。Lambd…...

锂电池学习笔记(一) 初识锂电池

前言 锂电池近几年一直都是很热门的产品&#xff0c;充放电管理更是学问蛮多&#xff0c;工作生活中难免会碰到&#xff0c;所以说学习锂电池是工程师的必备知识储备&#xff0c;今天学习锂电池的基本知识&#xff0c;分类&#xff0c;优缺点&#xff0c;循序渐进 学习参考 【…...

深度学习2

四、tensor常见操作 1、元素值 1.1、获取元素值 tensor.item() 返回tensor的元素&#xff1b;只能在一个元素值使用&#xff0c;多个报错&#xff0c;当存在多个元素值时需要使用索引进行获取到一个元素值时在使用 item。 1.2、元素值运算 tensor对元素值的运算&#xff1a;…...

第六节-AppScan扫描报告

第六节-AppScan扫描报告 1.加载扫描结果 1.点击【打开】 2.选择之前保存过的扫描结果 3.等待加载完成 2.领导查看的报告 1.点击【报告】 2.模板选择为【缺省值】 3.最低严重性选择为【中】&#xff0c;测试类型选择为【应用程序】 4.点击【布局】 5.选择【其他徽标】&#x…...

【c++丨STL】stack和queue的使用及模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…...

基于SpringBoot的在线教育系统【附源码】

基于SpringBoot的在线教育系统 效果如下&#xff1a; 系统登录页面 系统管理员主页面 课程管理页面 课程分类管理页面 用户主页面 系统主页面 研究背景 随着互联网技术的飞速发展&#xff0c;线上教育已成为现代教育的重要组成部分。在线教育系统以其灵活的学习时间和地点&a…...

Kafka-副本分配策略

一、上下文 《Kafka-创建topic源码》我们大致分析了topic创建的流程&#xff0c;为了保持它的完整性和清晰度。细节并没有展开分析。下面我们就来分析下副本的分配策略以及副本中的leader角色的确定逻辑。当有了副本分配策略&#xff0c;才会得到分区对应的broker&#xff0c;…...

市场波动不断,如何自我提高交易心理韧性?

交易市场&#xff0c;一个由无数变量交织而成的复杂领域&#xff0c;常常因各方因素的微妙变化而掀起波澜。在这里&#xff0c;机遇与挑战并存&#xff0c;诱人的利润与潜在的风险如影随形&#xff0c;共同考验着每一位交易员的智慧与心理承受能力。在这样的环境下&#xff0c;…...

AI Agent在智能风控中的实战:多智能体欺诈检测与预警

AI Agent在智能风控中的实战:多智能体欺诈检测与预警 你有没有过明明是正常交易却被银行冻结账户的糟糕体验?或是听说过某电商平台上线新活动首日就被黑产团伙薅走数千万补贴的新闻?随着黑产欺诈向团伙化、专业化、动态化演进,传统依赖规则引擎、单模型机器学习的风控体系已…...

强化学习在并行机构人形机器人控制中的应用

1. 项目概述在机器人控制领域&#xff0c;强化学习(RL)正逐渐成为解决复杂动力学系统问题的有力工具。然而&#xff0c;当面对具有并行驱动机构的人形机器人时&#xff0c;传统RL训练方法往往面临一个关键挑战&#xff1a;大多数仿真环境无法准确模拟闭环运动链(Closed Kinemat…...

Visual Paradigm 17.0 团队协作新功能实测:手把手教你用项目模板和文件夹管理提效

Visual Paradigm 17.0 团队协作实战指南&#xff1a;从模板配置到文件夹管理的高效工作流在敏捷开发团队中&#xff0c;项目启动速度和资产管理的规范性往往直接影响整体效率。Visual Paradigm 17.0针对这一痛点推出的团队协作增强功能&#xff0c;特别是服务器端项目模板和文件…...

告别道路预测老套路:用ParkPredict+模型思路,解决停车场里的‘鬼探头’难题

破解泊车场景预测困局&#xff1a;ParkPredict模型的技术革新与实践停车场里的每一次转向、倒车和避让&#xff0c;都是对自动驾驶系统预测能力的极限挑战。与开放道路的规则明确不同&#xff0c;这里没有清晰的车道线指引&#xff0c;没有统一的行驶方向&#xff0c;只有随时可…...

【UniApp小程序开发】解决无法使用Vue自定义指令的完美替代方案:权限组件封装

在 UniApp 开发中&#xff0c;你是否遇到过这样的困惑&#xff1a;明明在 Vue Web 项目中用得顺手的 v-permission 自定义指令&#xff0c;一到小程序端就完全失效&#xff1f;本文将深入剖析其原因&#xff0c;并提供一套可直接复用的组件化解决方案&#xff0c;让你在小程序中…...

Python基础语法:生成器 generator(yield)

一、简介根据指定的规则循环生成数据&#xff0c;当条件不成立时则生成数据结束。数据不是一次性全部生成出来&#xff0c;而是使用一个&#xff0c;再生成一个&#xff0c;好处是可以节约大量的内存。就像设计模式中的懒汉式。适合处理大数据或流数。生成器是一种特殊的迭代器…...

光效崩坏?噪点泛滥?色温漂移?——Midjourney专业级光效渲染全流程校准协议,含ACEScg色彩空间适配模板

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;光效崩坏、噪点泛滥与色温漂移的系统性归因诊断 图像采集链路中出现的光效崩坏、噪点泛滥与色温漂移并非孤立现象&#xff0c;而是光学设计、传感器响应、ISP管线调度及环境耦合失配共同作用的结果。三者常呈现…...

毕业设计 yolov11骨折检测医疗辅助系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景2.1 研究背景2.2 国内外研究现状2.3 研究意义 3 设计框架&#xff08;骨折检测系统设计框架说明&#xff09;3.1. 系统架构图3.2. 技术选型3.2.1 核心组件3.2.2 辅助工具 3.3. 核心模块设计3.3.1 YOLO模型训练模块训练流程图关键伪代码…...

解密高校教师必会的Gemini 3.1 Pro五大科研隐藏技能:从论文评估到创新点锁定

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 科研路上,有人发完顶刊顺利晋升,有人还在为创新点抓耳挠腮。 大多数教…...

5个必知的Universal-Updater高级功能:从QR扫描到后台安装

5个必知的Universal-Updater高级功能&#xff1a;从QR扫描到后台安装 【免费下载链接】Universal-Updater An easy to use app for installing and updating 3DS homebrew 项目地址: https://gitcode.com/gh_mirrors/un/Universal-Updater Universal-Updater是一款专为任…...