Springboot下导入导出excel

news/2024/11/27 20:13:31/

目录

  • 1. Apache POI
    • 1.1 引入Apache POI依赖
    • 1.2 用法
      • 💗1.2.1 创建Excel的元素
        • 1.2.1.1 创建 WokrBook
        • 1.2.1.2 创建 Sheet
        • 1.2.1.3 创建行 Row
        • 1.2.1.4 创建单元格 Cell
        • 1.2.1.5 填充数据
        • 1.2.1.6 生成文件
      • 💙1.2.2 样式和字体
        • 1.2.2.1 左右垂直居中
        • 1.2.2.2 字体加粗、颜色
        • 1.2.2.3 调整列宽和高
        • 1.2.2.4 倾斜、下划线
      • 💚1.2.3 进阶用法
        • 1.2.3.1 合并单元格
        • 1.2.3.2 数据校验
        • 1.2.3.3 公式
        • 1.2.3.4 下拉选择
        • 1.2.3.5 设置单元格的数据类型
    • 1.3 导出
    • 1.4 导出
  • 2. EasyExcel

Spring Boot项目中实现 Excel 的导入导出功能,里推荐使用 Apache POIEasyExcel 两个库。

Apache POI 是 Apache 软件基金会的开源函式库,功能全面强大,但是代码书写冗余繁杂,读写大文件耗费内存较大,容易 OOM

EasyExcel 是一个基于 Apache POI 开发的开源 Java 库,用于简化 Excel 文件的读写操作,可以把内存消耗从100M左右降低到10M以内,并且再大的 Excel 不会出现内存溢出。

1. Apache POI

Excel 是由四个元素组成的分别是:WorkBook(工作簿)Sheet(工作表)Row(行)Cell(单元格),一个 WorkBook 可以包含多个Sheet,一个 Sheet 又是由多个 Row 组成,一个 Row 是由多个 Cell 组成。

1.1 引入Apache POI依赖

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

1.2 用法

💗1.2.1 创建Excel的元素

创建WorkBook(工作簿)Sheet(工作表)Row(行)Cell(单元格)

1.2.1.1 创建 WokrBook
Workbook workbook = new XSSFWorkbook();
1.2.1.2 创建 Sheet
Sheet sheet = workbook.createSheet();

设置 sheet 的名称:

Sheet sheet = workbook.createSheet("sheet名称");
1.2.1.3 创建行 Row
Row row = sheet.createRow(0);
1.2.1.4 创建单元格 Cell
Cell cell = row.createCell(0, CellType.STRING);

可以指定单元格的类型,支持的类型有下面7种:

    _NONE(-1),NUMERIC(0),STRING(1),//公式FORMULA(2),BLANK(3),//布尔BOOLEAN(4),ERROR(5);
1.2.1.5 填充数据
cell.setCellValue("苹果");
1.2.1.6 生成文件
workbook.write(new FileOutputStream(fileName));

💙1.2.2 样式和字体

如果我们需要导出的 Excel 美观一些,如设置字体的样式加粗、颜色、大小等等,就需要创建样式和字体。

创建样式:

CellStyle cellStyle = workbook.createCellStyle();
1.2.2.1 左右垂直居中
//左右居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置垂直居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
1.2.2.2 字体加粗、颜色

创建加粗样式并设置到 CellStyle 中:

Font font = workbook.createFont();
//字体颜色为红色
font.setColor(IndexedColors.RED.getIndex());
//字体加粗
font.setBold(true);
cellStyle.setFont(font);

指定 Cell 单元格使用该样式:

cell.setCellStyle(cellStyle);

在这里插入图片描述

1.2.2.3 调整列宽和高
Sheet sheet = workbook.createSheet();
//自动调整列的宽度来适应内容
sheet.autoSizeColumn(int column); 
// 设置列的宽度
sheet.setColumnWidth(2, 20 * 256); 

autoSizeColumn() 传递的参数就是要设置的列索引setColumnWidth() 第一个参数是要设置的列索引,第二参数是具体的宽度值宽度 = 字符个数 * 256(例如20个字符的宽度就是20 * 256)

在这里插入图片描述

1.2.2.4 倾斜、下划线
Font font = workbook.createFont();
font.setItalic(true); //设置倾斜
font.setUnderline(U_SINGLE); //设置下划线

在这里插入图片描述

💚1.2.3 进阶用法

1.2.3.1 合并单元格
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));

CellRangeAddress()方法四个参数分别是:

  • fristRow:起始行
  • lastRow:结束行
  • fristCol:起始列
  • lastCol:结束列

如果你想合并从第一行到第二行从一列到第十列的单元格(一共合并20格),那么就是CellRangeAddress(0,1,0,9)

在这里插入图片描述

1.2.3.2 数据校验
//创建数据验证
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
//创建要添加校验的单元格对象
CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 9);
//创建必填校验规则
DataValidationConstraint constraint = validationHelper.createCustomConstraint("NOT(ISBLANK(A1))");
//设置校验
DataValidation validation = dvHelper.createValidation(constraint, addressList);
//校验不通过 提示
validation.setShowErrorBox(true);
sheet.addValidationData(validation);
1.2.3.3 公式
  • SUM:求和函数
// 创建公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
// 创建计算单元格,填充计算公式,并计算SUM公式结果
Row sumRow = sheet.createRow(3);
Cell sumCell = sumRow.createCell(3);
sumCell.setCellFormula("SUM(D2:D3)");
sumCell.setCellValue(evaluator.evaluate(sumCell).getNumberValue());

在这里插入图片描述

  • AVERAGE:平均数函数
// 创建公式
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
// 创建计算单元格,填充计算公式,并计算AVERAGE公式结果
Row avgRow = sheet.createRow(dataList.size());
Cell avgCell = avgRow.createCell(3);
avgCell.setCellFormula("AVERAGE(D2:D3)");
avgCell.setCellValue(evaluator.evaluate(avgCell).getNumberValue());

在这里插入图片描述

1.2.3.4 下拉选择
1.2.3.5 设置单元格的数据类型
  • 数字格式
// 设置单元格样式 - 数字格式
CellStyle numberCellStyle = workbook.createCellStyle();
numberCellStyle.setDataFormat(workbook.createDataFormat().getFormat("#,##0.00"));
//指定单元格
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellStyle(numberCellStyle);
  • 日期格式
// 设置单元格样式 - 日期格式
CellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setDataFormat(workbook.createDataFormat().getFormat("yyyy-MM-dd"));
//指定单元格
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellStyle(dateCellStyle);

1.3 导出

在这里插入代码片

1.4 导出

2. EasyExcel

https://blog.csdn.net/qq_42785250/article/details/129654178
https://blog.51cto.com/u_16213334/11775590

https://www.jb51.net/program/32842874j.htm
https://zyqok.blog.csdn.net/article/details/121994504#comments_35231204


http://www.ppmy.cn/news/1550432.html

相关文章

想自学成黑客(白帽子),零基础小白如何自学黑客(网络安全)?

前言&#xff1a;如何系统的自学黑客&#xff1f;最近很多小伙伴和粉丝都想自学成黑客&#xff08;白帽子&#xff09;&#xff0c;那么零基础小白该从哪里开始学呢&#xff1f; 在学习之前&#xff0c;要给自己定一个目标或者思考一下要达到一个什么样的水平&#xff0c;是学完…

Unity图形学之BRDF双向反射分布函数

1.描述了入射光线在非透明物体表面如何进行反射&#xff0c;也就是说多少光发生了漫反射&#xff0c;多少光发生了镜面反射 BRDF 函数计算的是“特定反射方向的光强与入射光强的比例” 2.各向异性 与 均向性 相反&#xff0c;是指在不同方向具有不同行为的性质&#xff0c;也就…

算法新篇章:AI如何在数学领域超越人类

人工智能咨询培训老师叶梓 转载标明出处 尽管大模型在很多领域表现出色&#xff0c;比如理解自然语言和生成文本&#xff0c;但它们在解决一些复杂的推理任务时&#xff0c;比如数学问题、编程挑战或者医疗诊断&#xff0c;还是显得有些力不从心。最近&#xff0c;一个来自中国…

C++网络编程:select IO多路复用及TCP服务器开发

C网络编程&#xff1a;使用select实现IO多路复用 一、什么是 IO 多路复用&#xff1f;二、IO多路复用器 select三、相关接口3.1、fd_set 结构体3.2、宏和函数 四、select 实现 TCP 服务器五、总结 一、什么是 IO 多路复用&#xff1f; 在网络编程中&#xff0c;最容易想到的并…

Vue.js - 组件化编程

1. 前言 Vue.js是一个基于组件的Javascript框架&#xff0c;组件化编程是核心思想之一。通过组件化&#xff0c;Vue允许开发者将用户页面拆分成独立&#xff0c;可重用的部分&#xff0c;从而提升代码的可维护性&#xff0c;可读性以及可服用性。 本文主要讲解在Vue2中组件化…

量化交易系统开发-实时行情自动化交易-4.4.1.做市策略实现

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略实现。 做市策…

Redis突然变慢,有哪些原因?

目录 一、存在bigkey 二、如果Redis 实例设置了内存上限 maxmemory&#xff0c;有可能导致 Redis 变慢 三、开启了内存大页 四、使用了Swap 五、网络带宽过载 六、频繁短连接 一、存在bigkey 如果Redis实例中存储了 bigkey&#xff0c;那么在淘汰删除 bigkey 释放内存时&…

pip安装github上的开源软件包

1、若本机中安装的有git&#xff0c;可使用githttps方式安装 # 以安装pyfolio软件包为例,安装指令如下 pip install githttps://github.com/quantopian/pyfolio.git 2、若本机中没有安装git&#xff0c;可以直接使用软件包的zip地址进行安装 # 以安装pyfolio软件包为例,安装…