Получение данных из Excel

Автор Тема: Получение данных из Excel  (Прочитано 5098 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Получение данных из Excel
« : 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. }



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



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

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

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

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


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #1 : 28-05-2021, 20:52:06 »
Mr. Artman,
Какая разрядность MS Office установлена?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #2 : 28-05-2021, 20:56:30 »
X64

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #3 : 28-05-2021, 21:16:11 »
X64
Точно? Если x64, то должно работать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #4 : 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/
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #5 : 28-05-2021, 21:23:49 »
Упс. Простите Александр, обманул Вас, действительно 32.

А есть ли возможность провернуть это с 32-рязрядной версией?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #6 : 28-05-2021, 21:32:51 »
Упс. Простите Александр, обманул Вас, действительно 32.

А есть ли возможность провернуть это с 32-рязрядной версией?
Насколько я помню - нет. Но ты можешь воспользоваться другими методами для чтения xlsx-файла без использования вызова MS Excel через COM.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Mr. Artman 29-05-2021, 13:14:29

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #7 : 28-05-2021, 21:40:37 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #8 : 29-05-2021, 12:53:44 »
Например, https://github.com/ExcelDataReader/ExcelDataReader

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

Буду очень благодарен за подсказку.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #9 : 29-05-2021, 13:05:26 »
Но пока не могу понять как получить доступ именно к открытой активной книге Excel. То есть аналогично методу "xlApp.ActiveWorkbook" через COM.
Никак. Разве что писать приложение для Excel, которое будет сохранять информацию об открытой книге куда-то, откуда твоё приложение будет его брать. Но мне совершенно непонятно зачем это.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #10 : 29-05-2021, 13:21:57 »
Никак. Разве что писать приложение для Excel, которое будет сохранять информацию об открытой книге куда-то, откуда твоё приложение будет его брать. Но мне совершенно непонятно зачем это.

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

А что на счет чтения данных, то я так понимаю единственный способ - открывать File Explorer или указывать путь к файлу, верно?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #11 : 29-05-2021, 13:26:14 »
А что на счет чтения данных, то я так понимаю единственный способ - открывать File Explorer или указывать путь к файлу, верно?
Указывать путь к файлу, если нет какой-то логики в путях/названиях файлов, по которой можно было бы программно определить его местоположение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #12 : 29-05-2021, 13:28:18 »
https://forum.dynamobim.com/t/get-currently-selected-excel-cells-for-subsequent-revit-action/50967

Вот в этой ветке обсуждали аналогичный вопрос и как-то осуществили это через COM на сколько я понял через Python Script в Dynamo.

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #13 : 29-05-2021, 13:34:24 »
Например, https://github.com/ExcelDataReader/ExcelDataReader

И еще такой вопрос:
Допустим файл открыт, а есть ли способ через ExcelDataReader получить доступ к активной выделенной ячейке (ActiveCell)?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #14 : 29-05-2021, 13:37:19 »
Допустим файл открыт, а есть ли способ через ExcelDataReader получить доступ к активной выделенной ячейке (ActiveCell)?
Нет конечно. Эта библиотека вообще ничего не знает про запущенный Excel - более того она работает с xls/xlsx-файлами даже если Excel не установлен на компьютере. Активную ячейку можно получить только через Excel COM/ActiveX. Так что или устанавливать MS Office x64 или отказываться от такой логики работы. В принципе ты можешь при помощи ExcelDataReader прочитать все ID, вывести этот список и предлагать пользователю выбрать нужный ID.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #15 : 29-05-2021, 13:47:05 »
В принципе ты можешь при помощи ExcelDataReader прочитать все ID, вывести этот список и предлагать пользователю выбрать нужный ID.

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

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

Или возможно вообще пойти обратным путем и есть ли возможность достучаться до Revit из внешнего процесса? ) Ну то есть есть ли для Revit возможность COM-автоматизации по аналогии с AutoCAD например?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #16 : 29-05-2021, 14:15:48 »
Ну то есть есть ли для Revit возможность COM-автоматизации по аналогии с AutoCAD например?
Через COM/ActiveX нельзя: https://adn-cis.org/forum/index.php?topic=1051
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #17 : 29-05-2021, 20:44:48 »
Решил попробовать с 64-разрядной версией Excel.
Установлен 2013 версия

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



В чем может быть проблема?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #18 : 29-05-2021, 20:47:18 »
Поищи по "Excel" а не по "Interop"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #19 : 29-05-2021, 20:51:09 »
Поищи по "Excel" а не по "Interop"

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



Оффлайн Mr. ArtmanАвтор темы

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Получение данных из Excel
« Ответ #20 : 29-05-2021, 21:01:50 »
Добавил ссылку через NuGet.

Но в итоге плагин выдает ту-же самую ошибку ( получается дело не в разрядности.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получение данных из Excel
« Ответ #21 : 29-05-2021, 21:12:32 »
Добавил ссылку через NuGet.

Но в итоге плагин выдает ту-же самую ошибку ( получается дело не в разрядности.
Возможно проблема в регистрации Excel COM/ActiveX. Поэтому одной из рекомендаций было восстановление MS Office.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение