在.Net的Excel文档中查找最右边的单元格

我正在通过DocumentFormat.OpenXml库阅读Excel文档。 有没有一个很好的方法来找出它有多less列?

我刚刚在调查一个bug时遇到的当前代码是这样的:

 public string getMaxColumnName(SheetData aSheetData) { string lLastCellReference = aSheetData.Descendants<Cell>().Last().CellReference.InnerText; char[] lRowNumberIndex = lLastCellReference.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }); return lLastCellReference.Substring(0, lRowNumberIndex); } 

在英文中:find工作表中的最后一个单元格,获取其单元格引用(如“CB99”),并检索第一个数字之前的所有内容。 问题是,工作表中的最后一个单元格不一定在最右边的列中。

我有一张整齐的长方形桌子。 它有1000行填充列A到M,所以函数应该返回string“M”。 但是由于单元格C1522中存在多余的空格字符,因此计算为最后一个单元格,所以函数会将最大列标记为“C”。

我最初的冲动是用某种Max(columnNumber)replaceLast()调用。 不过, Cell显然不公开一个实际的列号,只有这个复合的CellReferencestring。 我不认为我想在那里做谓词分割。

有没有办法find工作表最右边的列,而不必parsing每个单元格的CellReference

据我了解的格式,有各种情况:

  1. 如果文件不是由Excel生成的,并且工作表包含的数据没有空白行,并且行中没有空白列,但是并不是每行都有相同数量的列(可能是这种情况) :

    你是非常拧。 在这种情况下,格式允许忽略行和单元格引用。 您必须计算每行中的所有单元格引用才能获得最大值。

  2. 如果文件不是由Excel生成的,但是单元格填充为稀疏(显然不是这种情况):

    每行的最后一个单元格保存列必须在“r”属性中的引用。 不过,你将不得不转换参考。

  3. 如果该文件是由Excel生成的:

    通常情况下,我还没有find一个Excel生成的文件,工作表部分有一个名为dimension的子项,它具有工作表使用的单元格引用(即“A1:M1001”)的“ref”属性。 这只是一个使用这个知道列的情况。 当然,只有当多余的字符不在列表后面的列中时才起作用。

    或者,通常每一行,以及我看到的每个Excel生成的文件都有它,具有一个名为“span”的属性,该属性具有行使用的列。 “spans”属性的格式是数字的,所以在你的例子中,表格中的每一行都有一个“1:13”的值。 也许你只需要这样检查第一行。

我得出的结论是,这首先是错误的。 使用代码从来不会在整个工作表中寻找最右边的单元格。 一般来说,它想要的是特定行中的单元格数 – 第1行或已知的表格标题位置。

事实上,除了渲染或打印之外,我不能想出任何需要获取整个表单的最大单元格的情况。

所以我需要稍微重构。 我正在改变函数,所以它需要一个表和一个行索引,并返回该行最右边的单元格的列。 那就是现在看起来像:

 public string getMaxColumnIndex(SheetData aSheetData, int aRowIndex); 

为了实现这一点,我可以检查Row.Spans属性是否存在,否则parsingRow.ChildElements.Last()的单元格引用。