一文详解使用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()));}

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

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

相关文章

linux入门——“僵尸进程、孤儿进程”

引入 在linux中&#xff0c;特别是我们自己写代码时&#xff0c;使用fork&#xff08;&#xff09;创建子进程的时候&#xff0c;需要知道两种特殊的进程——僵尸进程、孤儿进程。这是我们不可忽视的进程的两种特殊情况。 一、僵尸进程 在C语言编程中&#xff0c;僵尸进程的出…

【数据结构 | C++】部落

在一个社区里&#xff0c;每个人都有自己的小圈子&#xff0c;还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里&#xff0c;于是要请你统计一下&#xff0c;在一个给定社区中&#xff0c;到底有多少个互不相交的部落&#xff1f;并且检查任意两个人是否属…

维护在线重做日志(一)

学习目标 解释在线重做日志文件的目的概述在线重做日志文件的结构控制日志开关和检查点多路复用和维护在线重做日志文件使用OMF管理在线重做日志文件获取在线重做日志文件信息 在线重做日志文件提供了在数据库发生故障时重做事务的方法。 每个事务都同步写入重做日志缓冲区&a…

mayo介绍和QTqmake编译基于Opencascade开发的mayo工程-小白配置

目录: 一、mayo介绍:zap: 最新功能&#xff08;截止7.8.2&#xff09;在这里插入图片描述 二、编译准备三、编译过程3.1QT Creator打开源码的pro工程3.2修改几处pro配置3.3复制所需的动态链接库3.4编译完成 一、mayo介绍 1️⃣mayo是一个基于opencascade开源库开发的一个开源CA…

【Github】如何使用Git将本地项目上传到Github

【Github】如何使用Git将本地项目上传到Github 写在最前面1. 注册Github账号2. 安装Git工具配置用户名和邮箱仅为当前项目配置&#xff08;可选&#xff09; 3. 创建Github仓库4. 获取仓库地址5. 本地操作&#xff08;1&#xff09;进入项目文件夹&#xff08;2&#xff09;克隆…

【layui】table的switch、edit修改

<title>简单表格数据</title><div class"layui-card layadmin-header"><div class"layui-breadcrumb" lay-filter"breadcrumb"><a>系统设置</a><a>简单表格数据</a></div> </div>&…

Spring Template

Thymeleaf 入门 Web 开发离不开动态页面的开发&#xff0c;很早以前企业主要使用 JSP 技术来开发网页&#xff0c;随着技术的升级更替&#xff0c;目前来说最主流的方案是&#xff1a;Thymeleaf&#xff0c;Thymeleaf 是一个模板框架&#xff0c;它可以支持多种格式的内容动态…

【大语言模型】ACL2024论文-20 SCIMON:面向新颖性的科学启示机器优化

【大语言模型】ACL2024论文-20 SCIMON&#xff1a;面向新颖性的科学启示机器优化 目录 文章目录 【大语言模型】ACL2024论文-20 SCIMON&#xff1a;面向新颖性的科学启示机器优化目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果推荐阅读指数&#xff1a;★★★★☆ …

HTML实现 扫雷游戏

前言&#xff1a; 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块&#xff08;cube&#xff09;” 游戏&#xff0c;后经改编出现了 “rlogic” 游戏&#xff0c;玩家需为指挥中心探出安全路线避开地雷。在此基础上&#xff0c;开发者汤姆・安德森编写出了扫雷游戏的…

docker镜像源配置、换源、dockerhub国内镜像最新可用加速源(仓库)

一、临时拉取方式 在docker pull后先拼接镜像源域名&#xff0c;后面拼接拉取的镜像名 $ docker pull dockerpull.org/continuumio/miniconda3 二、永久配置方式 vim修改/etc/docker/daemon.json&#xff0c;并重启docker服务。 # 创建目录 sudo mkdir -p /etc/docker# 写…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备如何使用Docker运行?

在当今的安防监控领域&#xff0c;随着视频监控技术的不断发展和应用范围的扩大&#xff0c;如何高效、稳定地管理并分发视频流资源成为了行业内外关注的焦点。EasyNVR作为一款功能强大的多品牌NVR管理工具/设备&#xff0c;凭借其灵活的部署方式和卓越的性能&#xff0c;正在引…

【SKFramework框架】一、框架介绍

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

Python 版本的 2024详细代码

2048游戏的Python实现 概述&#xff1a; 2048是一款流行的单人益智游戏&#xff0c;玩家通过滑动数字瓷砖来合并相同的数字&#xff0c;目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能&#xff0c;包括游戏逻辑、界面绘制和用户交互。 主…

排序算法(选择排序、直接插入排序、冒泡排序、二路归并排序)(C语言版)

对数组进行排序&#xff0c;主要演示选择排序、直接排序、冒泡排序、二路归并排序算法&#xff0c;附上代码演示 一、编写好各类排序方法的函数 &#xff08;1&#xff09; s_sort(int e[],int n):选择排序。 &#xff08;2&#xff09;si_sort(int e[],int n):直接插人排序。…

Unity图形学之Surface Shader结构

1.没有Pass&#xff1a;因为Render Path已经封装好了 Shader "Custom/Test" {Properties{_Color ("Color", Color) (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) "white" {}_Glossiness ("Smoothness", Range(0,1)) 0.5_Meta…

数据集-目标检测系列- 牵牛花 检测数据集 morning_glory >> DataBall

数据集-目标检测系列- 牵牛花 检测数据集 morning DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;git…

摄影:相机控色

摄影&#xff1a;相机控色 白平衡&#xff08;White Balance&#xff09;白平衡的作用&#xff1a; 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡&#xff08;White Balance&#xff09; 人眼看到的白色&#xff1a;会自动适应环境光线。 相…

Odoo :免费且开源的农牧行业ERP管理系统

文 / 开源智造Odoo亚太金牌服务 引言 提供农牧企业数字化、智能化、无人化产品服务及全产业链高度协同的一体化解决方案&#xff0c;提升企业智慧种养、成本领先、产业互联的核心竞争力。 行业典型痛点 一、成本管理粗放&#xff0c;效率低、管控弱 产品研发过程缺少体系化…

oracle查看锁阻塞-谁阻塞了谁

一 模拟锁阻塞 #阻塞1 一个会话正在往一个大表写入大量数据的时候&#xff0c;另一个会话加字段&#xff1a; #会话1 #会话2 会话2被阻塞了。 #阻塞2 模拟一个会话update一条记录&#xff0c;没提交。 另一个会话也update这一条记录&#xff1a; 会话2被阻塞了。 二 简单查…