SpringBoot使用Apache POI庫讀取Excel文件的操作詳解
項(xiàng)目背景
假設(shè)我們需要開發(fā)一個功能,讀取一個Excel文件中的數(shù)據(jù)并進(jìn)行處理。通常,這樣的需求會出現(xiàn)在以下場景中:
- 數(shù)據(jù)遷移:將Excel表格的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫。
- 數(shù)據(jù)分析:對Excel中的數(shù)據(jù)進(jìn)行匯總、統(tǒng)計分析。
- 批量處理:從Excel文件中讀取配置信息或參數(shù)進(jìn)行批量處理。 在本篇文章中,我們將展示如何使用Java讀取Excel文件,獲取其中的數(shù)據(jù),并展示如何將這些數(shù)據(jù)轉(zhuǎn)化為業(yè)務(wù)對象以便后續(xù)處理。
依賴導(dǎo)入
首先,你需要在項(xiàng)目中添加Apache POI的依賴。這里使用的是Apache POI 3.x版本,你可以在pom.xml中加入如下依賴:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
這個依賴包包括了讀取xlsx格式的支持,如果需要支持更老的xls格式,可以再加上poi模塊。
讀取Excel模板的實(shí)現(xiàn)
接下來,我們來看一個簡單的示例代碼,展示如何讀取Excel文件的內(nèi)容,并對數(shù)據(jù)進(jìn)行處理。我們將以一個示例Excel表格為例,假設(shè)表格的內(nèi)容如下:
| 姓名 | 年齡 | 性別 |
|---|---|---|
| 張三 | 25 | 男 |
| 李四 | 30 | 女 |
| 王五 | 28 | 男 |
代碼實(shí)現(xiàn)
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 讀取Excel文件并進(jìn)行數(shù)據(jù)處理的服務(wù)類
*/
@Service
@Slf4j
public class ReadExcelServiceImpl {
public Boolean readExcel() {
try {
String pathStr = "/path/to/your/excel/file.xlsx";
// excel文件路徑
FileInputStream fis = new FileInputStream(pathStr);
// 創(chuàng)建一個工作簿對象
Workbook workbook = new XSSFWorkbook(fis);
// 獲取第一個工作表
Sheet sheet = workbook.getSheetAt(0);
// 獲取總行數(shù)
int lastRowNum = sheet.getLastRowNum();
// 存放Excel讀取的數(shù)據(jù)列表
List<ExcelDemoInfoDTO> demoInfoList = new ArrayList<>();
// 讀取數(shù)據(jù)。循環(huán)遍歷行,從第二行開始,假設(shè)第一行是標(biāo)題行
for (int i = 1; i <= lastRowNum; i++) {
log.info("Reading row {}", i);
Row row = sheet.getRow(i);
if (row != null) {
try {
// 獲取單元格的值
String cell0 = getCellValue(row.getCell(0)); // 姓名
String cell1 = getCellValue(row.getCell(1)); // 年齡
String cell2 = getCellValue(row.getCell(2)); // 性別
// 創(chuàng)建數(shù)據(jù)對象并設(shè)置字段
ExcelDemoInfoDTO demoInfoDTO = new ExcelDemoInfoDTO();
demoInfoDTO.setName(cell0);
demoInfoDTO.setAge(Integer.parseInt(cell1));
demoInfoDTO.setGender(cell2);
// 將數(shù)據(jù)對象加入到列表
demoInfoList.add(demoInfoDTO);
} catch (Exception e) {
log.error("Error reading row {}", i, e);
}
}
}
// 使用Jackson將讀取的數(shù)據(jù)轉(zhuǎn)換為JSON字符串
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(demoInfoList);
System.out.println(json);
// 關(guān)閉資源
workbook.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 獲取單元格的值,處理不同類型的單元格
*
* @param cell 單元格對象
* @return 單元格的字符串值
*/
private static String getCellValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
return String.valueOf((int) cell.getNumericCellValue());
default:
return "";
}
}
}
代碼解析
- 打開Excel文件 使用FileInputStream打開指定路徑的Excel文件,然后通過XSSFWorkbook將其加載為工作簿(Workbook)。
- 讀取Excel工作表 通過workbook.getSheetAt(0)獲取第一個工作表(Sheet)。你可以根據(jù)需要更改getSheetAt中的索引值來獲取其他工作表。
- 遍歷行和列 使用sheet.getRow(i)獲取每一行的數(shù)據(jù)。我們從第二行開始讀?。╥=1),因?yàn)榈谝恍型ǔJ菢?biāo)題行。
- 獲取單元格內(nèi)容 通過row.getCell(i)獲取每一列的內(nèi)容,并使用getCellValue方法根據(jù)單元格的類型(字符串、數(shù)字等)獲取對應(yīng)的值。
- 封裝數(shù)據(jù) 將每行的數(shù)據(jù)封裝為一個業(yè)務(wù)對象(ExcelDemoInfoDTO),并將其加入到一個列表中。
- 轉(zhuǎn)換為JSON格式 使用Jackson庫將讀取的數(shù)據(jù)轉(zhuǎn)化為JSON格式,以便后續(xù)的處理或傳輸。
- 資源關(guān)閉 使用完畢后,關(guān)閉workbook和FileInputStream以釋放資源。
ExcelDemoInfoDTO 數(shù)據(jù)傳輸對象
為了更好地封裝數(shù)據(jù),我們創(chuàng)建一個簡單的DTO(數(shù)據(jù)傳輸對象)類ExcelDemoInfoDTO:
public class ExcelDemoInfoDTO {
private String name;
private int age;
private String gender;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
總結(jié)
在本次實(shí)踐中,我們介紹了如何使用Apache POI庫在Java中讀取Excel文件,獲取其中的數(shù)據(jù),并將這些數(shù)據(jù)封裝為業(yè)務(wù)對象。通過這種方式,我們可以靈活地讀取各種格式的Excel數(shù)據(jù),并進(jìn)行后續(xù)的業(yè)務(wù)處理。對于更復(fù)雜的Excel文件,我們還可以進(jìn)一步擴(kuò)展代碼來處理更多類型的單元格、跨工作表讀取等情況。
以上就是SpringBoot使用Apache POI庫讀取Excel文件的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Apache POI庫讀取Excel的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例
在Java 5.0之前啟動一個任務(wù)是通過調(diào)用Thread類的start()方法來實(shí)現(xiàn)的,5.0里提供了一個新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,并且可以建立一個類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務(wù),下面看一個示例2014-01-01
springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
MyBatis框架迭代器模式實(shí)現(xiàn)原理解析
這篇文章主要介紹了MyBatis框架迭代器模式實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Mybatis千萬級數(shù)據(jù)查詢的解決方式,避免OOM問題
這篇文章主要介紹了Mybatis千萬級數(shù)據(jù)查詢的解決方式,避免OOM問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java中BM(Boyer-Moore)算法的圖解與實(shí)現(xiàn)
本文主要介紹了兩個大的部分,第一部分通過圖解的方式講解BM算法,第二部分則代碼實(shí)現(xiàn)一個簡易的BM算法,感興趣的小伙伴可以學(xué)習(xí)一下2022-05-05
基于java下載中g(shù)etContentLength()一直為-1的一些思路
下面小編就為大家?guī)硪黄趈ava下載中g(shù)etContentLength()一直為-1的一些思路。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06

