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

使用Hutool-poi封装Apache POI进行Excel的上传与下载

介绍

Hutool-poi是针对Apache POI的封装,因此需要用户自行引入POI库,Hutool默认不引入。到目前为止,Hutool-poi支持:

  • Excel文件(xls, xlsx)的读取(ExcelReader)
  • Excel文件(xls,xlsx)的写出(ExcelWriter)

#使用

#引入POI依赖

推荐引入poi-ooxml,这个包会自动关联引入poi包,且可以很好的支持Office2007+的文档格式

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version>
</dependency>

如果需要使用Sax方式读取Excel,需要引入以下依赖(POI-4.x以上这个非必须):

<dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>${xerces.version}</version>
</dependency>

说明
hutool-4.x的poi-ooxml 版本需高于 3.17(别问我3.8版本为啥不行,因为3.17 > 3.8 )
hutool-5.x的poi-ooxml 版本需高于 4.1.2
hutool-5.6.x支持poi-ooxml 版本高于 5.0.0
xercesImpl版本高于2.12.0(非必须)

引入后即可使用Hutool的方法操作Office文件了,Hutool提供的类有:

  • ExcelUtil Excel工具类,读取的快捷方法都被封装于此
  • ExcelReader Excel读取器,Excel读取的封装,可以直接构造后使用。
  • ExcelWriter Excel生成并写出器,Excel写出的封装(写出到流或者文件),可以直接构造后使用。

#常见问题

部分用户使用POI模块时会提示:

You need to add dependency of 'poi-ooxml' to your project, and version >= 4.1.2

一般以下几个原因:

  1. 没有引入POI相关jar或引入版本太低
  2. 引入了多个版本的POI,导致包冲突了
  3. 没有引入关联依赖,这个具体要看下堆栈中的Cause By

Excel上传和下载

Excel上传

前端

<el-form-item> <el-upload :shaw-file-list="false" :on-change="onChange" :auto-upload="false"> <el-button type="primary">&nbsp导入</el-button></el-upload></el-form-item>const onChange = (uploadFile: any, _uploadFiles: any) => {let name = uploadFile.namelet reader = new FileReader()reader.readAsDataURL(uploadFile.raw) // 异步的读reader.onload = (file) => {callUploadApi(name, file.target?.result)}}const callUploadApi = (name: string, base64: any) => {productApi.upload.call({ name, base64 }).then((res: any) => {ElMessage.success("上传成功")})
}

后端

@PostMapping("upload")public String upload(@RequestBody UploadDto uploadDto) throws IOException {String base64 = uploadDto.getBase64();String[] base64s = StrUtil.splitToArray(base64, "base64,");byte[] decode = Base64.decode(base64s[1]);//用于创建一个基于字节数组的输入流。它允许你从一个字节数组中读取数据。ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decode);//创建Excel读取器,用于后续的Excel数据读取操作ExcelReader reader = ExcelUtil.getReader(byteArrayInputStream);//通过反射机制读取所有产品数据。List<Product> readAll = reader.readAll(Product.class);productService.insert(readAll);byteArrayInputStream.close();return "success";}

Excel下载

前端

<el-form-item><el-button type="primary" @click="exportExcel">&nbsp导出                    </el-button></el-form-item>const exportExcel = () => {let name = formData.name == '' ? undefined : formData.namewindow.open('/api/pro/download?name='+name, '_blank', '')
}

后端

 @GetMapping("download")public void download(HttpServletResponse response, ProductQuery productQuery) throws IOException {List<Product> productList = productService.select(productQuery);// 初始化Excel写入器 加true指定Excel文件是xlsx格式ExcelWriter writer = ExcelUtil.getWriter(true);writer.addHeaderAlias("id", "Id");writer.addHeaderAlias("name", "姓名");writer.addHeaderAlias("subName", "介绍");writer.addHeaderAlias("status", "状态");writer.addHeaderAlias("price", "价格");// 写入当前批次的数据writer.write(productList,true);//response为HttpServletResponse对象   设置响应的内容类型为Excel文件response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("UTF-8");//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码//设置响应头,告诉浏览器以附件形式下载文件,文件名为test.xlsx。这样设置可以让浏览器弹出文件下载对话框。String time = System.currentTimeMillis() +"";response.setHeader("Content-Disposition", "attachment;filename=product"+time+".xlsx");//获取响应输出流,它是用于将响应的数据发送给客户端的流。ServletOutputStream out = response.getOutputStream();//将Excel数据写入输出流。第二个参数为true表示追加写入,即将数据追加到已有的Excel文件中。writer.flush(out, true);//关闭输出流out.close();}

通过线程池来完成百万级别数据插入

通过线程池来完成百万级别数据插入

相关文章:

使用Hutool-poi封装Apache POI进行Excel的上传与下载

介绍 Hutool-poi是针对Apache POI的封装&#xff0c;因此需要用户自行引入POI库,Hutool默认不引入。到目前为止&#xff0c;Hutool-poi支持&#xff1a; Excel文件&#xff08;xls, xlsx&#xff09;的读取&#xff08;ExcelReader&#xff09;Excel文件&#xff08;xls&…...

asp.net core grpc快速入门

环境 .net 8 vs2022 创建 gRPC 服务器 一定要勾选Https 安装Nuget包 <PackageReference Include"Google.Protobuf" Version"3.28.2" /> <PackageReference Include"Grpc.AspNetCore" Version"2.66.0" /> <PackageR…...

拿到一个新项目,如何开展测试

1. 拿到一个新的项目或者新的需求&#xff0c;首先需要搞清楚他的背景、目标和需求&#xff0c;这个过程需要和产品、开发、客户去沟通。 2. 清楚需求后&#xff0c;首先将业务流程走通&#xff0c;确保项目的基础功能是正常的 3. 根据项目需求明确测试的目标&#xff0c;如&…...

pre-commit 的配置文件

这个文件是 pre-commit 的配置文件&#xff0c;通常命名为 .pre-commit-config.yaml。pre-commit 是一个用于管理和维护多种预提交钩子的框架&#xff0c;旨在在代码提交&#xff08;git commit&#xff09;之前自动执行一系列检查和格式化任务&#xff0c;以确保代码质量和一致…...

5G-A和F5G-A,对于AI意味着什么?

2024年已经过去了一大半&#xff0c;风起云涌的AI浪潮&#xff0c;又发生了不小的变化。 一方面&#xff0c;AI大模型的复杂度不断提升&#xff0c;模型参数持续增加&#xff0c;智算集群的规模也随之增加。万卡级、十万卡级集群&#xff0c;已经逐渐成为训练标配。这对智算网络…...

vue-实现rtmp直播流

1、安装vue-video-player与videojs-flash npm install vue-video-player -S npm install videojs-flash --save 2、在main.js中引入 3、组件中使用 这样就能实现rtmp直播流在浏览器中播放&#xff0c;但有以下几点切记&#xff0c;不要入坑 1.安装vue-video-player插件一定…...

论文阅读【时间序列】ModerTCN (ICLR2024)

【时间序列】ModerTCN (ICLR2024) 原文链接&#xff1a;ModernTCN: A Modern Pure Convolution Structure for General Time Series Analysis 代码仓库&#xff1a;ModerTCN 简易版本实现代码可以参考&#xff1a;&#xff08;2024 ICLR&#xff09;ModernTCN&#xff1a;A Mod…...

Robot Operating System——二维平面中的位置和方向

大纲 应用场景1. 移动机器人导航场景描述具体应用 2. 自动驾驶车辆控制场景描述具体应用 3. 机器人运动规划场景描述具体应用 4. 室内导航场景描述具体应用 5. 仿真环境场景描述具体应用 定义字段解释 案例 geometry_msgs::msg::Pose2D 是 ROS 2 中的一个消息类型&#xff0c;用…...

一文带你读懂分库分表,分片,Sharding的许多概念

一文带你读懂分库分表,分片,Sharding的许多概念 分库是将一个库拆分为多个库&#xff0c;分表就是将一个表拆分为多个表。分库分表有垂直拆分和水平拆分。垂直拆分一般是按照业务将表分到不同的库中&#xff08;此种不在本发的讨论范围&#xff09;。水平拆分是将表的数据拆分…...

算法实战(五):如何用学过的数据结构和算法实现一个短网址系统?

算法实战(五):如何用学过的数据结构和算法实现一个短网址系统? 在互联网时代,我们经常会遇到一些很长的网址,不仅不便于记忆,而且在一些场合下可能会受到长度限制。短网址系统就是为了解决这个问题而产生的。本文将介绍如何用学过的数据结构和算法实现一个短网址系统,…...

Python 环境搭建

Python 环境搭建 本章节我们将向大家介绍如何在本地搭建Python开发环境。 Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 “python” 命令来查看本地是否已经安装Python以及Python的安装版本。 Python下载 Python最新源码&#xff0c;二进制文档&am…...

uniapp vue3 使用echarts绘制图表 柱状图等

部分内容AI总结 Uniapp 使用 Vue3 和 ECharts 组件的总结 在 Uniapp 中使用 Vue3 和 ECharts 进行数据可视化是一种常见需求。以下将详细介绍如何在 Uniapp 项目中安装 ECharts 插件、在 main.js 中挂载 ECharts 以及一个简单的示例 demo。 1. 下载 ECharts 插件 在 Uniapp 中…...

字符串处理的艺术:深入探索charAt(), indexOf(), nextLine(), 和 next() 的应用与组合

摘要 本文旨在深入探讨Java中字符串处理的核心方法——charAt(), indexOf(), nextLine(), 和 next()&#xff0c;通过实例展示这些方法如何协同工作以解决复杂的字符串处理任务。我们将从基础概念出发&#xff0c;逐步构建到高级应用&#xff0c;包括字符串的遍历、搜索、读取…...

C#八股总结

重载和重写的区别 方法重载&#xff1a;在同一个类中定义多个同名但参数不同的方法。 方法重写&#xff1a;通过使用 virtual 和 override 关键字&#xff0c;实现基类和派生类之间的方法重写。 重载发生在同类中&#xff0c;重写发生在父子类中 重载方法名相同参数不同&#…...

iOS 中的 sqlite-shm 和 sqlite-wal 文件丢失

iOS 中的 sqlite-shm 和 sqlite-wal 文件丢失或损坏可能会导致 NSManagedObjectContext 的 performAndWait 方法抛出 NSInternalInconsistencyException 异常。这是因为这些文件在 SQLite 的 Write-Ahead Logging (WAL) 模式下起着关键作用&#xff0c;Core Data 依赖它们来确保…...

ubuntu22上C/C++程序使用weston+wayland+OpenGLES渲染

一&#xff0c;安装依赖软件&#xff1a;sudo apt install zlib1g-dev libssl-dev libgles2-mesa-dev libsystemd-dev libpng-dev libglib2.0-dev libwayland-dev weston libweston-9-dev 二&#xff0c;启动&#xff1a; # 运行weston weston -Swayland-1# 运行程序 ./yourp…...

打点 - 泛微 E-Cology WorkflowServiceXml

请求路径 /services%20/WorkflowServiceXml显示如下&#xff0c;漏洞可能存在 利用&#xff1a; 根据提示在 CMD 处输入 Memshell 注入内存马&#xff0c;并点击执行&#xff0c;成功注入 冰蝎配置&#xff0c;输入内存马地址 成功连接 命令执行...

Go语言接口与多态

Go语言虽然并非传统意义上的面向对象语言&#xff0c;但它通过接口&#xff08;Interface&#xff09;和匿名组合&#xff08;Composition&#xff09;等机制&#xff0c;实现了类似面向对象编程中的多态性&#xff08;Polymorphism&#xff09;。接口和多态性是Go语言中非常重…...

【ADC】SAR 型 ADC 和 ΔΣ ADC 的选型决策方法

本文学习于TI 高精度实验室课程&#xff0c;介绍如何选择 SAR 或 delta-sigma 型 ADC。 文章目录 一、选型决策树二、特定传感器的应用三、需要 DC 精度但分辨率较低的应用四、需要 DC 精度且分辨率较高的应用五、极低噪声的 DC 精密测量六、需要捕获瞬态信号值的应用七、需要高…...

探探Java与python中的闭包

说在前面&#xff1a;在计算机科学中&#xff0c;闭包是指一个函数以及其引用的周围环境&#xff08;变量&#xff09;所组成的整体。简单来说&#xff0c;闭包允许一个函数访问并操作其外部函数作用域中的变量&#xff0c;即使外部函数已经执行完毕。 Java函数式编程—闭包&am…...

在线Graphviz图表编辑器:3步创建专业技术流程图

在线Graphviz图表编辑器&#xff1a;3步创建专业技术流程图 【免费下载链接】GraphvizOnline Lets Graphviz it online 项目地址: https://gitcode.com/gh_mirrors/gr/GraphvizOnline 还在为复杂的技术图表绘制而烦恼吗&#xff1f;GraphvizOnline作为一款革命性的在线G…...

3步掌握yfinance:从金融数据获取到智能分析的完整指南

3步掌握yfinance&#xff1a;从金融数据获取到智能分析的完整指南 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance yfinance是一个强大的Python库&#xff0c;能够轻松从Yahoo! F…...

别再为嵌入式设备大内存发愁了!手把手教你用CMA(连续内存分配器)搞定Linux视频编解码缓冲区

嵌入式多媒体开发中的连续内存优化实战&#xff1a;CMA技术深度解析 在嵌入式多媒体开发领域&#xff0c;视频编解码、图像处理等任务对内存管理提出了严苛要求。当你在树莓派上部署视频监控系统&#xff0c;或在工业摄像头中实现实时H.264编码时&#xff0c;是否经常遇到这样的…...

基于RP2040与CircuitPython的HDMI倒计时器:RTC与DVI原生输出实践

1. 项目概述与核心价值如果你手头有一块带HDMI输出的微控制器开发板&#xff0c;比如Adafruit的Feather RP2040 DVI&#xff0c;又恰好需要一个能摆在桌面上、精确到秒的倒计时器&#xff0c;那么今天这个项目就是为你量身定做的。它不仅仅是一个简单的“Hello World”式显示应…...

【独家首发】ElevenLabs乌尔都语语音SDK逆向分析(v2.4.1):提取未文档化emotion_intensity参数,实现新闻播报级庄严语调控制

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs乌尔都语语音SDK逆向分析全景概览 ElevenLabs 官方未公开乌尔都语&#xff08;ur-PK&#xff09;的独立语音 SDK&#xff0c;但其 Web API 实际支持该语言的 TTS 合成。通过对官方 JS SDK&am…...

如何为深信服超融合平台上的应用快速接入大模型能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何为深信服超融合平台上的应用快速接入大模型能力 对于在深信服超融合平台上部署业务应用的企业开发团队而言&#xff0c;集成智…...

Python Reddit数据采集与分析实战:从API调用到舆情监控

1. 项目概述与核心价值最近在开源社区里&#xff0c;一个名为openshrug/reddit-intel的项目引起了我的注意。乍一看&#xff0c;这像是一个针对 Reddit 平台的数据抓取或分析工具&#xff0c;但深入探究后&#xff0c;我发现它的定位远不止于此。它更像是一个为开发者、数据分析…...

树莓派+Kali Linux+PiTFT打造便携式安全测试平台全攻略

1. 项目概述如果你和我一样&#xff0c;对网络安全和嵌入式硬件都抱有浓厚的兴趣&#xff0c;那么将Kali Linux与树莓派结合&#xff0c;再配上一块小巧的触摸屏&#xff0c;绝对是一个能让你兴奋起来的项目。这不仅仅是把两个热门技术拼在一起&#xff0c;更是打造一个真正便携…...

可逆计算与量子电路合成:改进QM算法与全局优化

1. 可逆计算与量子电路合成基础在量子计算领域&#xff0c;可逆计算是一项关键技术&#xff0c;它不仅是实现低功耗设计的核心方法&#xff0c;更是量子电路合成的基础。传统计算机中的逻辑门大多是不可逆的&#xff0c;这意味着计算过程中会丢失信息并产生热量。而量子计算由于…...

OpenClaw-Subcortex:轻量级自动化任务编排与执行框架详解

1. 项目概述与核心价值最近在折腾一些自动化工具&#xff0c;发现一个挺有意思的项目叫openclaw-subcortex。乍一看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;又是“爪子”又是“皮层下”的&#xff0c;感觉像是什么生物或者神经科学的东西。但实际上&#xff0c;这是…...