如何读取仅含单列数据的Excel文件(附Java实现代码)
如何用Java读取仅包含单列数据的Excel文件
如果要读取只有单列数据的Excel文件,Apache POI的XSSF组件是个常用的选择(用于处理.xlsx格式)。先看你提供的这段代码,里面有几个明显的问题会导致运行异常或者数据读取错误,我先梳理这些问题,再给出修正后的可运行代码。
原代码的核心问题
- 工作簿提前关闭:你在获取工作表
sheet之前就调用了wrkbook.close(),这会直接导致后续操作抛出IllegalStateException,因为工作簿资源已经被释放了 - 循环索引越界:列循环的条件
j <= colNum是错误的——单元格索引从0开始,正确的边界应该是j < colNum;另外对于单列数据来说,列数固定为1,这个循环其实可以简化 - 未处理空单元格/空行:直接调用
String.valueOf(cell)会在单元格为空时得到null,或者遇到非字符串类型单元格时出现格式问题
修正后的完整实现
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class SingleColumnExcelReader { // 读取单列Excel数据,返回二维数组(兼容多列场景,单列也适用) public Object[][] getSingleColumnExcelData(String excelFilePath) { Object[][] dataSet = null; FileInputStream inputStream = null; XSSFWorkbook workbook = null; try { inputStream = new FileInputStream(new File(excelFilePath)); workbook = new XSSFWorkbook(inputStream); // 获取第一个工作表(如果Excel有多个工作表,可根据需求调整索引) XSSFSheet sheet = workbook.getSheetAt(0); if (sheet == null) { System.out.println("指定的工作表不存在或为空"); return null; } // getLastRowNum()返回最后一行的索引,所以实际行数是索引+1 int totalRows = sheet.getLastRowNum() + 1; final int COLUMN_COUNT = 1; // 单列数据,固定列数为1 dataSet = new Object[totalRows][COLUMN_COUNT]; // 遍历每一行读取单列数据 for (int rowIndex = 0; rowIndex < totalRows; rowIndex++) { XSSFRow row = sheet.getRow(rowIndex); if (row == null) { // 空行直接填充空字符串,避免空指针 dataSet[rowIndex][0] = ""; continue; } XSSFCell cell = row.getCell(0); // 统一处理不同类型的单元格,确保返回字符串格式 dataSet[rowIndex][0] = getCellStringValue(cell); } return dataSet; } catch (IOException e) { System.err.println("读取Excel文件时发生错误: " + e.getMessage()); e.printStackTrace(); } finally { // 务必关闭资源,避免内存泄漏 try { if (workbook != null) workbook.close(); if (inputStream != null) inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return null; // 发生异常时返回null } /** * 辅助方法:将单元格转换为字符串,处理空单元格和不同数据类型 */ private String getCellStringValue(XSSFCell cell) { if (cell == null) { return ""; } switch (cell.getCellType()) { case STRING: return cell.getStringCellValue().trim(); case NUMERIC: // 若为日期类型,可单独处理,这里默认转成字符串 return String.valueOf(cell.getNumericCellValue()); case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: // 若需要计算公式结果,可使用FormulaEvaluator,这里直接返回公式字符串 return cell.getCellFormula(); default: return ""; } } }
使用提示
- 引入依赖:确保你的项目中添加了Apache POI的Maven/Gradle依赖,以Maven为例:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> <!-- 使用最新稳定版即可 --> </dependency>
- 调用示例:
public static void main(String[] args) { SingleColumnExcelReader reader = new SingleColumnExcelReader(); Object[][] data = reader.getSingleColumnExcelData("path/to/your/single-column.xlsx"); if (data != null) { for (Object[] row : data) { System.out.println("单列数据:" + row[0]); } } }
- 扩展说明:如果你的Excel是
.xls格式,只需把XSSF相关类替换成HSSF类即可。
内容的提问来源于stack exchange,提问作者hrishikesh basak
相关产品推荐
相关产品推荐

