Java自动化获取Excel工作表名称的示例代码

下面我将提供几种常用的Java方法来获取Excel文件中的工作表(sheet)名称,主要基于Apache POI库(处理.xlsx和.xls格式)和EasyExcel库(适合大数据量.xlsx文件)。

图片[1]_Java自动化获取Excel工作表名称的示例代码_知途无界

方法一:使用Apache POI(推荐,支持.xls和.xlsx)

1. 添加Maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version> <!-- 使用最新稳定版 -->
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version> <!-- 支持xlsx格式 -->
</dependency>

2. 示例代码:获取所有工作表名称

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelSheetReader {
    
    /**
     * 获取Excel文件中所有工作表的名称
     * @param filePath Excel文件路径
     * @return 工作表名称列表
     */
    public static List<String> getExcelSheetNames(String filePath) {
        List<String> sheetNames = new ArrayList<>();
        
        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = WorkbookFactory.create(fis)) {
            
            // 获取工作簿中所有工作表的数量
            int numberOfSheets = workbook.getNumberOfSheets();
            
            // 遍历所有工作表并获取名称
            for (int i = 0; i < numberOfSheets; i++) {
                String sheetName = workbook.getSheetAt(i).getSheetName();
                sheetNames.add(sheetName);
                System.out.println("工作表 " + (i + 1) + ": " + sheetName);
            }
            
        } catch (IOException e) {
            System.err.println("读取Excel文件时出错: " + e.getMessage());
            e.printStackTrace();
        }
        
        return sheetNames;
    }

    public static void main(String[] args) {
        // 示例用法
        String excelFilePath = "example.xlsx"; // 替换为你的Excel文件路径
        List<String> sheets = getExcelSheetNames(excelFilePath);
        
        System.out.println("\n共获取到 " + sheets.size() + " 个工作表:");
        sheets.forEach(System.out::println);
    }
}

3. 代码说明

  • WorkbookFactory.create()​​:自动识别Excel格式(.xls或.xlsx)并创建相应的Workbook对象
  • getNumberOfSheets()​​:获取工作簿中工作表的总数
  • getSheetAt(index)​​:通过索引获取工作表对象
  • getSheetName()​​:获取工作表的名称
  • try-with-resources​:确保文件流和Workbook对象正确关闭

方法二:仅使用POI-XSSF(仅支持.xlsx格式)

如果只需要处理.xlsx格式,可以使用更轻量的XSSF实现:

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelXSSFSheetReader {
    
    public static List<String> getXlsxSheetNames(String filePath) {
        List<String> sheetNames = new ArrayList<>();
        
        try (FileInputStream fis = new FileInputStream(filePath);
             XSSFWorkbook workbook = new XSSFWorkbook(fis)) {
            
            int numberOfSheets = workbook.getNumberOfSheets();
            
            for (int i = 0; i < numberOfSheets; i++) {
                sheetNames.add(workbook.getSheetAt(i).getSheetName());
            }
            
        } catch (IOException e) {
            System.err.println("读取Excel文件时出错: " + e.getMessage());
        }
        
        return sheetNames;
    }
}

方法三:使用EasyExcel(适合大数据量,仅.xlsx)

对于非常大的Excel文件,EasyExcel提供更高效的内存管理:

1. 添加Maven依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version> <!-- 使用最新版本 -->
</dependency>

2. 示例代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class EasyExcelSheetReader {
    
    public static List<String> getEasyExcelSheetNames(String filePath) {
        List<String> sheetNames = new ArrayList<>();
        File excelFile = new File(filePath);
        
        try (ExcelReader excelReader = EasyExcel.read(excelFile).build()) {
            // 获取所有工作表信息
            List<ReadSheet> readSheets = excelReader.excelExecutor().sheetList();
            
            for (ReadSheet readSheet : readSheets) {
                sheetNames.add(readSheet.getSheetName());
            }
            
        } catch (Exception e) {
            System.err.println("读取Excel文件时出错: " + e.getMessage());
            e.printStackTrace();
        }
        
        return sheetNames;
    }
}

方法四:获取特定工作表的数据(扩展功能)

如果需要进一步读取特定工作表的数据,可以扩展上述方法:

import org.apache.poi.ss.usermodel.*;

public class ExcelDataReader {
    
    /**
     * 读取指定工作表的数据
     * @param filePath Excel文件路径
     * @param sheetName 工作表名称
     */
    public static void readSpecificSheet(String filePath, String sheetName) {
        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = WorkbookFactory.create(fis)) {
            
            // 通过名称获取工作表
            Sheet sheet = workbook.getSheet(sheetName);
            
            if (sheet == null) {
                System.out.println("未找到名为 '" + sheetName + "' 的工作表");
                return;
            }
            
            System.out.println("\n读取工作表: " + sheetName);
            
            // 遍历行和单元格
            for (Row row : sheet) {
                for (Cell cell : row) {
                    // 根据单元格类型获取值
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.print(cell.getDateCellValue() + "\t");
                            } else {
                                System.out.print(cell.getNumericCellValue() + "\t");
                            }
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        case FORMULA:
                            System.out.print(cell.getCellFormula() + "\t");
                            break;
                        default:
                            System.out.print(" \t");
                    }
                }
                System.out.println(); // 换行
            }
            
        } catch (Exception e) {
            System.err.println("读取工作表数据时出错: " + e.getMessage());
        }
    }
}

常见问题解决

1. 文件格式不支持错误

  • 问题​:尝试读取旧版.xls文件时出现错误
  • 解决​:确保使用poi-ooxml依赖处理.xlsx,poi依赖处理.xls,或使用WorkbookFactory自动识别

2. 文件路径问题

  • 问题​:文件找不到或路径错误
  • 解决​:使用绝对路径或确保相对路径正确,推荐使用Paths.get()File类处理路径

3. 内存溢出(大数据量.xlsx)

  • 问题​:处理大型Excel文件时内存不足
  • 解决​:使用EasyExcel库或POI的SXSSF(流式API)

4. 编码问题(中文表名)

  • 问题​:工作表名称中文乱码
  • 解决​:确保使用UTF-8编码,POI通常能正确处理中文表名

最佳实践建议

  1. 异常处理​:始终包含适当的try-catch块处理IO异常
  2. 资源管理​:使用try-with-resources确保文件流正确关闭
  3. 格式检测​:使用WorkbookFactory自动识别格式,或根据文件扩展名选择合适的方法
  4. 性能考虑​:对于大型文件,考虑使用EasyExcel或POI的流式API
  5. 依赖管理​:保持POI库版本更新,避免版本冲突

以上代码示例提供了灵活的方式来获取Excel工作表名称,可根据具体需求选择最适合的方法。Apache POI是最通用和功能全面的解决方案,而EasyExcel更适合处理大数据量文件。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞77 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容