Excel Interop - 如何更改命名范围

时间:2012-03-20 17:29:45

标签: c# excel excel-interop

我有一个模板excel文件,我从SQL Server OLEDB连接器填充数据。该文件包含一些数据透视表,这些数据透视表引用数据库填充的数据集。

目前,我所做的是使用“Data!$ A:$ K”范围选择工作表中的所有行。这会导致数据透视表中显示空白值的问题。

我想要做的是在数据集上创建一个命名表,并将数据透视表引用到该数据集中(此外,我还获得了名称表带来的其他一些优势)。

当然没有设置行数,因此我想找到一种方法将命名范围范围设置为仅实际值。

我正在使用Excel Interop和C#,我找不到改变范围的方法。我只有:

oRng = oSheet.get_Range("Transactions");

选择命名范围。但是,我如何更改属于它的细胞?

或者我应该追求更好的解决方案吗?

修改

动态范围就是答案!

感谢@TimWilliams回复,我解决了这个问题:

“在模板中使用动态范围:http://ozgrid.com/Excel/DynamicRanges.htm

我觉得动态范围在这里有更好的描述:http://www.contextures.com/xlpivot01.html

我遇到了一个小问题,我无法使用数据透视表中的范围,因为它要求至少需要2行才能运行 - 模板文件只有列标题。我在第2行的第1个单元格中添加了一个随机字符串,并且数据透视表接受了该字符串。

之后我不得不使用c#代码删除该行。

谢谢你们的帮助。

4 个答案:

答案 0 :(得分:4)

通过执行以下操作,您将在oSheet上创建一个命名范围(Transactions),盯着单元格A1并在单元格C3处完成

Range namedRange= oSheet.Range[oSheet.Cells[1, 1], oSheet.Cells[3, 3]];
namedRange.Name = "Transactions";

如果工作簿中已存在该名称,则将替换该名称,否则将创建该名称。

答案 1 :(得分:2)

对于WilliF来说可能为时已晚,但我遇到了同样的问题,这很有效:

oRng = oSheet.get_Range("Transactions");

Range namedRange = oSheet.Range[oSheet.Cells[1, 1], oSheet.Cells[3, 3]];
namedRange.Name = "Transactions";

来自here

答案 2 :(得分:1)

首先,您需要确定工作表中占用的单元格范围。然后为其指定一个名称。您可以使用工作表的UsedRange属性来获取此属性,还有一些其他方法。

Programmatically getting the last filled excel row using C#

How to get the range of occupied cells in excel sheet

答案 3 :(得分:0)

您可以通过以下方式获得命名范围:

var oRng = oSheet.get_Range("Transactions");

然后,您可以使用Range.get_Offset(*RowOffset*, *ColumnOffset*)Range.get_Resize(*RowSize*, *ColumnSize*)移动或调整大小。您也可以使用Offset[]Resize[]

var newRange = oRng.Offset[-1,3].Resize[2,4];

然后你可以用这种方式将它保存为命名范围:

oSheet.Names.Add("Transactions", newRange);

PS:newRange.Name = "Transactions"对我不起作用。