错误! (使用Excel中C#命名的范围)

在下面,我试图在excel工作表中保留一组对象。 每次调用该函数来存储一个值时,都应该分配A列的下一个单元来存储该对象。

但是,第一次调用get_Range() Interop库会引发exception。 (在catch块之后)

有谁知道我在做什么错?

 private void AddName(string name, object value) { Excel.Worksheet jresheet; try { jresheet = (Excel.Worksheet)_app.ActiveWorkbook.Sheets["jreTemplates"]; } catch { jresheet = (Excel.Worksheet)_app.ActiveWorkbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing); jresheet.Visible = Microsoft.Office.Interop.Excel.XlSheetVisibility.xlSheetVeryHidden; jresheet.Name = "jreTemplates"; jresheet.Names.Add("next", "A1", true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); } Excel.Range cell = jresheet.get_Range("next", Type.Missing); cell.Value2 = value; string address = ((Excel.Name)cell.Name).Name; _app.ActiveWorkbook.Names.Add(name, address, false, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); cell = cell.get_Offset(1, 0); jresheet.Names.Add("next", ((Excel.Name)cell.Name).Name, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); } 

由于exception是从COM库中引发的,embedded的信息似乎并不是很有用。 但是,这里是:

 "Exception from HRESULT: 0x800A03EC" 

“\ r \ n服务器堆栈跟踪:\ r \ n \ r \ n \ r \ n在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)\ r \ r \ n在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32types)\ r \ n在Microsoft.Office.Interop.Excel._Worksheet.get_Range(对象单元格1,对象单元格2)\ r \ n WorkbookTemplateManager中的C:\ Documents and Settings \ QueBITuser \ My Documents \ Visual Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager \ EditTemplateForm.cs中的WorkbookTemplateManager.EditTemplateForm.AddName(string名称,对象值):第143行。在System.Windows的C:\ Documents and Settings \ QueBITuser \ My Documents \ Visual Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager \ EditTemplateForm.cs中的EditTemplateForm.SaveTemplate(Object sender,EventArgs args):line 124 \ r \ n。在System.Windows.Forms.Button.OnClick(EventArgs e)上的Forms.Control.OnClick(EventArgs e)\ r \ n在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)\ r \ n at小号 在System.Windows.Forms.ButtonBase的System.Windows.Forms.Control.WndProc(Message&m)\ r \ n上的ystem.Windows.Forms.Control.WmMouseUp(Message&m,MouseButtonsbutton,Int32点击)\ r \ n。 WndProc(Message&m)\ r \ n在System.Windows.Forms.Button.WndProc(Message&m)\ r \ n在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)\ r \ n在系统。 Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)\ r \ n at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)“

从一些四处看,我发现一些例子,其中string本身有一个等于和Names.Add方法的明确引用。 就像是:

  jresheet.Names.Add("next", "=jreTemplates!$A$1",... 

我也在挣扎。

我试图添加的名字是CEB04 ==>这指的是一个现有的Excel(2007)单元格,远在列列。 所以,因为它是一个真正的地址,Excel不允许它。

只需添加一个前缀,如“MyAppNames_”+“CEB04”,它会没事的。

顺便使用c#和.net4,你可以避免键入Type.Missing,因为它允许可选的参数。

这段代码正常工作:

 var name= "MyAppNames_" + "CEB04"; var address = "=" + Constants.ValidationSheetName + "!" + target.Address; worksheet.Names.Add(name, address,true);