如何利用Apache POI事件用户模型跳过xlsm文件前6行
用Apache POI事件模型跳过xlsm文件的前6行
嘿,我之前刚好处理过类似的需求,用POI的SAX事件模型处理大Excel文件时跳过指定行其实很简单,核心就是在事件处理器里跟踪行号并做判断就行,给你一步步讲清楚:
核心思路
POI的事件模型本质是通过SAX解析Excel的XML结构,Excel里的每一行对应XML中的<row>标签,这个标签的r属性就是行号(比如第1行的r="1")。我们只需要在解析到行开始事件时,读取这个行号,判断如果是1-6行就跳过后续的单元格处理逻辑。
代码示例
给你一个自定义的SheetHandler示例,继承自SAX的DefaultHandler,里面实现行号判断和跳过逻辑:
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SkipRowsSheetHandler extends DefaultHandler { // 当前处理的行号 private int currentRow = -1; // 标记是否需要处理当前行 private boolean processCurrentRow = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 解析行开始事件 if ("row".equals(qName)) { // 获取行号:r属性的值就是Excel里的行号 String rowNumAttr = attributes.getValue("r"); currentRow = Integer.parseInt(rowNumAttr); // 只有行号>6时才处理该行的单元格 processCurrentRow = currentRow > 6; } // 处理单元格事件:只有当processCurrentRow为true时才执行 if ("c".equals(qName) && processCurrentRow) { String cellReference = attributes.getValue("r"); // 这里写你的单元格处理逻辑,比如读取单元格类型、值等 System.out.println("处理单元格:" + cellReference); } } // 如果你需要读取单元格内容,重写characters方法,记得结合processCurrentRow判断 @Override public void characters(char[] ch, int start, int length) throws SAXException { if (processCurrentRow) { // 处理单元格文本内容 String cellValue = new String(ch, start, length).trim(); if (!cellValue.isEmpty()) { System.out.println("单元格内容:" + cellValue); } } } }
额外注意点
- xlsm是带宏的XLSX格式,用POI的事件模型处理时和普通XLSX完全一致,都是用
XSSFReader来解析,不需要额外处理宏部分。 - 如果你使用的是较旧版本的POI,可能需要注意命名空间的问题,不过大部分场景下直接判断
qName为"row"(行标签)和"c"(单元格标签)就足够了。 - 如果需要同时跳过隐藏行,可以在解析
<row>标签时,读取hidden属性的值(attributes.getValue("hidden")),如果是"1"就标记不处理该行。
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

