springBoot对接Apache POI 实现excel下载和上传

搭建springboot项目

此处可以参考 搭建最简单的SpringBoot项目_Steven-Russell的博客-CSDN博客

配置Apache POI 依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version>
</dependency>

创建controller

package com.wd.controller;import com.wd.utils.ExcelUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping(value = "excel")
public class ExcelController {@GetMapping(value = "download")public String download(HttpServletResponse httpServletResponse) throws IOException {List<String[]> dataList = new ArrayList<>();dataList.add(new String[]{"aaa", "add"});dataList.add(new String[]{"bbb", "add"});dataList.add(new String[]{"ccc", "delete"});dataList.add(new String[]{"ddd", "add"});dataList.add(new String[]{"eee", "delete"});try (SXSSFWorkbook workbook = ExcelUtils.parseInfo2ExcelWorkbook(dataList);OutputStream os = httpServletResponse.getOutputStream()){httpServletResponse.reset();httpServletResponse.setContentType("application/vnd.ms-excel");httpServletResponse.setHeader("Content-disposition","attachment;filename=data_excel_" + System.currentTimeMillis() + ".xlsx");workbook.write(os);workbook.dispose();}return "download excel success.";}@PostMapping(value = "upload")public String upload(@RequestParam(value = "file") MultipartFile file) {// 获取输入流 注意:SXSSFWorkbook需要关闭流try (InputStream inputStream = file.getInputStream();XSSFWorkbook workbook = ExcelUtils.parseExcelFile(inputStream)){XSSFSheet sheet = workbook.getSheetAt(0);for (int i = 0; i < sheet.getLastRowNum(); i++) {XSSFRow row = sheet.getRow(i + 1);String data = row.getCell(0).getStringCellValue();String opr = row.getCell(1).getStringCellValue();System.out.println("data : " + data + " <==> " + "opr : " + opr);}} catch (IOException e) {e.printStackTrace();return "upload excel failed.";}return "upload excel success.";}}

创建excel工具类 

package com.wd.utils;import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ExcelUtils {/*** 解析数据到excel中** @param dataList 数据list信息* @return excel对象*/public static SXSSFWorkbook parseInfo2ExcelWorkbook(List<String[]> dataList) {SXSSFWorkbook workbook = new SXSSFWorkbook();SXSSFSheet sheet = workbook.createSheet("数据");// 配置保护当前sheet页不被修改sheet.protectSheet("aaa");// 此处使用行的变量进行迭代,避免后续行创建出错int rows = 0;// 表头SXSSFRow head = sheet.createRow(rows++);CellStyle headCellStyle = createHeadCellStyle(workbook);createCell4Head(head, headCellStyle);// 表内容填充CellStyle bodyCellStyle = createBodyCellStyle(workbook);for (String[] dataArr : dataList) {SXSSFRow row = sheet.createRow(rows++);;createCell4Body(row, bodyCellStyle, dataArr[0], dataArr[1]);}return workbook;}private static CellStyle createBodyCellStyle(SXSSFWorkbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);return cellStyle;}private static CellStyle createHeadCellStyle(SXSSFWorkbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);return cellStyle;}private static void createCell4Body(SXSSFRow row, CellStyle bodyCellStyle, String data, String opr) {SXSSFCell dataCell = row.createCell(0);dataCell.setCellStyle(bodyCellStyle);dataCell.setCellValue(data);SXSSFCell oprCell = row.createCell(1);oprCell.setCellStyle(bodyCellStyle);oprCell.setCellValue(opr);}private static void createCell4Head(SXSSFRow head, CellStyle cellStyle) {SXSSFCell dataCell = head.createCell(0);dataCell.setCellValue("data");dataCell.setCellStyle(cellStyle);SXSSFCell oprCell = head.createCell(1);oprCell.setCellValue("opr");oprCell.setCellStyle(cellStyle);}/*** 将输入流封装为 XSSFWorkbook 对象** @param inputStream excel 输入流* @return XSSFWorkbook 对象* @throws IOException 异常信息*/public static XSSFWorkbook parseExcelFile(InputStream inputStream) throws IOException {return new XSSFWorkbook(inputStream);}
}

启动项目

测试

下载excel

浏览器输入 http://localhost:8888/excel/download

打开下载内容,和代码中的内容进行对比,发现和预期一致

上传excel

打开postman或者Insomnia等工具,输入请求地址和对应的文件,查看控制台打印,和导入的表格内容一致

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

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

相关文章

FastChat工作原理解析

在了解FastChat如何完成大模型部署前&#xff0c;先了解下Huggingface提供的Transformer库。Hugggingface提供的Transformer库 Hugging Face 的 Transformers 库是一个用于自然语言处理&#xff08;NLP&#xff09;任务的 Python 库&#xff0c;旨在简化和加速使用预训练语言模…

手写Spring:第5章-注入属性和依赖对象

文章目录 一、目标&#xff1a;注入属性和依赖对象二、设计&#xff1a;注入属性和依赖对象三、实现&#xff1a;注入属性和依赖对象3.0 引入依赖3.1 工程结构3.2 注入属性和依赖对象类图3.3 定义属性值和属性集合3.3.1 定义属性值3.3.2 定义属性集合 3.4 Bean定义补全3.5 Bean…

android 注解详解

1&#xff0c;注解的概念 注解现在广泛的应用于android的各个开源框架中&#xff0c;不理解注解&#xff0c;我们就无法更好的提升我们的架构能力。那么什么是注解呢&#xff1f;注解&#xff08;Annotation&#xff09;&#xff0c;是JDK5.0 引入的一种注释机制。 注解是元数…

go的iris框架进行本地资源映射到服务端

我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…

飞猪店铺小管家软件需求分析说明书

飞猪店铺小管家软件 项目背景&#xff1a; 在飞猪店铺运营过程中&#xff0c;客服人数不足导致客服团队忙不过来&#xff0c;容易出现订票信息错误&#xff0c;进而客户无法顺利参观景点&#xff0c;频繁投诉。这种情况不仅影响客户体验&#xff0c;还可能导致商家因赔付而承受…

出行类APP商业化路径解决方案

当下市场主流的商业化路径和方法相比于之前区别不大&#xff0c;开发者们都是在现有商业化体系下&#xff0c;制定更加详细、优质的策略&#xff0c;以期获得更高利益。 出行类App用户结构分析 年龄层次&#xff1a;出行类App用户的年龄分布比较广泛&#xff0c;主要集中在20…

苹果电脑版虚拟机推荐 VMware Fusion Pro for mac(vm虚拟机)

VMware Fusion Pro是一款功能强大的虚拟化软件&#xff0c;专为Mac用户设计。它允许用户在Mac上创建、运行和管理虚拟机&#xff0c;以便同时运行多个操作系统和应用程序。 以下是VMware Fusion Pro的一些主要特点和功能&#xff1a; 1. 多操作系统支持&#xff1a;VMware Fu…

MySQL--数据库基础

数据库分类 数据库大体可以分为 关系型数据库 和 非关系型数据库 常用数据类型 数值类型&#xff1a; 分为整型和浮点型&#xff1a; 字符串类型 日期类型

试图替代 Python 的下一代AI编程语言:Mojo

文章目录 为什么叫 Mojo &#xff1f;Python 家族的一员&#xff0c;MojoPython 的好处&#xff1a;Python 兼容性Python 的问题移动和服务器部署&#xff1a;Python 子集和其他类似 Python 的语言&#xff1a; Mojo 是一种创新的编程语言&#xff0c;结合了 Python 的可用性和…

组件以及组件间的通讯

组件 & 组件通讯 :::warning 注意 阅读本文章之前&#xff0c;你应该先要了解 ESM 模块化的 import export&#xff0c;如需要请查看 ESM 模块化。 ::: 上一篇有介绍到什么是组件化&#xff0c;就是把一个页面拆分成若干个小模块&#xff0c;然后重新组成一个页面。其中的…

BL110设备支持Modbus TCP协议接入

随着物联网技术的不断发展&#xff0c;越来越多的工业设备被连接到云平台上&#xff0c;以实现远程监控和管理。在这篇文章中&#xff0c;我们将介绍如何方便用户快速把多种工业设备接入几个主流的云平台&#xff0c;如华为云 IoT、AWS IoT、阿里云 IoT、ThingsBoard、金鸽云等…

基于 Transformation-Equivariant 的自动驾驶 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2211.11962 论文代码&#xff1a;https://github.com/hailanyi/TED 论文背景 三维场景中的物体分布有不同的方向。普通探测器不明确地模拟旋转和反射变换的变化。需要大的网络和广泛的数据增强来进行鲁棒检测。 equivariant netw…

项目01—基于nignx+keepalived双vip的负载均衡高可用Web集群

文章目录 一.项目介绍1.拓扑图2.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 批量部署nginx 2.配置NFS服务器和负载均衡器搭建keepalived2.1 修改nginx的index.html界面2.2 nginx实现七层负载均衡2.4 使…

《C++设计模式》——创建型

前言 创建型为了创建东西才是有用的&#xff0c;创建型设计模式使用的场景&#xff1a; 1、创建一个东西&#xff1b; 2、可重复利用&#xff1b; 3、灵活性高&#xff0c;代码可因地制宜。 Factory Method(工厂模式) 工厂模式将目的将创建对象的具体过程屏蔽隔离起来&#…

三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍

三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍 三维模型3DTile格式的轻量化处理旨在减少模型的存储空间和提高渲染性能。以下是一些推荐的工具软件&#xff0c;可以用于实现这个目的&#xff1a; MeshLab&#xff1a;MeshLab是一个开源的三维模型处理软件&#xff0c…

RBTree(红黑树)模拟实现(插入)

目录 红黑树的性质 红黑树的模拟插入 叔叔存在且为红色 叔叔不存在 旋转情况​​​​​​​ 叔叔存在且为黑色 总结 插入实现 节点 插入逻辑 左单旋 右单旋 红黑树是一颗平衡搜索二叉树&#xff0c;但是红黑树并不像 AVL 树一样是高度平衡二叉树&#xff0c;任意一…

自动化运维——ansible (五十二) (01)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、概述 1.1 为什么要用自动化运维软件 1.2 自动化运维 1.3 自动化运维要注意的方面 1.4 自动化运维主要关注的方面 1.5 常见的开源自动化运维软件 1.6 自动化运维软件…

华为OD机试 - 单词接龙 - 数据结构map、list (Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、输入示例1、输入&#xff1a;2、输出3、说明 五、解题思路1、核心思想&#xff1a;2、核心算法是构建一个map&#xff1a; 六、Java算法源码七、效果展示1、输入2、输出3、说明4、没有移除后再次拼接的情况&#xff0c;改…

Vue中实现3D得球自动旋转

具体实现 安装echarts 在终端下安装echarts npm install -D echarts 安装echarts-gl 在终端下安装echarts-gl npm install -D echarts-gl earth3D组件 earth3D.vue <template><div class"globe3d-earth-container" ><div class"globe3d-earth&qu…

CK_Label-V23货架标签(电池版本)接口文档

查询标签信息接口 接口类型&#xff1a;POST, 参数格式&#xff1a;json array 链接形式&#xff1a; http://localhost/wms/associate/getTagsMsg 代码形式&#xff1a; { url : http://localhost/wms/associate/getTagsMsg, requestMethed : GET, requestParameter :…