根据OpenXml规范,CellReference是可选的。但是,还有其他方法来获取单元格的位置吗?

例如,我可以通过以下方式获取行的单元格:

foreach (Row r in sheetData.Elements<Row>())
{
    foreach (Cell c in r.Elements<Cell>())
    {
        Console.WriteLine(c.CellReference);
    }
}

但是如果没有CellReference,我如何知道单元的位置?

我已经进行了一些研究,所有解决方案似乎都依赖于将单元格的CellReference与给定的字符串进行比较。

最佳答案

CellReference是可选的,因为如果缺少它,Excel将使用“先到先得”的原则(顺便说一句,这不是官方术语)。

当所有Cell类都缺少CellReference属性时,Excel将根据遇到Row和Cell类的顺序进行解析。

SheetData类中的第一个Row类(您将注意到RowIndex也是一个可选属性)将被假定为具有行索引1。并且该行中的第一个Cell类被假定为具有CellReference“A1”(假设(该单元未分配CellReference)。并且假定该行中的第二个Cell类具有CellReference“B1”。等等等等。

下一个Row类(如果也未分配RowIndex属性)将假定为第二行。

基本上,如果缺少所有RowIndex和CellReference属性,则所有Cell类都将聚集在工作表的左上角。

假设地说,如果您有3个未分配的RowIndex-ed Row类,而下一个Row类的RowIndex为8,则这是一个有效的工作表。您只需在工作表的前3行中获得数据的前3行(按预期方式),并在工作表的第8行中获得“第4”行类(RowIndex为8)。

09-27 17:06