Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按名称而不是“按”访问Excel单元格;坐标;像A1_C#_Excel 2007 - Fatal编程技术网

C# 按名称而不是“按”访问Excel单元格;坐标;像A1

C# 按名称而不是“按”访问Excel单元格;坐标;像A1,c#,excel-2007,C#,Excel 2007,我有一张Excel表格,其中列出了我必须从代码中填充的单元格。 指定字段的原因是客户可以重新安排单元格 更清楚一点:我使用下面显示的字段来命名单元格 我现在的问题是,我不知道如何使用officeinterop从C#处理这些字段 Range r = Sheet.get_Range("M_Leitung", Type.Missing); 不起作用。因为我没有定义任何范围,只有一个单元格,我必须在其中插入值,所以我需要一个返回命名单元格的函数。我刚刚模拟了您的场景,下面的代码就像一个符咒一样工作(

我有一张Excel表格,其中列出了我必须从代码中填充的单元格。 指定字段的原因是客户可以重新安排单元格

更清楚一点:我使用下面显示的字段来命名单元格

我现在的问题是,我不知道如何使用officeinterop从C#处理这些字段

Range r = Sheet.get_Range("M_Leitung", Type.Missing);

不起作用。因为我没有定义任何范围,只有一个单元格,我必须在其中插入值,所以我需要一个返回命名单元格的函数。

我刚刚模拟了您的场景,下面的代码就像一个符咒一样工作(在图2中我将A1标记为M_Leitong):

编辑:更新的代码-当您有多个工作表时,您需要引用工作簿范围中的名称,该范围将返回完全限定的地址(因此结果范围知道从哪个工作表中选择地址)

请注意,重命名单元格时,确实会自动创建命名区域。如果您创建了A1:B1范围,并选择了该范围。Excel将显示该角标签中的命名范围,而不是地址,这证明它是双向工作的


HTH

Excel中定义的名称具有范围,可以是工作簿或工作表(即全局或本地)。像您所做的那样输入它们,会将它们创建为工作簿范围。使用名称管理器检查范围

使用名称和引用范围属性,而不是范围来访问它们。语法略有不同:

工作簿范围:
Workbook.Names(“M_leitong”).referestorange.Value

工作表范围:
Workbook.Sheet.Names(“M_Leitong”).referestorange.Value

这样做的原因是,您可以在不同的图纸上创建相同的名称

Excel.Application app = new Excel.ApplicationClass();

Excel.Workbook book =  app.Workbooks.Open(Filename: System.IO.Path.Combine( Environment.CurrentDirectory, "Book1.xls"));

Excel.Name MyRange =    book.Names.Item(Index:"MyRange");

Console.WriteLine(MyRange.RefersToRange.Value);

MyRange.RefersToRange.Value  = "55";

book.Save();

app.Quit();

上面的代码打开一个文件,从工作簿中获取值并更新范围。我认为这将解决问题。

这适用于“A1”、“A1”,但每次尝试使用字段名时,我都会遇到以下异常:来自HRESULT的异常:0x800A03ECI以前使用过Interop 11,但现在安装了14。同样的结果。我已经检查了模块窗口并确认使用了版本14。我在Office 2010和2007上使用Interop 14和12对此进行了测试。这两种情况都适用。我怀疑这与你所指的名字范围有关。你是如何浏览工作表的?你是否像我一样使用它?下面就是我正在做的:-Application excelApp=new Application();工作簿excelWorkbooks=excelApp.Workbooks;工作簿报告=Excel工作簿。打开(文件名,0,false,5,“,”,true,XlPlatform.xlWindows,“,true,false,0,false,false,false);工作表GisSheet=报告。工作表[2];变量y=GisSheet.Range[“MU LEITONG”,“MU LEITONG”]值----分类!当您有多张工作表时,需要参考工作簿范围内的范围,如其他人所述。相应地更新了代码。已测试并正常工作。请注意,如果该值不是Excel中的实际范围,则ReferStorRange将失败。对于这些类型的值,我使用了
.Names(“M_leitong”).Value.Trim(new char[]{'=','''''})
。Value返回“”中的值,前面有=,因此Trim()会删除它们。
Excel.Application app = new Excel.ApplicationClass();

Excel.Workbook book =  app.Workbooks.Open(Filename: System.IO.Path.Combine( Environment.CurrentDirectory, "Book1.xls"));

Excel.Name MyRange =    book.Names.Item(Index:"MyRange");

Console.WriteLine(MyRange.RefersToRange.Value);

MyRange.RefersToRange.Value  = "55";

book.Save();

app.Quit();