2012-03-20 84 views
4

我有一个模板excel文件,我从SQL Server OLEDB连接器中填入数据。该文件包含一些数据透视表,这些数据透视表引用数据库填充的数据集。Excel Interop - 如何更改命名范围

目前我所做的是使用“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行才能操作 - 模板文件只有列标题。我向第二行的第一个单元添加了一个随机字符串,并且数据透视表接受了该字段我不得不使用C#代码删除那行。

谢谢你们的帮助。

+1

在您的模板中使用动态范围:http://www.ozgrid.com/Excel/DynamicRanges.htm – 2012-03-20 18:54:40

+0

它的工作!谢谢! – 2012-03-20 21:31:20

回答

4

通过执行以下操作,您将创建一个名为范围的oSheet(交易)在单元格A1盯着,并在小区C3

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

finising如果该名称在工作簿将取代已经存在,如果没有,它会被创建。

+0

这不适合我。我遇到了一个错误:“具有该名称的表已经存在,请选择其他名称。” – 2012-03-20 20:59:18

1

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

Programmatically getting the last filled excel row using C#

How to get the range of occupied cells in excel sheet

+0

我的问题是,我不知道如何更改已存在的已命名范围的单元格范围。 – 2012-03-20 21:00:30

+0

@WilliF删除并重新创建范围。无法记住这样做的API调用,但是Google知道所有这些。 – ConcernedOfTunbridgeWells 2012-03-20 21:06:11

2

它可能为时已晚WilliF,但我遇到了同样的问题来了,这工作:

oRng = oSheet.get_Range("Transactions"); 

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

here

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:​​没有为我工作。