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

使用htool工具导出和导入Excel表

htool官网
代码中用到的hool包里面的excel工具ExcelUtil

1. 引入依赖

    <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency><!-- 操作office文件 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.4.0</version></dependency></dependencies>

2. 导出excel

// adminList就是从数据库查询到的数据
private void writeExcel(HttpServletResponse response,List<Admin> adminList) throws Exception {// 1. 构建writer对象ExcelWriter writer = ExcelUtil.getWriter(true);	// 参数true,是否为xlsx格式// 2. 设置表头,第一个参数是实体类的属性名,第二个参数是excel文件中要呈现的列名writer.addHeaderAlias("username", "用户名");writer.addHeaderAlias("name", "姓名");writer.addHeaderAlias("phone", "手机号");writer.addHeaderAlias("email", "邮箱");// 在写excel文件时只写上面设置了别名的属性,如果不设置就算设置了别名也会把数据库查询到的所有信息都写入excel文件writer.setOnlyAlias(true);// 3. 写标题,合并0-3合计4个单元格,标题内容,这个不是必须的writer.merge(3, "用户信息表"); // 写excel是按顺序写入的,先写标题// 4. 将数据库的文件写入,第二个参数:是否强制写标题writer.write(adminList, true);// 5. 固定写法,设置响应类型和响应头response.setContentType("application/vnd.ms-excel;charset=utf-8");String fileName = URLEncoder.encode("管理员信息", StandardCharsets.UTF_8);  // 对“管理员信息”汉字进行编码response.setHeader("Content-Disposition","attachment;filename=" + fileName + ".xlsx");// 6. 写出到流并关闭ServletOutputStream out = response.getOutputStream();writer.flush(out, true);writer.close();// 关闭writer,释放内存IoUtil.close(out);//此处记得关闭输出Servlet流}
  • 调用writeExcel的接口
// 导出选择id的数据,参数ids是要导出数据id的数组@GetMapping("/exportExcel")public void exportExcel(Integer[] ids, HttpServletResponse response) throws Exception {List<Admin>  allData = adminService.selectByIds(ids);try{writeExcel(response, allData);}catch (Exception e){throw new CustomException("导出失败");	// 自定义的异常处理}}
  • 前端发送请求
window.open("http://localhost:8080/exportExcel/ids=1,2,3")

3. 导入Excel表

1. 使用element上传组件

  • 注意name属性,这是传递给接口的名字,要与接口的参数名对应
      <el-upload:show-file-list="false"accept=".xls,.xlsx"name="a":on-success="handleImport"action="http://localhost:8080/admin/importExcel"style="display: inline-block;margin-left: 10px;position: relative;top:1px"><el-button type="info">批量导入</el-button></el-upload>

2. 接口代码

  @PostMapping("/importExcel")public Result<String> importExcel(MultipartFile a) throws Exception {	// 注意参数a要与前端<el-upload>组件的nama属性对应//  1. 拿到输入流 构建 readerInputStream inputStream = a.getInputStream();ExcelReader reader = ExcelUtil.getReader(inputStream);//  2. 通过Reader 读取 excel 里面的数据,第一个参数是Excel表中的标题行,第二个参数是实体类中对应的属性reader.addHeaderAlias("用户名", "username");reader.addHeaderAlias("姓名", "name");reader.addHeaderAlias("手机号", "phone");reader.addHeaderAlias("邮箱", "email");//    读取全部数据,默认第一行为标题行,从第二行开始读取数据
//    List<Admin> list = reader.readAll(Admin.class);// 我的excel设置了大标题的表头,第一个参数指定标题行的位置是1,第二个参数是数据开始行位置,第三个参数是实体类List<Admin> list = reader.read(1,2,Admin.class);// 3. 将数据写到数据库Integer i = adminService.addAdminBatch(list);return Result.ok("共导入了"+i+"条信息");}

3. 返回数据

// 批量导入按钮点击事件
const handleImport = (response) => {if (response.code === "1") {load()	// 重新加载页面的列表数据ElMessage.success(`导入成功,${response.data}`)} else {ElMessage.error(response.msg)}
}

4. 使用axios发送请求导出文件

  • 使用认证后,前端发送window.open请求不方便携带token
  • 后端发送文件的代码没有改变

1. 使用axios请求代替windows.open()

    request.get('/admin/exportExcel', {params: {ids: ids.join(',')},// Axios 会将服务器返回的响应数据封装成一个 Blob 对象responseType: 'blob',	})

2. 在拦截器中获取文件

// 响应拦截器
service.interceptors.response.use(response => {if (response.config.responseType === "blob") {// 从响应头中获取 Content-Dispositionconst contentDisposition = response.headers["content-disposition"];let extractedFileName = '';if (contentDisposition) {// 使用正则表达式匹配文件名const matches = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);if (matches != null && matches[1]) {// 去除引号,decodeURIComponent:对文件名编码处理extractedFileName = decodeURIComponent(matches[1].replace(/['"]/g, ''));}// 如果没有从响应头中获取到文件名,则使用传入的 fileName 或默认值extractedFileName = extractedFileName || "下载文件";const blob = new Blob([response.data]);const a = document.createElement("a");const url = window.URL.createObjectURL(blob);a.href = url;a.download = extractedFileName;a.click();window.URL.revokeObjectURL(url);ElMessage.success('文件下载成功');return Promise.resolve();}......
}

3. 对跨域请求过滤器配置

  • 原因:在跨域请求中,浏览器默认只允许访问部分简单响应头,如 Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,若要访问其他自定义响应头,需要在后端明确设置 ExposedHeaders。
	@Configurationpublic class CorsConfig {	     // 配置跨域请求过滤器@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOrigin("*");config.addAllowedHeader("*");config.addAllowedMethod("*");// 暴露 Content-Disposition 响应头,允许前端访问config.addExposedHeader("Content-Disposition");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}}

相关文章:

使用htool工具导出和导入Excel表

htool官网 代码中用到的hool包里面的excel工具ExcelUtil 1. 引入依赖 <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>&l…...

mysql 到 doris 挪移数据

工具datax..... 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压&#xff1a;tar -xvzf datax.tar.gz 然后&#xff0c;理论上就可以直接使用了。但是&#xff0c;datax本身是python2写的&#xff0c;如果需要python3…...

Springboot中的@ConditionalOnBean注解:使用指南与最佳实践

在使用Spring Boot进行开发时&#xff0c;大家应该都听说过条件注解&#xff08;Conditional Annotations&#xff09;。其中的ConditionalOnBean注解就很有趣&#xff0c;它帮助开发者在特定条件下创建和注入Bean&#xff0c;让你的应用更加灵活。今天就来聊聊这个注解的使用场…...

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时&#xff0c;总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下&#xff0c;然后终端执行命令下面的命令才可修改代码&#xff1a; ./pycharm.sh为了以后方便&#xff0c;这里给出添加pycharm到快捷启动栏的方法 二、添加…...

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB&#xff08;Lightning Memory-Mapped Database&#xff09;是一种高效的键值存储数据库&#xff0c;基于内存映射&#xff08;memory-mapping&#xff09;技术&#xff0c;提供…...

阿里云底层使用的虚拟化技术

‌阿里云底层使用的虚拟化技术主要是KVM&#xff08;[Kernel-based Virtual Machine&#xff09;‌。KVM是一种基于内核的虚拟机技术&#xff0c;它允许Linux内核直接管理虚拟机的创建和运行&#xff0c;提供高效的虚拟化解决方案‌12。 KVM技术的特点和应用场景 KVM具有以下…...

angular中的路由传参

目录 一、矩阵参数 一、矩阵参数 在angular中传参时可以使用矩阵参数&#xff0c;即直接通过变量值的形式在地址中体现&#xff0c;但需要注意参数的使用范围为当前路径段&#xff0c;而不是全局的查询参数。 const params {name: lhhh,age: 18,list: [{ name: htt }],}; //先…...

AI时代下的心理咨询师新利器:心理咨询小程序

在AI技术日新月异的今天&#xff0c;心理咨询师们也需要与时俱进&#xff0c;借助新型工具来提升咨询效率和服务质量。正如一位优秀的厨师离不开一把锋利的菜刀&#xff0c;心理咨询师同样需要一款得力助手来辅助其工作。而心理咨询小程序&#xff0c;正是这样一款应运而生的工…...

垃圾分类--环境配置

写在前面&#xff1a; 如果你们打这届比赛时&#xff0c;还有我们所保留的内存卡&#xff0c;那么插上即可运行&#xff08;因为内存卡里我们已经配置好所有的环境&#xff09; 本文提供两种环境的配置 一种是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…...

每日一题--计算机网络

一、基础概念类问题 1. TCP 和 UDP 的区别是什么&#xff1f; 回答示例&#xff1a; TCP&#xff1a;面向连接、可靠传输&#xff08;通过三次握手建立连接&#xff0c;丢包重传&#xff09;、保证数据顺序&#xff08;如文件传输、网页访问&#xff09;。 UDP&#xff1a;无…...

json字符串转对象,对象转JSON

背景&#xff1a; JSON字符串与对象之间的转换。在对接接口的数据的时候&#xff0c;因为是实时数据转发过来的。发现后端发过的数据是字符串【JSON字符串】但是我们前端需要的是一个对象。 核心代码&#xff1a; JSON.parse(JSON字符串) 效果展示&#xff1a; 接口JSON字符串转…...

c++ 基础题目lambda

1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明 a.可以赋值给一个与其类型兼容的 std::function 类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; }; b.使用具体的 lambda …...

pandas中excel自定义单元格颜色

writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比&#xff1a; ws.cell(1,2).value固定学生占比…...

3D标定中的平面约束-平面方程的几何意义

平面方程的一般形式为 AxByCzD0&#xff0c;其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用&#xff1a;系数 A、B、C 构成的向量 (…...

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…...

Linux-03 删除ubuntu系统文件夹Videos和Templates后,如何恢复

文章目录 问题解决方法1. 重新创建 Videos 和 Templates 文件夹2. 配置 user-dirs.dirs 文件3. 更新用户目录配置xdg-user-dirs-update4. 重启系统&#xff1a;sudo reboot 问题 手欠的嫌弃Videos和Templates文件夹是空的&#xff0c;也不会用&#xff0c;就删除了&#xff0c…...

springboot多种生产打包方式教程

在 Spring Boot 项目中&#xff0c;打包是一个非常重要的环节&#xff0c;因为它决定了应用程序如何部署到生产环境中。Spring Boot 提供了多种打包方式&#xff0c;以满足不同的需求和环境。以下是详细的教程&#xff0c;介绍 Spring Boot 的多种生产打包方式以及它们的适用场…...

Linux系统移植篇(十)根文件系统构建 V3 - Yocto

可以简单的将 Ubuntu 理解为一个根文件系统&#xff0c;和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上&#xff0c;但是因为 I.MX6ULL 孱弱的性能&#xff0c;本章我们就只移植 Ubuntu 的最小根文件系统&…...

pnpm创建vite

pnpm创建vite 在创建一个使用 Vite 的项目时&#xff0c;你可以通过 PNPM&#xff08;一个快速、节省磁盘空间的包管理器&#xff09;来简化依赖管理。以下是如何使用 PNPM 创建一个 Vite 项目的步骤&#xff1a; 安装 PNPM 如果你还没有安装 PNPM&#xff0c;可以通过 npm&…...

NAT技术-初级总结

NAT–网络地址转换 NAT基本逻辑是实现公网IP地址和私网IP地址的转换 华为设备所有NAT相关的配置都是在边界路由器的出接口上配置 1.静态NAT–一对一 就是在我们私网边界路由器上建立维护一张静态地址映射表,这张表 反映的是公网IP地址和私网IP地址之间一一对应的关系 只能一个…...

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章&#xff0c;但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120&#xff0c;而我按照相应的步骤与对应的编译器&#xff0c;仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512&#xff0c;反而成功了。现在开…...

LuaJIT 学习(4)—— FFI 语义

文章目录 C Language SupportC Type Conversion RulesConversions from C types to Lua objects例子&#xff1a;访问结构体成员 Conversions from Lua objects to C typesConversions between C types例子&#xff1a;修改结构体成员 Conversions for vararg C function argum…...

Pycharm接入DeepSeek,提升自动化脚本的写作效率

一.效果展示&#xff1a; 二.实施步骤&#xff1a; 1.DeepSeek官网创建API key&#xff1a; 创建成功后&#xff0c;会生成一个API key&#xff1a; 2. PyCharm工具&#xff0c;打开文件->设置->插件&#xff0c;搜索“Continue”&#xff0c;点击安装 3.安装完成后&…...

Windows安装Apache Maven 3.9.9

第一步下载资源 官网&#xff1a;下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 &#xff0c;需要注意MAVEN顺序应当在java之前 验证是否安装成功&#xff0c;在cmd中以管理员方式打开&#xff0c…...

jmeter将返回的数据写入csv文件

举例说明&#xff0c;我需要接口返回体中的exampleid与todoid的数据信息&#xff08;使用边界提取器先将其提取&#xff09;&#xff0c;并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…...

设计一个高性能的分布式限流系统

设计一个高性能的分布式限流系统 在现代分布式系统中&#xff0c;流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化&#xff0c;系统往往需要面对突发流量或恶意攻击等场景&#xff0c;这就对限流机制提出了更高的要求。一套高性能的…...

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09;七.通讯模块的完成&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 S…...

【Android】RuntimeShader 应用

1 简介 RuntimeShader 是 Android 13&#xff08;T&#xff09;中新增的特性&#xff0c;用于逐像素渲染界面&#xff0c;它使用 AGSL&#xff08;Android Graphics Shading Language&#xff09;编写着色器代码&#xff0c;底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…...

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...

jQuery从入门到应用:选择器、DOM与Ajax综合指南

文章目录 前言jQuery对象1、jQuery的使用在需要使用jQuery的页面引入Js文件使用jQuery选择页面元素并获取其文本内容 2、jQuery包装集与Dom对象DOM对象和jQuery对象的选择及互相转换 jQuery对象关键点说明&#xff1a; jQuery选择器1、基础选择器关键点说明 2、层次选择器关键点…...