ОШИБКА! (Использование именованных диапазонов Excel из C #) - PullRequest
2 голосов
/ 19 мая 2010

Далее я пытаюсь сохранить набор объектов в листе Excel. Каждый раз, когда вызывается функция для сохранения значения, она должна выделять следующую ячейку столбца A для хранения этого объекта.

Однако исключение выдается библиотекой Interop при первом вызове get_Range(). (сразу после блока захвата)

Кто-нибудь знает, что я делаю не так?

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 (объект Cell1, объект 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 \ Мои документы \ Visual Studio 2008 \ Projects \ JRE.WCF \ WorkbookTemplateManager \ EditTemplateForm.cs: строка 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 (MouseEven tArgs 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 (Сообщение & m) \ r \ n в System.Windows.Forms.Button.WndProc (Сообщение & m) \ r \ n в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Сообщение & 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) "

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Из некоторых оглядываясь по сторонам, я обнаружил несколько примеров, где у самой строки есть равные и явные ссылки на метод Names.Add. Что-то вроде:

 jresheet.Names.Add("next", "=jreTemplates!$A$1",...
0 голосов
/ 21 марта 2013

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

Имя, которое я пытался добавить, было 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);
...