EPPlus枚举单元格范围时是否始终按行优先列次之的顺序读取?
我现在用EPPlus写了这段代码:
using (ExcelPackage package = new ExcelPackage(...)) { foreach(var cell in package.Workbook.Worksheets[1].Cells["A1:E5"]) { //do something with "cell" } }
对应的Excel工作表内容如下(.代表空单元格):
| A | B | C | D | E |
|---|---|---|---|---|
| foo | bar | . | . | . |
| . | . | . | . | . |
| . | . | hello | . | . |
| . | . | world | . | . |
| . | . | . | . | . |
目前测试下来,遍历到的非空单元格顺序都是 foo => bar => hello => world,但我不确定所有场景下这个顺序是否都稳定。我注意到即使单元格的编辑顺序不一样,.xlsx文件里Excel本身也是按这个行列顺序序列化单元格的,但EPPlus的ExcelWorksheet.Cells文档说明太简略了:
// // Summary: // Provides access to a range of cells public ExcelRange Cells { get; }
想请教这个遍历顺序是不是始终可靠?
好问题!我来给你拆解一下这个事儿:
首先,在EPPlus的常规使用场景下,这个遍历顺序是稳定可靠的,核心原因有两点:
遵循OOXML规范的解析逻辑
EPPlus读取.xlsx文件时严格遵循OOXML标准——而OOXML格式在存储单元格数据时,天生就是按行优先、从左到右、从上到下的顺序序列化的(哪怕你编辑时跳着选单元格,Excel保存文件时也会自动把单元格数据整理成这个顺序)。EPPlus的ExcelRange遍历逻辑直接沿用了这个存储顺序,空单元格会被自动跳过,所以你只会拿到有内容的foo、bar、hello、world,顺序不会乱。EPPlus内部的排序机制
哪怕你是在内存中动态创建单元格(比如先添加C3,再添加A1),EPPlus内部也会自动按照单元格的行号+列号索引来维护单元格集合的顺序。最终遍历ExcelRange时,依然会回归行优先的顺序。
不过有个小前提:你处理的得是标准格式的.xlsx文件,如果是被篡改过的非规范文件,可能会出现异常,但这种情况非常罕见。
总结来说:只要是正常的.xlsx文件,不管编辑顺序如何,EPPlus遍历指定单元格范围的非空单元格顺序必然是foo => bar => hello => world,这个是可以放心依赖的。
内容的提问来源于stack exchange,提问作者tigrou

