计算每列中的行数
本文关键字:计算 | 更新日期: 2023-09-27 18:25:32
如何计算Excel工作表中指定列的行数?
例如,我在电子表格中有两列:
A B
--- -----
abc hi
fff hello
ccc hi
hello
结果应该是:
count of A column is 3
count of B column is 4
如何使用Microsoft Interop完成此操作?
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;
}
这应该做到:
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;
}
它比另一个答案稍长,但我认为这更可读,也更简单。