使用Apache POI读取Excel:按列存单元格值到数组及代码问询
如何用Apache POI按列读取Excel数据并存入数组?
嘿,我看你现在已经能用Apache POI遍历Excel并打印所有内容了,要改成按列把数据存进数组其实只需要调整一下遍历顺序,再做些小处理就行~
首先,你原来的代码是行优先遍历(先遍历每一行,再遍历该行的每个单元格),而按列存储需要改成列优先:先确定总列数,为每一列单独准备存储容器(比如List<String>,后续可转成数组),接着遍历每一列,再逐个读取该列下每一行的单元格值。
另外还要注意两个细节:
- 有些行可能是空的,直接调用
getRow(i)会返回null,需要做非空判断 - 单元格类型不止字符串(比如数字、日期),直接用
getStringCellValue()可能报错,建议用DataFormatter统一获取单元格文本内容,兼容性更好
下面是修改后的完整代码:
import org.apache.poi.ss.usermodel.*; import java.util.ArrayList; import java.util.List; // 假设你已初始化好searcsheet(注意变量名是不是打错了?应该是searchSheet?) DataFormatter formatter = new DataFormatter(); // 统一处理不同类型的单元格 int columnCount = searcsheet.getRow(0).getLastCellNum(); // 假设第一行是表头,获取总列数 List<List<String>> columnData = new ArrayList<>(); // 先初始化每一列的存储列表 for (int j = 0; j < columnCount; j++) { columnData.add(new ArrayList<>()); } // 列优先遍历:外层循环列,内层循环行 for (int j = 0; j < columnCount; j++) { List<String> currentColumn = columnData.get(j); for (int i = 0; i <= searcsheet.getLastRowNum(); i++) { Row row = searcsheet.getRow(i); if (row == null) { // 空行添加空字符串,也可根据需求自定义处理 currentColumn.add(""); continue; } Cell cell = row.getCell(j); // 用DataFormatter获取单元格文本,兼容数字、日期等类型 String cellValue = formatter.formatCellValue(cell); currentColumn.add(cellValue); } } // 若需要将List转为数组 String[][] columnArrays = new String[columnCount][]; for (int j = 0; j < columnCount; j++) { columnArrays[j] = columnData.get(j).toArray(new String[0]); } // 测试打印第一列数据 System.out.println("第一列数据:"); for (String value : columnArrays[0]) { System.out.println(value); }
代码关键点说明:
- DataFormatter的作用:不管单元格是数字、日期还是字符串,都能转换成对应文本,避免类型转换异常
- 空行处理:判断
row == null时主动添加空字符串,保证每一列的元素数量和行数一致 - 列优先遍历逻辑:外层循环列、内层循环行,确保每一列的数据被连续收集
- List转数组:如果业务需要数组类型,用
toArray()方法即可完成转换
这样就能实现你想要的按列将单元格值存入数组的功能啦~
内容的提问来源于stack exchange,提问作者Zakaria Shahed
相关产品推荐
相关产品推荐

