gpt4 book ai didi

c# - Excel:取回选定的行

转载 作者:太空狗 更新时间:2023-10-29 22:29:12 25 4
gpt4 key购买 nike

我正在使用 Microsoft.Office.Interop.Excel,但找不到返回所选行的方法。我所说的“选定”是指,当您单击左侧的行间距并选择一个或多个连续或不连续的行(突出显示整行)时,行号本身。这不同于选择区域或工作表本身的区域。

到目前为止,我查看了 app.Selection、app.Cells、app.Rows,但这些似乎都没有给我行。 app.Selection 为我提供了实际的单元格内容,这不是我想要的。

有什么想法吗?谢谢!

最佳答案

为此,您需要枚举Range中的每个Area,然后枚举每个区域内的Rows。有点令人困惑,Excel.Range.Rows属性返回范围的集合(每个范围代表一行),而 Excel.Range.Row属性返回区域中左上角单元格的行号。

因此,要获取行号,您应该枚举 Areas 和 Rows 集合,然后访问 Range.Row。例如:

Excel.Range range = (Excel.Range)excelApp.Selection;

List<int> rowNumbers = new List<int>();

// Enumerate the Rows within each Area of the Range.
foreach (Excel.Range area in range.Areas)
{
foreach (Excel.Range row in area.Rows)
{
rowNumbers.Add(row.Row);
}
}

// Report the results.
foreach (int rowNumber in rowNumbers)
{
MessageBox.Show(rowNumber.ToString());
}

如果需要,您甚至可以使用 Linq。

使用查询语法:

IEnumerable<int> rowNumbers =
from area in range.Areas.Cast<Excel.Range>()
from row in area.Rows.Cast<Excel.Range>()
select row.Row;

使用方法语法:

IEnumerable<int> rowNumbers =
range.Areas.Cast<Excel.Range>()
.SelectMany(area => area.Rows.Cast<Excel.Range>()
.Select(row => row.Row));

更新:如何返回不同行号:

To return distinct row numbers (which can occur when a multi-area range is selected where the areas do not comprise entire rows).

(1) 最简单的是使用 Linq 并利用 Distinct运算符(operator)。例如:

使用查询语法:

IEnumerable<int> distinctRowNumbers =
(from area in range.Areas.Cast<Excel.Range>()
from row in area.Rows.Cast<Excel.Range>()
select row.Row)
.Distinct();

使用方法语法:

IEnumerable<int> distinctRowNumbers =
range.Areas.Cast<Excel.Range>()
.SelectMany(area => area.Rows.Cast<Excel.Range>()
.Select(row => row.Row))
.Distinct();

(2) 如果不使用 Linq,则可以使用 HashSet .例如:

Excel.Range range = (Excel.Range)excelApp.Selection;

HashSet<int> distinctRowNumbers = new HashSet<int>();

// Enumerate the Rows within each Area of the Range.
foreach (Excel.Range area in range.Areas)
{
foreach (Excel.Range row in area.Rows)
{
distinctRowNumbers.Add(row.Row);
}
}

// Report the results.
foreach (int rowNumber in distinctRowNumbers)
{
MessageBox.Show(rowNumber.ToString());
}

(3) 也许最直观的方法是先将原始范围转换为整行,然后迭代这些行。在这种情况下,行已经保证是唯一的,所以我们不需要使用 HashSetDistinct运营商。

在这些示例中,请注意使用 Excel.Range.EntireRow ,在枚举区域和行之前应用于原始范围:

不使用 Linq 的枚举:

List<int> distinctRowNumbers = new List<int>();

foreach (Excel.Range area in range.EntireRow.Areas)
{
foreach (Excel.Range row in area.Rows)
{
distinctRowNumbers.Add(row.Row);
}
}

使用查询语法的 Linq:

IEnumerable<int> distinctRowNumbers =
from area in range.EntireRow.Areas.Cast<Excel.Range>()
from row in area.Rows.Cast<Excel.Range>()
select row.Row;

Linq 使用方法语法:

IEnumerable<int> distinctRowNumbers =
range.EntireRow.Areas.Cast<Excel.Range>()
.SelectMany(area => area.Rows.Cast<Excel.Range>()
.Select(row => row.Row));

请注意 Range.EntireRow May Return Incorrect Result ,但是,如果我理解正确的话,这只适用于 Excel '95 及以下版本,它已经完全过时了。 (我不会担心 Excel '97 以下的任何 Excel 版本。)但是,如果您担心任何版本控制问题,并且没有在所有 Excel 版本中进行测试的奢侈,那么您可能想要坚持使用 HashSet ,或将 Linq 与 Distinct 运算符一起使用,以确保您的行号是唯一的。

希望这对您有所帮助!

迈克

关于c# - Excel:取回选定的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com