【发布时间】:2013-03-21 22:29:20
【问题描述】:
在下文中,我试图在 excel 工作表中保留一组对象。每次调用该函数来存储一个值时,它都应该分配A 列的下一个单元格来存储该对象。
但是,Interop 库在首次调用 get_Range() 时引发异常。 (就在 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);
}
由于异常是从 COM 库引发的,因此嵌入的信息似乎不是很有用。但是,这里是:
"Exception from HRESULT: 0x800A03EC"
"\r\n服务器堆栈跟踪:\r\n\r\n\r\n在 [0] 处重新抛出异常:\r\n 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)\r\n 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 类型)\r\n 在 Microsoft.Office.Interop.Excel._Worksheet.get_Range(Object Cell1, Object Cell2)\r \n 在 C:\Documents and Settings\QueBITuser\My Documents\Visual Studio 2008\Projects\JRE.WCF\WorkbookTemplateManager\EditTemplateForm.cs:line 143 中的 WorkbookTemplateManager.EditTemplateForm.AddName(String name, Object value)\r\n在 WorkbookTemplateManager.EditTemplateForm.SaveTemplate(Object sender, EventArgs args) 在 C:\Documents and Settings\QueBITuser\My Documents\Visual Studio 2008\Projects\JRE.WCF\WorkbookTemplateManager\EditTemplateForm.cs:line 124\r\n 在系统.Windows.Forms.Control.OnClick(EventArgs e)\r\n 在 System.Windows.Forms.Button.OnClick(EventArgs e)\r\n 在 System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)\r\n at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)\r\n at System.Windows.Forms.Control.WndProc(Message& m)\r\n at System.Windows.Forms.ButtonBase.WndProc(Message& m)\r\n 在 System.Windows.Forms.Button.WndProc(Message& m)\r\n 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) )\r\n 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)\r\n 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)"
【问题讨论】:
-
能否请您发布异常和堆栈跟踪?
-
只是一个疯狂的猜测:你试过 jresheet.Names.Add("next", "=jreTemplates!$A$1",... 吗?
-
我不明白前面有“=”的原因,但它似乎有效。如果您建议将此作为答案,我会批准。
-
很高兴为您工作;因为我没有测试它,所以我犹豫要不要让它回答。 :) 谢谢。
标签: c# .net excel office-interop