Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Mr. Artman от 28-05-2021, 20:06:02

Название: Получение данных из Excel
Отправлено: Mr. Artman от 28-05-2021, 20:06:02
Всем привет.
Вопрос по поводу получения данных из Excel. А именно хотелось бы выбирать элемент в Revit по ID напрямую из таблицы Excel, то есть выделяем ячейку с ID, жмем кнопку и получаем элемент в Ревит.

Создал библиотеку классов со следующим кодом:

Код - C# [Выбрать]
  1. namespace ExcelID
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     [Regeneration(RegenerationOption.Manual)]
  5.     public class Command : IExternalCommand
  6.     {
  7.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  8.         {
  9.             //Get application and documnet objects
  10.             UIApplication uiapp = commandData.Application;
  11.             Document doc = uiapp.ActiveUIDocument.Document;
  12.  
  13.             //Open form
  14.             RevitPlugins.Form1 f1 = new RevitPlugins.Form1();
  15.             f1.ShowDialog();
  16.  
  17.             return Result.Succeeded;
  18.         }
  19.     }
  20. }

Форма соответственно следующего содержания:

Код - C# [Выбрать]
  1. private void button_get_Click(object sender, EventArgs e)
  2.         {
  3.             try
  4.             {
  5.             //Get active excel instance
  6.             Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
  7.  
  8.             //Get active excel workbook
  9.             Excel.Workbook xlWorkBook = (Excel.Workbook)xlApp.ActiveWorkbook;
  10.  
  11.             //Get active excel worksheet
  12.             Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.ActiveSheet;
  13.  
  14.             //Get value for excel          
  15.             string AValue = xlApp.ActiveCell.Value2.ToString();
  16.  
  17.             //Return value to winform textbox
  18.             label1.Text = AValue;
  19.             }
  20.             catch (NullReferenceException)
  21.             {
  22.                 MessageBox.Show("ActiveCell was null");
  23.             }
  24. }



Так вот при попытке получить данные получаю следующую ошибку:

(https://i.postimg.cc/MXGL5vZm/2021-05-28-200234.jpg) (https://postimg.cc/MXGL5vZm)

В то же время все отлично работает при создании проекта Winforms.

Полагаю проблема в том что вызов происходит именно из библиотеки классов.

Подскажите пожалуйста как можно это осуществить.

Заранее спасибо.

Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 28-05-2021, 20:52:06
Mr. Artman,
Какая разрядность MS Office установлена?
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 28-05-2021, 20:56:30
X64
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 28-05-2021, 21:16:11
X64
Точно? Если x64, то должно работать.
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 28-05-2021, 21:23:29
Здесь аналогичная ошибка: https://forum.dynamobim.com/t/data-importexcel-operation-failed-error-loading-type-library-dll/44214
Предлагают восстановить MS Office: https://helpmy.computer/microsoft-office-quick-repair/
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 28-05-2021, 21:23:49
Упс. Простите Александр, обманул Вас, действительно 32.

А есть ли возможность провернуть это с 32-рязрядной версией?
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 28-05-2021, 21:32:51
Упс. Простите Александр, обманул Вас, действительно 32.

А есть ли возможность провернуть это с 32-рязрядной версией?
Насколько я помню - нет. Но ты можешь воспользоваться другими методами для чтения xlsx-файла без использования вызова MS Excel через COM.
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 28-05-2021, 21:40:37
Например, https://github.com/ExcelDataReader/ExcelDataReader
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 12:53:44
Например, https://github.com/ExcelDataReader/ExcelDataReader

Спасибо Александр за наводку. Пробую.
Но пока не могу понять как получить доступ именно к открытой активной книге Excel. То есть аналогично методу "xlApp.ActiveWorkbook" через COM.

Буду очень благодарен за подсказку.
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 29-05-2021, 13:05:26
Но пока не могу понять как получить доступ именно к открытой активной книге Excel. То есть аналогично методу "xlApp.ActiveWorkbook" через COM.
Никак. Разве что писать приложение для Excel, которое будет сохранять информацию об открытой книге куда-то, откуда твоё приложение будет его брать. Но мне совершенно непонятно зачем это.
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 13:21:57
Никак. Разве что писать приложение для Excel, которое будет сохранять информацию об открытой книге куда-то, откуда твоё приложение будет его брать. Но мне совершенно непонятно зачем это.

Постараюсь пояснить.
Цель - упростить работу с отчетами по конфликтам элементов, которые выполнены в виде файлов Excel, где указаны ID конфликтующих элементов. Да, в Revit есть кнопка поиска элементов по ID, но постоянный копипаст ID немого утомляет, Поэтому хотелось бы немного упростить этот процесс.

А что на счет чтения данных, то я так понимаю единственный способ - открывать File Explorer или указывать путь к файлу, верно?
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 29-05-2021, 13:26:14
А что на счет чтения данных, то я так понимаю единственный способ - открывать File Explorer или указывать путь к файлу, верно?
Указывать путь к файлу, если нет какой-то логики в путях/названиях файлов, по которой можно было бы программно определить его местоположение.
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 13:28:18
https://forum.dynamobim.com/t/get-currently-selected-excel-cells-for-subsequent-revit-action/50967
 (https://forum.dynamobim.com/t/get-currently-selected-excel-cells-for-subsequent-revit-action/50967)
Вот в этой ветке обсуждали аналогичный вопрос и как-то осуществили это через COM на сколько я понял через Python Script в Dynamo.
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 13:34:24
Например, https://github.com/ExcelDataReader/ExcelDataReader

И еще такой вопрос:
Допустим файл открыт, а есть ли способ через ExcelDataReader получить доступ к активной выделенной ячейке (ActiveCell)?
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 29-05-2021, 13:37:19
Допустим файл открыт, а есть ли способ через ExcelDataReader получить доступ к активной выделенной ячейке (ActiveCell)?
Нет конечно. Эта библиотека вообще ничего не знает про запущенный Excel - более того она работает с xls/xlsx-файлами даже если Excel не установлен на компьютере. Активную ячейку можно получить только через Excel COM/ActiveX. Так что или устанавливать MS Office x64 или отказываться от такой логики работы. В принципе ты можешь при помощи ExcelDataReader прочитать все ID, вывести этот список и предлагать пользователю выбрать нужный ID.
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 13:47:05
В принципе ты можешь при помощи ExcelDataReader прочитать все ID, вывести этот список и предлагать пользователю выбрать нужный ID.

Отличная идея. Спасибо!

И еще такой наверное довольно дилетантский вопрос ) прошу заранее не судить строго так как я далеко не профессиональный программист ). Можно ли в проекте библиотеки классов создать выполняемое приложение WinForms (через которое как я говорил ранее все работает и с 32-разрядной версией), получать данные и затем передавать их в Revit? )

Или возможно вообще пойти обратным путем и есть ли возможность достучаться до Revit из внешнего процесса? ) Ну то есть есть ли для Revit возможность COM-автоматизации по аналогии с AutoCAD например?
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 29-05-2021, 14:15:48
Ну то есть есть ли для Revit возможность COM-автоматизации по аналогии с AutoCAD например?
Через COM/ActiveX нельзя: https://adn-cis.org/forum/index.php?topic=1051
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 20:44:48
Решил попробовать с 64-разрядной версией Excel.
Установлен 2013 версия

Так вот теперь в менеджере ссылок Visual Studio пропала ссылка на библиотеку Microsoft.Office.Interop.Excel:

(https://i.postimg.cc/QB6GSTTc/2021-05-29-204407.jpg) (https://postimg.cc/QB6GSTTc)

В чем может быть проблема?
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 29-05-2021, 20:47:18
Поищи по "Excel" а не по "Interop"
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 20:51:09
Поищи по "Excel" а не по "Interop"

Так тоже пробовал )

(https://i.postimg.cc/GHsDCP3h/2021-05-29-205038.jpg) (https://postimg.cc/GHsDCP3h)
Название: Re: Получение данных из Excel
Отправлено: Mr. Artman от 29-05-2021, 21:01:50
Добавил ссылку через NuGet.

Но в итоге плагин выдает ту-же самую ошибку ( получается дело не в разрядности.
Название: Re: Получение данных из Excel
Отправлено: Александр Ривилис от 29-05-2021, 21:12:32
Добавил ссылку через NuGet.

Но в итоге плагин выдает ту-же самую ошибку ( получается дело не в разрядности.
Возможно проблема в регистрации Excel COM/ActiveX. Поэтому одной из рекомендаций было восстановление MS Office.