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

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等工具,输入请求地址和对应的文件,查看控制台打印,和导入的表格内容一致

相关文章:

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> </…...

定积分的计算:牛顿-莱布尼茨公式

目录 牛顿-莱布尼茨公式 用C语言代码实现 利用换元积分法和分部积分法 利用奇偶性和周期性求积分 利用已有公式求积分 牛顿-莱布尼茨公式 牛顿-莱布尼茨公式&#xff08;Newton-Leibniz formula&#xff09;是微积分学中的基本定理之一&#xff0c;它反映了定积分与被积函…...

shell脚本之case 的用法

shell脚本之case case是Shell脚本中的一种控制流语句&#xff0c;它允许根据变量的值选择不同的执行路径。case语句的语法如下&#xff1a; case word in pattern [| pattern]...) command-list ;; pattern [| pattern]...) command-list ;; ... *) command-list ;; esa…...

第3章 helloworld 驱动实验(iTOP-RK3568开发板驱动开发指南 )

在学习C语言或者其他语言的时候&#xff0c;我们通常是打印一句“helloworld”来开启编程世界的大门。学习驱动程序编程亦可以如此&#xff0c;使用helloworld作为我们的第一个驱动程序。 接下来开始编写第一个驱动程序—helloworld。 3.1 驱动编写 本小节来编写一个最简单的…...

基于PyTorch使用LSTM实现新闻文本分类任务

本文参考 PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm1001.2014.3001.5501 文章目录 本文参考任务介绍做数据的导入 环境介绍导入必要的包介绍torchnet和keras做数据的导入给必要的参数命名加载文本数据数据前处理模型训…...

Flutter插件的制作和发布

Flutter制作插件有两种方式&#xff08;以下以android和ios为例&#xff09;&#xff1a; 目录 1.直接在主工程下的android和ios项目内写插件代码&#xff1a;2.创建独立Flutter Plugin项目&#xff0c;制作各端插件后&#xff0c;再引入项目&#xff1a;1. 创建Flutter Plugin…...

【JAVA】异常

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和…...

合同矩阵充要条件

两个实对称矩阵合同的充要条件是它们的正负惯性指数相同。 正惯性指数是矩阵正特征值个数&#xff0c;负惯性指数是矩阵负特征值个数。 即合同矩阵的充分必要条件是特征值的正负号个数相同。 证明&#xff1a; 本论证中的所有矩阵都是对称矩阵。 根据定义&#xff0c;若矩…...

数据分析三剑客之Pandas

1.引入 前面一篇文章我们介绍了numpy&#xff0c;但numpy的特长并不是在于数据处理&#xff0c;而是在它能非常方便地实现科学计算&#xff0c;所以我们日常对数据进行处理时用的numpy情况并不是很多&#xff0c;我们需要处理的数据一般都是带有列标签和index索引的&#xff0…...

Spring Boot自动装配原理

简介 Spring Boot是一个开源的Java框架&#xff0c;旨在简化Spring应用程序的搭建和开发。它通过自动装配的机制&#xff0c;大大减少了繁琐的配置工作&#xff0c;提高了开发效率。本文将深入探讨Spring Boot的自动装配原理。 自动装配的概述 在传统的Spring框架中&#xf…...

VMware Workstation虚拟机网络配置及配置自动启动

目录 一、网络配置二、配置自动启动1.VMware 中配置虚拟机自启动2.系统服务中配置 VMware 服务自启动 一、网络配置 本文将虚拟机 IP 与主机 IP 设置为同一个网段。 点击 “编辑” -> “虚拟网络编辑器(N)…”&#xff1a; 点击 “更改设置”&#xff1a; 将 VMnet0 设置…...

智能语音机器人竞品调研

一、腾讯云-智能客服机器人 链接地址&#xff1a;智能客服机器人_在线智能客服_智能客服解决方案 - 腾讯云 二、阿里云-智能语音机器人 链接地址&#xff1a;智能对话机器人-阿里云帮助中心 链接地址&#xff1a;智能外呼机器人的业务架构_智能外呼机器人-阿里云帮助中心 三、火…...

【操作系统】进程的概念、组成、特征

概念组成 程序&#xff1a;静态的放在磁盘&#xff08;外存&#xff09;里的可执行文件&#xff08;代码&#xff09; 作业&#xff1a;代码&#xff0b;数据&#xff0b;申请&#xff08;JCB&#xff09;&#xff08;外存&#xff09; 进程&#xff1a;程序的一次执行过程。 …...

大二第二周总结

问题&#xff1a; 想到了之前追的辩论赛&#xff0c;主题是“被误解是表达者的宿命”&#xff0c; 反方认为被误解不是表达者的宿命&#xff1a; 由于表达者表意含混造成误解的可能性是人力可控的&#xff0c;表达者可在真诚沟通的基础之上&#xff0c;根据对方反应不断调整…...

JDK、eclipse软件的安装

一、打开JDK安装包 二、复制路径 三、点击我的电脑&#xff0c;找到环境变量 四、新建环境 变量名&#xff1a;JAVA_HOME 变量值就是刚刚复制的路径 五、在path中建立新变量 双击path 打印以下文字 最后一直双击确定&#xff0c;安装环境完成。 六、双击eclipse 选择好安装…...

235. 二叉搜索树的最近公共祖先 Python

文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足…...

Apollo介绍和入门

文章目录 Apollo介绍配置中心介绍apollo介绍主流配置中心功能特性对比 Apollo简介 入门简单的执行流程Apollo具体的执行流程Apollo对象执行流程分步执行流程 核心概念应用&#xff0c;环境&#xff0c;集群&#xff0c;命名空间企业部署方案灰度发布全量发布 配置发布的原理发送…...

一文看懂Oracle 19c OCM认证考试(需要Oracle OCP证书)

Oracle OCM的认证全称是Oracle Certified Master&#xff0c;是比OCP更高一级的认证&#xff0c;姚远老师的很多OCP学员都对OCM考试有兴趣&#xff0c;这里跟大家做个介绍。 OCM考试全部是上机的实操考试&#xff0c;没有笔试&#xff0c;要到Oracle原厂参加两天的考试。参加1…...

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览…...

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...