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

时间:2010-01-11 22:56:32

标签: c# .net excel openxml

我正在通过DocumentFormat.OpenXml库阅读Excel文档。有没有一种好方法可以找出它有多少列?

我在调查错误时遇到的当前代码是这样做的:

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);   
}

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

我有一张整齐的矩形桌子。它有1000行填充A到M列,所以函数应该返回字符串“M”。但是因为单元格C1522中存在一个无关的空格字符,所以它被计为最后一个单元格,因此该函数将最大列报告为“C”。

我最初的冲动是用某种Last()取代Max(columnNumber)来电。但是,Cell显然不会公开实际的列号,只会显示此复合CellReference字符串。我不认为我想在谓词中进行字符串拆分。

有没有办法找到工作表最右边的列,而不必解析每个单元格的CellReference

2 个答案:

答案 0 :(得分:1)

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

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

    你几乎搞砸了。在这种情况下,格式允许忽略行和单元格引用。您必须计算每行中的所有单元格引用以获得最大值。

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

    每行的最后一个单元格保存了必须位于“r”属性中的列的引用。但是,您必须转换参考。

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

    通常情况下,我没有找到Excel生成的文件,工作表部分有一个名为dimension的子元素,它具有“ref”属性,其中包含工作表使用的单元格引用,即“A1:M1001 ”。只是使用它来知道列的情况。当然,只有当无关的字符不在表后的列中时才有效。

    或者,通常每行和我看到的每个Excel生成的文件都有一个名为“spans”的属性,该属性包含行使用的列。 “spans”属性格式是数字,因此在您的示例中,对于表中的每一行,它将具有值“1:13”。也许你只需要以这种方式检查第一行。

答案 1 :(得分:0)

我得出的结论是,这首先是错误的做法。消费代码实际上从不在整张纸上寻找最右边的单元格。通常,它想要的是特定行中的单元格数 - 第1行或已知的表头位置。

事实上,除了渲染或打印之外,我无法想出获得整张纸的最大单元格的任何情况。

因此,我需要稍微重构一下。我正在更改函数,因此它需要一个工作表和一个行索引,并返回该行中最右边单元格的列。也就是说,它现在看起来像:

public string getMaxColumnIndex(SheetData aSheetData, int aRowIndex);

为了实现它,我可以检查Row.Spans属性是否存在,或者解析Row.ChildElements.Last()的单元格引用。