如何用Apache POI读取Excel多行多列并匹配滑块类型问题传值至对应类
使用Apache POI读取Excel多行多列并处理Slider类型问题
嘿,我来帮你搞定这个需求!下面我会一步步拆解怎么用Apache POI读取Excel数据,并且把匹配到的slider类型问题数据封装到对应类里。
第一步:添加Apache POI依赖
首先得确保你的项目里引入了Apache POI的相关依赖,如果是Maven项目,把下面这段加到pom.xml里:
<dependencies> <!-- Apache POI for Excel handling --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.5</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency> </dependencies>
(版本可以根据你需要调整到最新稳定版)
第二步:基础读取Excel多行多列数据
Apache POI区分.xls(HSSF)和.xlsx(XSSF)格式,不过现在用WorkbookFactory可以自动适配两种格式,不用手动判断,非常方便。
核心流程是:
- 加载Excel文件到
Workbook对象 - 获取目标工作表(可以按索引或名称指定)
- 遍历每一行(记得跳过表头行)
- 遍历每行的单元格,读取对应数据
第三步:匹配Slider类型并封装到对应类
假设你已经创建了SliderQuestion类,用来存储滑块类型问题的数据,比如这样:
public class SliderQuestion { private String questionText; private int minValue; private int maxValue; private int defaultValue; // 构造函数、getter和setter方法 public SliderQuestion(String questionText, int minValue, int maxValue, int defaultValue) { this.questionText = questionText; this.minValue = minValue; this.maxValue = maxValue; this.defaultValue = defaultValue; } // 省略getter和setter @Override public String toString() { return "SliderQuestion{" + "questionText='" + questionText + '\'' + ", minValue=" + minValue + ", maxValue=" + maxValue + ", defaultValue=" + defaultValue + '}'; } }
接下来是完整的读取和处理代码,你可以直接参考:
import org.apache.poi.ss.usermodel.*; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ExcelReader { public static void main(String[] args) { String excelFilePath = "path/to/your/attachment.xlsx"; // 替换成你的附件实际路径 List<SliderQuestion> sliderQuestions = new ArrayList<>(); try (FileInputStream fis = new FileInputStream(excelFilePath); Workbook workbook = WorkbookFactory.create(fis)) { // 获取第一个工作表,也可以用workbook.getSheet("SheetName")按名称获取 Sheet sheet = workbook.getSheetAt(0); // 遍历行,从第2行开始(假设第1行是表头) for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) { Row row = sheet.getRow(rowNum); if (row == null) continue; // 跳过空行 // 获取问题类型单元格(假设问题类型在第2列,索引从0开始) Cell questionTypeCell = row.getCell(1); if (questionTypeCell == null) continue; String questionType = getCellValueAsString(questionTypeCell); // 匹配slider类型,忽略大小写避免格式问题 if ("slider".equalsIgnoreCase(questionType)) { // 读取对应列的数据,假设问题文本在第1列,min在第3列,max在第4列,默认值在第5列 String questionText = getCellValueAsString(row.getCell(0)); int minValue = (int) row.getCell(2).getNumericCellValue(); int maxValue = (int) row.getCell(3).getNumericCellValue(); int defaultValue = (int) row.getCell(4).getNumericCellValue(); // 封装到SliderQuestion类 sliderQuestions.add(new SliderQuestion(questionText, minValue, maxValue, defaultValue)); } } // 打印结果验证 System.out.println("读取到的Slider类型问题:"); for (SliderQuestion sq : sliderQuestions) { System.out.println(sq); } } catch (IOException e) { e.printStackTrace(); } } // 工具方法:统一处理不同类型的单元格,转为字符串返回 private static String getCellValueAsString(Cell cell) { if (cell == null) return ""; switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { return cell.getDateCellValue().toString(); } else { return String.valueOf((int) cell.getNumericCellValue()); } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: return cell.getCellFormula(); default: return ""; } } }
一些需要注意的细节
- 单元格索引:要根据你实际Excel的列位置调整代码中的索引(比如问题类型在第几列,数据列在第几列)
- 单元格类型处理:Excel单元格有字符串、数字、日期等多种类型,用
getCellValueAsString工具方法可以统一处理,避免类型转换异常 - 资源关闭:用try-with-resources语法自动关闭
FileInputStream和Workbook,不用手动处理资源释放 - 空行/空单元格:代码里加入了空行和空单元格的判断,避免出现
NullPointerException
这样就能完成你的需求啦——读取Excel多行多列数据,匹配到slider类型时自动封装到对应的类中。
内容的提问来源于stack exchange,提问作者swapnil bargale
相关产品推荐
相关产品推荐

