0

如何计算Excel工作表中指定列的行数?

例如,我在电子表格中有 2 列:

A      B
---    -----
abc    hi 
fff    hello
ccc    hi
       hello

结果应如下所示:

count of A column is 3
count of B column is 4

如何使用 Microsoft 互操作来做到这一点?

4

2 回答 2

0

这应该这样做:

private static int GetRowsInColumnOnWorkSheetInWorkbook(string workbookName, int worksheetNumber, int workSheetColumn)
{
    return new Excel.Application().Workbooks.Open(workbookName)
        .Sheets[worksheetNumber]
        .UsedRange
        .Columns[workSheetColumn]
        .Rows
        .Count;
}

你也可以有以下覆盖:

private static int GetRowsInColumnOnWorkSheetInWorkbook(string workbookName, string worksheetName, int workSheetColumn)
{
    return new Excel.Application().Workbooks.Open(workbookName)
        .Sheets[worksheetName]
        .UsedRange
        .Columns[workSheetColumn]
        .Rows
        .Count;
}

它比其他答案稍长,但我认为这更具可读性,也更简单。

于 2013-07-29T17:15:53.350 回答
0

Doug Glancy 建议的方法是准确且易于实施的。您可以编写函数并从用户看不到的单元格中检索值(例如 ZZ1000)。代码很简单:

Range notUsed = curSheet.get_Range("ZZ1000", "ZZ1000");
string targetCol = "A";
notUsed.Value2 = "=COUNTA(" + targetCol + ":" + targetCol + ")";
int totRows = Convert.ToInt32(notUsed.Value2);
notUsed.Value2 = "";

更新 - -

从您的示例中,我了解到您正在寻找非空单元格的总数,即COUNTA交付内容。但是,显然情况并非如此:您需要最后一个非空单元格的行号;也就是说,通过使用更具描述性的示例:

 C
---   
abc    
fff    
ccc    

hello

您不想计算非空单元格的数量(在这种情况下为 4;COUNTA交付的内容),而是“你好”的位置,即 5。

我不喜欢过度依赖 Excel 公式,除非有明确定义的问题(比如你的问题,正如我最初理解的那样)。Excel 公式仍然是您真正想要的最佳解决方案(尽管它的复杂性“在极限”中是正确的)。要解决上述情况,您可以依靠MATCH. 如果您的单元格包含文本(每个单元格至少一个字母),则代码可以更改为:

notUsed.Value2 = "=MATCH(REPT(\"z\",255)," + targetCol + ":" + targetCol + ")";

如果有数值(单元格中不是单个字母):

notUsed.Value2 = "=MATCH(LOOKUP(" + Int32.MaxValue.ToString() + "," + targetCol + ":" + targetCol + ")," + targetCol + ":" + targetCol + ")";

如果您想同时考虑这两个选项,则必须将这些方程式结合起来:您可以创建一个包含两者的新公式;或者您可能依赖 C# 代码(例如,从两个方程中获取值并只考虑较大的一个)。

还要记住,您必须考虑未找到匹配项的情况。在这里,您有一个代码说明了两种情况(通过 C# 代码的字母和数字)和不匹配的情况:

notUsed.Value2 = "=MATCH(REPT(\"z\",255)," + targetCol + ":" + targetCol + ")";
int lastLetter = Convert.ToInt32(notUsed.Value2);
if (lastLetter == -2146826246)
{
    lastLetter = 0;
}
totRows = lastLetter;

notUsed.Value2 = "=MATCH(LOOKUP(" + Int32.MaxValue.ToString() + "," + targetCol + ":" + targetCol + ")," + targetCol + ":" + targetCol + ")";
int lastNumber = Convert.ToInt32(notUsed.Value2);
if (lastNumber == -2146826246)
{
    lastNumber = 0;
}

if (lastNumber > totRows)
{
    totRows = lastNumber;
}
于 2013-07-29T16:55:25.013 回答