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

devtools/2024/10/11 13:21:00/

介绍

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上传

前端

javascript"><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下载

前端

javascript"><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();}

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

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


http://www.ppmy.cn/devtools/117988.html

相关文章

Spring Boot入门指南

目录 1. 什么是Spring Boot&#xff1f; 2. Spring Boot的核心特性 3. 为什么选择Spring Boot&#xff1f; 4. Spring Boot项目搭建 4.1 使用Spring Initializr快速生成项目 4.2 使用Maven构建Spring Boot项目 5. 构建一个简单的Spring Boot Web应用 5.1 控制器&#xf…

腾讯云linux服务器修改root用户登录密码操作步骤

https://cloud.tencent.com/loginhttps://cloud.tencent.com/login 点击上面链接 登录腾讯云控制台 在打开页面 确认服务器后 点 登录 按钮 操作命令&#xff1a; sudo passwd root 密码设置不小于16位 字母大小写数字加特殊符号组合 修改成功后关闭登录窗口即可。

Python编码系列—Python模板方法模式:定义算法骨架,让子类实现细节

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

什么是Node.js?

为什么JavaScript可以在浏览器中被执行&#xff1f; 在浏览器中我们加载了一些待执行JS代码&#xff0c;这些字符串要当中一个代码去执行&#xff0c;是因为浏览器中有JavaScript的解析引擎&#xff0c;它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

CSS 背景属性概览:颜色、图像、位置、组合及透明

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 background - color background - image background - repeat background - position background - attachment background组合 背景透明 非 VIP 用户可前往公众号回复“css”进行免费阅读 background - color …

一文讲明白初学者怎么入门大语言模型(LLM)?零基础入门到精通,收藏这篇就够了

关于如何入门LLM&#xff0c;大多数回答都提到了调用API、训练微调和应用。但是大模型更新迭代太快&#xff0c;这个月发布的大模型打榜成功&#xff0c;仅仅过了一个月就被其他模型超越。训练微调也已经不是难事&#xff0c;有大量开源的微调框架&#xff08;llamafactory、fi…

HarmonyOS鸿蒙开发实战( Beta5.0)Web组件预览PDF文件实现案例

鸿蒙HarmonyOS开发实战往期必看文章&#xff1a;&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发性能实践总结&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发案例实践总结合集&#xff08;持续更新......&#xff09; 一分钟了解”纯血版&…

【openwrt-21.02】VPN Passthrough系列之L2TP Passthrough实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …