none
CS1061 "object" не содержит определения для "End" RRS feed

  • Общие обсуждения

  • Всем привет!

    Я использовал следующий код в приложении Windows Forms, и работал он без ошибок:

    using Excel = Microsoft.Office.Interop.Excel;
    
    //некоторый код...
    
    Excel.Application ObjExcel = new Excel.Application();
    string FileName = Directory.GetCurrentDirectory() + "/" + path + "/" + name + "." + extension;
    Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open(FileName, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
    Excel.Worksheet ObjWorkSheet;
    ObjWorkSheet = (Excel.Worksheet)ObjWorkBook.Sheets[1];
    int countOfExcelCells = ObjWorkSheet.Cells[ObjWorkSheet.Columns.Rows.Count, 1].End[Excel.XlDirection.xlUp].Row;

    Этот же код я скопировал в класс, который подключил к Веб-сайту, и сразу получил ошибку:

    CS1061    "object" не содержит определения для "End", и не удалось найти доступный метод расширения "End", принимающий тип "object" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

    Данная ошибка исчезает, если вместо 

    int countOfExcelCells = ObjWorkSheet.Cells[ObjWorkSheet.Columns.Rows.Count, 1].End[Excel.XlDirection.xlUp].Row;

    написать:

    Excel.Range cells = (Excel.Range)ObjWorkSheet.Cells[ObjWorkSheet.Columns.Rows.Count, 1];
    int countOfExcelCells = cells.End[Excel.XlDirection.xlUp].Row;


    Не понятно, почему необходимо менять синтаксис в коде при перемещении его в класс, подключаемый к Веб-сайту?

    Более того, следующий код:

    Excel.Range range = ObjWorkSheet.get_Range("A2", "A" + countOfExcelCells.ToString());
    int i = 0;
    
    foreach (dynamic elem in range.Value)
    {
       //некоторый код
       i++;
    }

    также стал приводить к ошибке:

    CS1579    Оператор foreach не работает с переменными типа "object", так как "object" не содержит открытого определения экземпляра для "GetEnumerator".

    И как исправить ошибку CS1579 - я, сожалению, понятия не имею. Подскажите, пожалуйста, как заставить рабочий в локальном приложении код работать и в Веб-сайте?

    27 декабря 2018 г. 14:22

Все ответы

  • Как именно вы подключили код к сайту, путем добавления ссылки на сборку? Или скопировав исходный код и заново его компилируя уже в проекте сайта? 

    Версия .NET на сайте и в приложении какая? 

    28 декабря 2018 г. 5:26
  • Как именно вы подключили код к сайту, путем добавления ссылки на сборку? Или скопировав исходный код и заново его компилируя уже в проекте сайта? 

    Версия .NET на сайте и в приложении какая? 

    Я добавил к сайту новый элемент - Класс - и скопировал исходный код в него. Предварительно я подключил к сайту ссылку на Microsoft.Office.Interop.Excel, поэтому в остальном ошибок не возникло.

    Версия .NET на сайте и в приложении - 4.5.2.

    С ошибкой CS1579 получилось разобраться вот так:

    Excel.Range range = ObjWorkSheet.get_Range("A2", "A" + countOfExcelCells.ToString());
    int i = 0;
    
    foreach (dynamic elem in (dynamic)range.Value)
    {
       //некоторый код
       i++;
    }

    Но так и не понятно, почему потребовались эти изменения при переносе кода в класс, подключаемый в веб-сайту.

    28 декабря 2018 г. 7:11
  • Как именно вы добавляете ссылку на Excel Automation? Вы указываете Type Library (на вкладке COM в диалоге добавления ссылки) или напрямую сгенерированную на ее основе управляемую сборку (т.е, нажимаете Обзор и выбираете dll-файл)? В свойствах ссылки у вас параметр Embed Interop Types (Внедрить типы взаимодействия) чему равен в проекте сайта?
    28 декабря 2018 г. 7:47
  • Как именно вы добавляете ссылку на Excel Automation? Вы указываете Type Library (на вкладке COM в диалоге добавления ссылки) или напрямую сгенерированную на ее основе управляемую сборку (т.е, нажимаете Обзор и выбираете dll-файл)? В свойствах ссылки у вас параметр Embed Interop Types (Внедрить типы взаимодействия) чему равен в проекте сайта?

    Я нажимал обзор и выбирал dll-файл. Точно так же я делал и в локальном приложении.

    В файле Web.config ссылка выглядит вот так:

    <add assembly="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"/>

    В файле типа ".csproj" локального приложения ссылка выглядела вот так:

    <Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
          <SpecificVersion>False</SpecificVersion>
          <EmbedInteropTypes>True</EmbedInteropTypes>
          <HintPath>C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll</HintPath>
    </Reference>

    Попробовал изменить ссылку в файле Web.config вот так:

    <add assembly="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C, processorArchitecture=MSIL, SpecificVersion=False, EmbedInteropTypes=True"/>

    Не помогло, к сожалению. Может, нужно как-то по-другому включать EmbedInteropTypes на сайте?


    • Изменено Demid_T 28 декабря 2018 г. 8:21 Сделать более читаемым
    28 декабря 2018 г. 8:19
  • Не обязательно лезьть в конфиг, можно нажать правой кнопкой по ссылке в интерфейсе студии и выбрать "Свойства". Этот параметр должен устанавливаться через интерфейс и для сайтов тоже. А вообще, лучше добавлять ссылку на tlb (в окне добавления ссылки выбрать COM -> Microsoft Excel Object Library), если конечно вам не нужна версия, отличающаяся от версии на вашей машине.
    28 декабря 2018 г. 9:47
  • Не обязательно лезьть в конфиг, можно нажать правой кнопкой по ссылке в интерфейсе студии и выбрать "Свойства". Этот параметр должен устанавливаться через интерфейс и для сайтов тоже. А вообще, лучше добавлять ссылку на tlb (в окне добавления ссылки выбрать COM -> Microsoft Excel Object Library), если конечно вам не нужна версия, отличающаяся от версии на вашей машине.

    У веб-сайта свойств у ссылок нет - ссылки у веб-сайта вообще не отображаются в интерфейсе студии, в отличие от ссылок у локального приложения. Ссылки у веб-сайта можно увидеть в "Страницы свойств" -> "Ссылки", и там их можно добавлять и удалять, по нажатию правой кнопки ничего не происходит, кнопки со свойствами нет.


    Через COM попробовал добавить. Ссылка в файле Web.config теперь не нужна, добавилась ссылка в файл vwd.webinfo:

    <reference Name="interop.microsoft.office.interop.excel" ID="{00020813-0000-0000-C000-000000000046}\1.9\0">

    Но работает всё так же - без внедрённых типов взаимодействия. Пробовал изменять в файле vwd.webinfo ссылку:

    <reference Name="interop.microsoft.office.interop.excel" ID="{00020813-0000-0000-C000-000000000046}\1.9\0">
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </reference>

    Не помогло.


    28 декабря 2018 г. 12:53
  • Тогда я даже не знаю, как заставить это заработать. Поменяйте тип проекта на "Веб-приложение", тогда проблема отпадет.
    • Изменено VadimTagil 29 декабря 2018 г. 5:11
    29 декабря 2018 г. 3:29
  • Тогда я даже не знаю, как заставить это заработать. Поменяйте тип проекта на "Веб-приложение", тогда проблема отпадет.
    Может, отпадёт. К сожалению, для меня приемлем только веб-сайт, так что буду просто править код. Всё равно спасибо за помощь.
    29 декабря 2018 г. 6:08