Springboot导出Excel,支持大数据量

news2025/7/22 21:35:25

1、添加maven依赖

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

2、ExcelUtil工具类

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;

public class ExcelUtil {
   /**
    * 导出Excel,一个sheet
    *
    * @param response   响应
    * @param fileName   文件名
    * @param columnList 每列的标题名
    * @param dataList   导出的数据
    */
   public static void exportExcel(HttpServletResponse response, String fileName, List<String> columnList, List<List<String>> dataList) {
      //声明输出流
      OutputStream os = null;
      //设置响应头
      setResponseHeader(response, fileName);
      try {
         //获取输出流
         os = response.getOutputStream();
         //内存中保留1000条数据,以免内存溢出,其余写入硬盘
         SXSSFWorkbook wb = new SXSSFWorkbook(1000);
         //获取该工作区的第一个sheet
         Sheet sheet1 = wb.createSheet("sheet1");
         int excelRow = 0;
         //创建标题行
         Row titleRow = sheet1.createRow(excelRow++);
         for (int i = 0; i < columnList.size(); i++) {
            //创建该行下的每一列,并写入标题数据
            Cell cell = titleRow.createCell(i);
            cell.setCellValue(columnList.get(i));
         }
         //设置内容行
         if (dataList != null && dataList.size() > 0) {
            //序号是从1开始的
            int count = 1;
            //外层for循环创建行
            for (int i = 0; i < dataList.size(); i++) {
               Row dataRow = sheet1.createRow(excelRow++);
               //内层for循环创建每行对应的列,并赋值
               for (int j = -1; j < dataList.get(0).size(); j++) {//由于多了一列序号列所以内层循环从-1开始
                  Cell cell = dataRow.createCell(j + 1);
                  if (j == -1) {//第一列是序号列,不是在数据库中读取的数据,因此手动递增赋值
                     cell.setCellValue(count++);
                  } else {//其余列是数据列,将数据库中读取到的数据依次赋值
                     cell.setCellValue(dataList.get(i).get(j));
                  }
               }
            }
         }
         //将整理好的excel数据写入流中
         wb.write(os);
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         try {
            // 关闭输出流
            if (os != null) {
               os.close();
            }
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }

   /*
      设置浏览器下载响应头
    */
   private static void setResponseHeader(HttpServletResponse response, String fileName) {
      try {
         try {
            fileName = new String(fileName.getBytes(), "ISO8859-1");
         } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
         }
         response.setContentType("application/octet-stream;charset=UTF-8");
         response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
         response.addHeader("Pargam", "no-cache");
         response.addHeader("Cache-Control", "no-cache");
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

3、导出代码

List<List<String>> dataList = new ArrayList<>();

List<String> stringList = new ArrayList();
stringList.add("130000");
stringList.add("河北");
dataList.add(stringList);

stringList = new ArrayList();
stringList.add("130100");
stringList.add("石家庄");
dataList.add(stringList);

List<String> titleList = Arrays.asList("序号", "编码", "名称");
ExcelUtil.exportExcel(response, "区划信息.xlsx", titleList, dataList);

4、导出效果

 

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

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

相关文章

【附源码】Python计算机毕业设计天气预报APP

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

甘露糖-聚乙二醇-炔基|mannose-PEG-Alkyne|炔基-PEG-甘露糖

甘露糖-聚乙二醇-炔基|mannose-PEG-Alkyne|炔基-PEG-甘露糖 中文名称&#xff1a;甘露糖-炔基 英文名称&#xff1a;mannose-Alkyne 别称&#xff1a;炔基修饰甘露糖&#xff0c;炔基-甘露糖 mannose-PEG-Alkyne 甘露糖-聚乙二醇-炔基 炔基-PEG-甘露糖 纯度&#xff1a;…

统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理

目录 一、搭建网关服务 二、路由断言工程Route Predicate Factory 三、路由过滤器 四、全局过滤器GlobalFilter 过滤器执行顺序 五、跨域问题处理 一、搭建网关服务 网关的作用&#xff1a; 对用户请求做身份认证&#xff0c;权限校验 将用户请求路由到微服务&#xff0…

吴恩达机器学习课程笔记二

文章目录神经网络基础知识神经网络前向传播伪代码前向传播中单个神经元的作用矩阵加速运算训练模型的细节常用激活函数ReLUSigmoidLinear activation functiontanh选择激活函数选择输出层的激活函数选择隐藏层的激活函数为什么需要非线性激活函数Softmax激活函数多标签分类问题…

Metabase学习教程:提问-2

查询编辑器中的自定义表达式 何时应该使用自定义表达式&#xff0c;以及为什么要在Metabase的查询编辑器中利用它们。 在数学中&#xff0c;表达式是符号的集合&#xff0c;它们一起表示一个值。如果你以前使用过电子表格软件&#xff0c;表达式就是公式&#xff0c;比如SUM&…

从安装python到使用opencv进行人脸检测

一、python与PyCharm的安装 1.python主要有三种安装方式 参考自&#xff1a;2、Python安装 - 哔哩哔哩 Python安装教程&#xff08;2022最新&#xff09;_北京精神病康复中心的博客-CSDN博客 python下载官网&#xff1a;Python Releases for Windows | Python.org 1&#…

EDI系统如何恢复历史映射关系?

在知行之桥EDI系统中&#xff0c;由XML Map端口来处理不同 XML 之间的映射关系&#xff0c;主要的功能为&#xff1a;通过鼠标拖拽建立关系映射&#xff0c;将输入的源XML文件转换为目标XML文件。 XML Map端口的基本设置为&#xff1a; 源文件&#xff1a;配置源XML文件的模板…

【Java篇】备战面试——你真的了解“数组”的吗?

目录 数组概念 声明数组 数组默认值 数组拷贝及数组类型VS基本类型 Arrays类 二维数组 数组概念 在JAVA语言中数组是一种数据结构&#xff0c;是用来存储同一类型数据的集合或者序列&#xff0c;我们可以通过整型下标&#xff08;index&#xff0c;异或索引&#xf…

Centos7 docker搭建onlyoffice

注意&#xff1a;本文的命令使用的是 root 用户登录执行&#xff0c;不是 root 的话所有命令前面要加 sudo 一、安装docker 1、更新 yum 包&#xff08;使用 root 权限&#xff0c;生产环境中此步操作需慎重&#xff09; yum -y update yum -y update 升级所有包同时也升级软…

Set接口和常用方法

Set接口基本介绍 无序&#xff08;添加和取出顺序不一样&#xff09;&#xff0c;没有索引不允许重复元素&#xff0c;所以最多包含一个nullSet接口的常用方法和List一样&#xff0c;Set接口也是Collection的子接口&#xff0c;因此&#xff0c;常用方法和Collection接口一样 …

【C++】类与对象基本知识 (构造 析构 拷贝 explicit 对象数组 动态静态对象)

目录 1.类与对象基本概念 2.构造函数 3.析构函数 4.构造和析构函数调用顺序 5.拷贝构造函数 6.浅拷贝和深拷贝 7.初始化列表 8.explicit防止构造函数隐式转换 9.对象数组 10.动态对象 10.1 动态对象创建 10.2 动态对象数组 11.静态成员 11.1 静态成员变量 11.2 …

Java学习笔记(三)

Java学习笔记(三) 文章目录Java学习笔记(三)1 常用API1.1 类 Math1.1.1 abs1.1.2 ceil和floor1.2 System1.2.1 exit()1.2.2 currentTimeMillis()1.2.3 arraycopy()1.3 Runtime1.4 Object1.4.1 System.out.println底层原理1.4.2 equalsString类重写的equals方法1.5 对象克隆1.5.…

代码随想录训练营第24天|回溯算法理论基础、LeetCode 77.组合

参考 代码随想录 回溯算法理论基础 什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。回溯法是一种选优搜索法&#xf…

基于Matlab仿真极化双基地雷达系统以估计目标的范围和速度(附源码)

目录 一、系统设置 二、系统仿真 三、使用圆极化接收阵列 四、总结 五、程序 此示例演示如何仿真极化双基地雷达系统以估计目标的范围和速度。发射器、接收器和目标运动学被考虑在内。 一、系统设置 该系统以 300 MHz 的频率运行&#xff0c;使用线性 FM 波形&#xff0…

1526_AURIX TC275 BootROM下

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个是固件启动的流程介绍&#xff0c;在启动的过程中&#xff0c;HSM的RAM必然会被初始化掉。这个之前倒是没有注意到&#xff0c;HSM还是有专门的RAM的。自然&#xff0c;我自己接触到的…

基于springboot题库管理系统的设计与实现

目前&#xff0c;许多高校绝大多数课程还采用考教统一的模式来完成教学过程&#xff0c;这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性。另外随着各高校近年来学生规模的扩大&#xff0c;教学任务日益繁重&#xff0c;教师的工作量相应的不断增加。…

【Bio】基础生物学 - 蛋白质 protein

文章目录1. 蛋白质Ref1. 蛋白质 蛋白质是生命的物质基础&#xff0c;是有机大分子&#xff0c;是构成细胞的基本有机物&#xff0c;是生命活动的主要承担者。没有蛋白质就没有生命。 蛋白质的基本组成单位是 氨基酸 (amino acid)\blue{\text{氨基酸 (amino acid)}}氨基酸 (am…

【C++】树?堆?怎么实现?

新的一周过去了&#xff0c;大家有没有对上星期练习的题目更加熟练呢&#xff1f; 上星期和上上星期我们主要学习了顺序表&#xff0c;链表&#xff0c;和用这俩都能实现的栈和队列 那么今天我们看看堆又是什么结构 目录 1.树 介绍 2.堆 介绍 3.堆的实现 1.树の介绍 不就是树…

cartopy绘制中国降雨地图

常用的地图可视化的编程工具有 MATLAB、IDL、R、GMT、NCL 等。相比于ArcGIS、QGIS和ArcGISpro用鼠标点来点去&#xff0c;编程绘图也是有很大的优点的&#xff0c;方便&#xff0c;可批量&#xff0c;美观。 大气科学和气象的朋友们一直使用的应该是 NCL&#xff0c;易用性不错…

Windows 编写自动复制备份、删除文件定时任务脚本

目录 一、backup.bat 脚本内容如下&#xff1a; 二、脚本内容解析 1.自动生成当天日期的目录 2. 删除前 n 天的文件 forfile 命令参数说明&#xff1a; 3.复制文件到指定目录 robocopy 命令参数说明&#xff1a; 结论&#xff1a; 三、设置定时任务 1. 打开 控制面板…