如何使用Java读取Excel文件到List>格式

引言

在开发过程中,我们经常会遇到需要读取Excel文件并将数据转换成Java对象的需求。Apache POI是一个强大的库,它提供了读取和写入Microsoft Office格式文件的功能,包括Excel。本文将指导你如何使用Apache POI读取Excel文件,并将数据转换为List<Map<String, String>>格式,便于进一步的数据处理和分析。

准备工作

首先,确保你的项目中包含了Apache POI的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖:

复制代码
<!--        excel reader-start-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version> <!-- 使用你所需的版本号 -->
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version> <!-- 同上 -->
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.17.1</version> <!-- 使用你所需要的版本 -->
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.17.1</version> <!-- 同上 -->
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version> <!-- 使用你需要的版本 -->
        </dependency>
    <!--        excel reader-end -->

步骤详解

下面是使用Apache POI读取Excel文件的具体步骤:

复制代码
package com.xsz.programmingarsenal.utils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelReader {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream(new File("C:\\tmp\\test.xlsx"));
            Workbook workbook = new XSSFWorkbook(fis);
            Sheet sheet = workbook.getSheetAt(0); // 假设我们只读取第一个工作表
            List<Map<String, String>> data = new ArrayList<>();

            // 获取第一行作为列头
            Row headerRow = sheet.getRow(0);
            if (headerRow != null) {
                for (int i = 1; i <= sheet.getLastRowNum(); i++) { // 从第二行开始读取数据
                    Row row = sheet.getRow(i);
                    if (row != null) {
                        Map<String, String> rowData = new HashMap<>();
                        for (Cell cell : headerRow) {
                            int colIndex = cell.getColumnIndex();
                            Cell dataCell = row.getCell(colIndex);
                            if (dataCell != null) {
//                                rowData.put(cell.getStringCellValue(), dataCell.getStringCellValue());
                                rowData.put(getStringValue(cell), getStringValue(dataCell));
                            }
                        }
                        data.add(rowData);
                    }
                }
            }

            // 关闭资源
            workbook.close();
            fis.close();

            // 打印结果
            System.out.println(data);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static  String getStringValue(Cell cell ){
        CellType cellType = cell.getCellType();
        String cellValue = null;

        switch (cellType) {
            case STRING:
                cellValue = cell.getStringCellValue();
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 如果是日期格式的数值,则转换为日期字符串
                    cellValue = cell.getDateCellValue().toString();
                } else {
                    // 否则,转换为数字字符串
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA:
                // 处理公式单元格
                cellValue = cell.getCellFormula();
                break;
            case BLANK:
                cellValue = ""; // 或者null,取决于你的需求
                break;
            case ERROR:
                cellValue = "ERROR"; // 或者抛出异常,取决于你的需求
                break;
            default:
                throw new IllegalStateException("Unexpected cell type: " + cellType);
        }
        return  cellValue;

// 现在你可以安全地使用cellValue了
    }
}

测试

测试数据

结果

结语

通过上述步骤,你现在已经掌握了如何使用Java和Apache POI库读取Excel文件,并将数据转换为List<Map<String, String>>格式的方法。这种方法非常适合需要对Excel数据进行进一步处理和分析的场景。希望这篇博客能帮助你在日常开发中更加高效地处理Excel文件。

相关推荐
Mr_Air_Boy27 分钟前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?1 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘1 小时前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖1 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu1 小时前
java内存模型JMM
java·开发语言
UFIT2 小时前
NoSQL之redis哨兵
java·前端·算法
刘 大 望2 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql
怀旧,2 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
大春儿的试验田3 小时前
Parameter ‘XXX‘ not found. Available parameters are [list, param1]
java
程序员JerrySUN3 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构