2010-05-18 3 views
2

В следующем, я пытаюсь сохранить набор объектов на листе excel. Каждый раз, когда функция вызывается для хранения значения, она должна выделить следующую ячейку столбца A для хранения этого объекта.ОШИБКА! (Использование названных диапазонов Excel от C#)

Однако исключение выбрано библиотекой 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" 

«\ г \ Nserver трассировки стека: \ г \ п \ г \ п \ г \ nException на вызваны повторно [0]: \ г \ п на 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 в WorkbookTemplateManager.EditTemplateForm.AddName (имя строки, значение объекта) в C: \ Documents and Settings \ QueBITuser \ Мои документы \ Visual Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager \ EditTemplateForm.cs: строка 143 \ r \ n в WorkbookTemplateManager.EditTemplateForm.SaveTemplate (объектный отправитель, аргументы EventArgs) в C: \ Documents and Settings \ QueBITuser \ My Documents \ Visual Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager \ EditTemplateForm.cs: строка 124 \ r \ n в System.Windows.Forms.Control.OnClick (EventArgs e) \ r \ n в System.Windows.Forms.Button.OnClick (EventArgs e) \ r \ n в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) \ r \ n в System.Windows.Forms.Control.WmMouseUp (сообщение & m, кнопка MouseButtons, клики Int32) \ r \ n в System.Windows.Forms.Control.WndProc (Message & m) \ r \ n в 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 at System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) "

+0

Можете ли вы опубликовать исключение и трассировки стека? –

+0

Хорошо. Он опубликован сейчас. – mcoolbeth

+1

Просто дикая догадка: вы попробовали jresheet.Names.Add («next», «= jreTemplates! $ A $ 1», ...? –

ответ

1

От взгляда вокруг, я нашел несколько примеров, когда сама строка имеет равные и явную ссылку на метод Names.Add. Что-то вроде:

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

Я тоже боролся.

Имя, которое я пытаюсь добавить, было CEB04 ==> это относится к существующей ячейке excel (2007), находящейся далеко в столбцах righ. Так как это реальный адрес excel, это не позволяет.

Просто добавьте префикс перед тем, как «MyAppNames_» + «CEB04», и все будет хорошо.

и, кстати, используя C# и .net4, вы можете избежать ввода Type.Missing, поскольку он позволяет использовать дополнительные параметры.

Этот фрагмент кода работает отлично:

var name= "MyAppNames_" + "CEB04"; 
var address = "=" + Constants.ValidationSheetName + "!" + target.Address; 
worksheet.Names.Add(name, address,true); 
Смежные вопросы