SpringBoot整合POIExcel: 实现导入导出Excel功能
- SpringBoot整合POIExcel: 实现导入导出Excel功能
- 摘要
- 引言
- 依赖
- Poi包结构
- 读取Excel表格
- 读取Excel表格
- 写入Excel表格
- 实战测试
- 导入表格
- 导出表格
- 代码实现细节
博主 默语带您 Go to New World.
✍ 个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨
SpringBoot整合POIExcel: 实现导入导出Excel功能
摘要
本文将介绍如何在Spring Boot项目中整合POI(Poor Obfuscation Implementation)库来实现Excel文件的导入和导出功能。通过使用POI库,我们可以方便地读取和写入Excel文件,为项目的数据管理提供了便利。
引言
在许多企业应用程序中,Excel文件是一种常见的数据交换和管理方式。Spring Boot作为一个流行的Java开发框架,提供了许多便捷的工具和库来简化开发过程。POI库是Apache软件基金会的一个项目,提供了Java操作Microsoft Office格式文件的功能。结合Spring Boot和POI库,我们可以轻松地实现Excel文件的导入和导出。
依赖
首先,我们需要在项目的pom.xml文件中添加POI库的依赖:
xmlCopy code<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>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
Poi包结构
Apache POI库提供了多个子模块来处理不同类型的Office文件,例如HSSF用于操作Excel的XLS格式,XSSF用于操作Excel的OOXML格式,HWPF用于操作Word的DOC格式,HSLF用于操作PowerPoint文件等。
读取Excel表格
读取一行,获取一行的所有单元格数据的示例代码如下:
public static void t1(){
try {
// 1. 获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook("E:\\test.xlsx");
// 2. 获取工作表
XSSFSheet sheet = workbook.getSheetAt(0);
// 3. 获取行
for (Row row : sheet){
// 4. 获取单元格
for (Cell cell : row){
// 获取单元格的内容
String value = cell.getStringCellValue();
System.out.println(value);
}
}
// 释放资源
workbook.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
读取Excel表格
读取一行,获取一行的所有单元格数据
public static void t1(){
try {
// 1. 获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook("E:\\test.xlsx");
// 2. 获取工作表
XSSFSheet sheet = workbook.getSheetAt(0);
// 3. 获取行
for (Row row : sheet){
// 4. 获取单元格
for (Cell cell : row){
// 获取单元格的内容
String value = cell.getStringCellValue();
System.out.println(value);
}
}
// 释放资源
workbook.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
写入Excel表格
写入一行之后,写入第二行
public static void t1(){
try {
// 1. 获取工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 获取工作表
XSSFSheet sheet = workbook.createSheet("工作表一");
// 3.创建行
XSSFRow row = sheet.createRow(0);
// 4.创建单元格
row.createCell(0).setCellValue("郭明然");
row.createCell(1).setCellValue("窦凯欣");
row.createCell(2).setCellValue("郭明然");
// 创建行
XSSFRow row1 = sheet.createRow(1);
// 创建单元格
row1.createCell(0).setCellValue("汤姆");
row1.createCell(1).setCellValue("杰瑞");
row1.createCell(2).setCellValue("皮神");
FileOutputStream out = new FileOutputStream("E:\\t.xlsx");
workbook.write(out);
out.flush(); // 刷新资源
// 释放资源
out.close();
workbook.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
实战测试
导入表格
public static void main(String[] args) throws IOException, ParseException {
List<User> read = read("E:\\test.xlsx");
}
/**
* 读取 Excel 文件并将数据转换为 User 对象列表
*
* @param path Excel 文件路径
* @return User 对象列表
* @throws IOException 读取文件时可能抛出的异常
* @throws ParseException 解析日期时可能抛出的异常
*/
public static List<User> read(String path) throws IOException, ParseException {
List<User> userList = new ArrayList<>();
// 1. 获取工作簿
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(path);
// 2. 获取工作表
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
// 获取实际的行数,不包括空行
int totalRows = sheet.getPhysicalNumberOfRows();
for (int i = 1; i < totalRows; i++) {
XSSFRow row = sheet.getRow(i);
if (row != null) {
ArrayList<String> list = new ArrayList<>();
for (Cell cell : row) {
if (cell != null) {
cell.setCellType(CellType.STRING);
String value = cell.getStringCellValue();// 读取数据
System.out.println("单元格值: '" + value + "'");
// 检查单元格值是否为空
if (value != null && !value.trim().isEmpty()) {
list.add(value);
}
}
}
// 检查是否有足够的列数
if (list.size() >= 6) {
String dateString = list.get(4);
String dateString2 = list.get(5);
// 处理 Excel 序列数转换为日期
double excelDate1 = Double.parseDouble(dateString);
double excelDate2 = Double.parseDouble(dateString2);
// 转换 Excel 日期为 Java 日期
Date parse = convertExcelDateToJavaDate(excelDate1);
Date parse2 = convertExcelDateToJavaDate(excelDate2);
// 创建 User 对象并添加到列表
User user = new User(Long.parseLong(list.get(0)), list.get(1), Integer.parseInt(list.get(2)),
list.get(3), parse, parse2);
userList.add(user);
}
}
}
return userList;
}
/**
* 将 Excel 序列数转换为 Java 日期
*
* @param excelDate Excel 中的日期序列数
* @return Java 日期对象
*/
private static Date convertExcelDateToJavaDate(double excelDate) {
// Excel 的起始日期是 1900 年 1 月 1 日
// Excel 序列数中,1 对应于 1900 年 1 月 1 日
// 所以需要减去 1,然后使用 Date 类的构造函数转换为 Java 的 Date 对象
return new Date((long) ((excelDate - 1) * 24 * 60 * 60 * 1000));
}
导出表格
public static void main(String[] args) throws IOException, ParseException {
ArrayList<User> users = new ArrayList<>();
User user = new User();
user.setId(1L);
user.setName("郭明然");
user.setAge(18);
user.setEmail("18@...cc");
User user2 = new User();
user2.setId(2L);
user2.setName("窦凯欣");
user2.setAge(18);
user2.setEmail("18@...cc");
users.add(user);
users.add(user2);
write(users,"E:\\test3.xlsx");
}
public static void write(List<User> userList, String path) throws IOException {
// 创建一个工作簿
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
// 创建工作表
XSSFSheet sheet = xssfWorkbook.createSheet("用户");
// 创建行
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("id");
row.createCell(1).setCellValue("姓名");
row.createCell(2).setCellValue("年龄");
row.createCell(3).setCellValue("邮箱");
for (int i = 0; i < userList.size(); i++) {
XSSFRow row1 = sheet.createRow(i + 1);
row1.createCell(0).setCellValue(userList.get(i).getId());
row1.createCell(1).setCellValue(userList.get(i).getName());
row1.createCell(2).setCellValue(userList.get(i).getAge());
row1.createCell(3).setCellValue(userList.get(i).getEmail());
}
FileOutputStream fileOutputStream = new FileOutputStream(path);
xssfWorkbook.write(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
}
代码实现细节
package com.lyh.mp.utils;
import com.lyh.mp.entity.User;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
public class POIUtils {
public static ResponseEntity<byte[]> student2Excel(List<User> list){
//1. 创建一个 Excel 文档
HSSFWorkbook workbook = new HSSFWorkbook();
//2. 创建文档摘要
workbook.createInformationProperties();
//3. 获取并配置文档信息
DocumentSummaryInformation docInfo = workbook.getDocumentSummaryInformation();
//文档类别
docInfo.setCategory("学生信息");
//文档管理员
docInfo.setManager("huanji");
//设置公司信息
docInfo.setCompany("www.huanji.org");
//4. 获取文档摘要信息
SummaryInformation summInfo = workbook.getSummaryInformation();
//文档标题
summInfo.setTitle("学生信息表");
//文档作者
summInfo.setAuthor("huanji");
// 文档备注
summInfo.setComments("本文档由 huanji 提供");
//5. 创建样式
//创建标题行的样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//创建日期单元格的样式
HSSFCellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
HSSFSheet sheet = workbook.createSheet("学生信息表");
//设置列的宽度
sheet.setColumnWidth(0, 5 * 256);
sheet.setColumnWidth(1, 12 * 256);
sheet.setColumnWidth(2, 10 * 256);
sheet.setColumnWidth(3, 5 * 256);
sheet.setColumnWidth(4, 12 * 256);
sheet.setColumnWidth(5, 20 * 256);
sheet.setColumnWidth(6, 10 * 256);
sheet.setColumnWidth(7, 10 * 256);
sheet.setColumnWidth(8, 16 * 256);
sheet.setColumnWidth(9, 12 * 256);
sheet.setColumnWidth(10, 15 * 256);
sheet.setColumnWidth(11, 20 * 256);
sheet.setColumnWidth(12, 16 * 256);
sheet.setColumnWidth(13, 14 * 256);
sheet.setColumnWidth(14, 14 * 256);
sheet.setColumnWidth(15, 12 * 256);
sheet.setColumnWidth(16, 8 * 256);
sheet.setColumnWidth(17, 20 * 256);
sheet.setColumnWidth(18, 20 * 256);
sheet.setColumnWidth(19, 15 * 256);
sheet.setColumnWidth(20, 8 * 256);
sheet.setColumnWidth(21, 25 * 256);
sheet.setColumnWidth(22, 14 * 256);
sheet.setColumnWidth(23, 15 * 256);
sheet.setColumnWidth(24, 15 * 256);
//6.创建标题行
HSSFRow r0 = sheet.createRow(0);
HSSFCell c0 = r0.createCell(0);
c0.setCellValue("ID");
c0.setCellStyle(headerStyle);
HSSFCell c1 = r0.createCell(1);
c1.setCellStyle(headerStyle);
c1.setCellValue("名字");
HSSFCell c2 = r0.createCell(2);
c2.setCellStyle(headerStyle);
c2.setCellValue("年龄");
HSSFCell c3 = r0.createCell(3);
c3.setCellStyle(headerStyle);
c3.setCellValue("email");
HSSFCell c4 = r0.createCell(4);
c4.setCellStyle(headerStyle);
c4.setCellValue("创建时间");
HSSFCell c5 = r0.createCell(5);
c5.setCellStyle(headerStyle);
c5.setCellValue("更新时间");
for(int i = 0; i < list.size(); i++){
User s = list.get(i);
HSSFRow row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(s.getId());
row.createCell(1).setCellValue(s.getName());
row.createCell(2).setCellValue(s.getAge());
row.createCell(3).setCellValue(s.getEmail());
// 设置时间格式
HSSFCellStyle cellStyle = workbook.createCellStyle();
HSSFDataFormat dataFormat = workbook.createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("yyyy-MM-dd HH:mm:ss"));
HSSFCell createTimeCell = row.createCell(4);
createTimeCell.setCellValue(s.getCreateTime());
createTimeCell.setCellStyle(cellStyle);
HSSFCell updateTimeCell = row.createCell(5);
updateTimeCell.setCellValue(s.getUpdateTime());
updateTimeCell.setCellStyle(cellStyle);
}
// 将Excel数据写入字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HttpHeaders headers = new HttpHeaders();
try {
//设置到处文件的文件名,病指定编码
headers.setContentDispositionFormData("attachment", new String("学生信息表.xls".getBytes("UTF-8"), "ISO-8859-1"));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 将Excel数据写入字节数组
workbook.write(baos);
} catch (IOException e) {
e.printStackTrace();
}
// 返回包含Excel 数据字节数组的ResponseEntity对象
return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);
}
}
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )
点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。
文章来源为:1,2