Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/47: Рейтинг темы: голосов - 47, средняя оценка - 4.62
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
1

Проблема с Interop (Excel, Word)

02.09.2021, 05:52. Показов 9231. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Дорогие форумчане, написал программку для офиса, закинул на сервер, чтобы все могли пользоваться и столкнулся с проблемой.
Дело в том, что там где Я ее писал был офис 2016 и на компьютерах с другой версией вылетала ошибка, так же вылетала ошибка если версия word, excel не активирована на компьютере.
Пока вижу 2 пути решения:
1 - переустановить всем офис 2016
2 - попытаться в реестре поковыряться (сомнительный)
Так вот, есть ли способ "вшить" interop в саму программу или иной способ обойти данную...ммм..."загвоздку"? =)

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

P.S. : Желательно не сильно кардинальный, чтобы не пришлось переделывать всё...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2021, 05:52
Ответы с готовыми решениями:

Microsoft.Office.Interop.Excel.Application процессы Excel в памяти компьютера
Добрый день, коллеги! Программа работает с файлами Excel. В каждой процедуре я указываю, что...

Работа с Excel через Microsoft.Office.Interop.Excel
Необходимо реализовать програмку взаимодействующую с Excel в режиме реального времени. Проблем...

Не могу записать в файл Excel при Microsoft.Office.Interop.Excel.Application.Visible = False
Коллеги, доброго времени суток. Столкнулся с такой проблемой. Не могу записать в файл, когда...

Работа с word и excel (Interop)
Добрый вечер всем. Появился у меня вопрос по моему проекту. Написал я небольшую программку. Все...

28
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 06:34 2
Zhivoder, используйте "позднее связывание", тогда отпадет привязка к версии Interop.

или же использовать библиотеку Interop от Офиса 2010, тем самым все следующие версии офиса будут с ней совместимы.


качать отсюда (Nuget)

Думаю сейчас редко встретишь офис 2007, хотя, если есть, то лучще тогда версию 12 библиотеки использовать.
2
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 07:01  [ТС] 3
Yury Komar, можно чуть подробнее, что за "позднее связывание"?
А библиотеку можно включить в саму программу?

Добавлено через 17 минут
по первому вопросу нашел информацию читаю
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 07:09 4
Zhivoder, Вам ненужно носить эту библиотеку "с собой", она есть в установленном офисе, просто удаляете ссылку на вашу библиотеку от 2016-го офиса, устанавливаете необходимый NuGet пакет, ничего в коде менять не придётся.
Так как проект будет ссылаться на библиотеку от офиса 2010, то все последующие имеют обратную совместимость и успешно будут запускаться и работать.

Позднее связывание неудобно при написании кода и отладке.
0
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 07:45  [ТС] 5
на VS2010 NuGet не поставить, попробую потанцевать с бубном...
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 08:29 6
Zhivoder, вытяните из пакета нужную dll
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 08:32 7
Вот попробуйте, вытащил из пакета:
Вложения
Тип файла: zip Microsoft.Office.Interop.Word.dll.zip (267.9 Кб, 49 просмотров)
Тип файла: zip Microsoft.Office.Interop.Excel.dll.zip (400.6 Кб, 67 просмотров)
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 08:35 8
Хотя, возможно у вас она тоже есть в системе, посмотрите в поиске по сборкам .NET, возможно нужно просто выбрать версию 12 или 14...

Если нет, используйте, вместо той, что сейчас используете, те, что я выше приложил. Повторюсь, ненужно их таскать с EXE'шником
0
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 09:43  [ТС] 9
Yury Komar, ссылку на библиотеку сделал, те, что были на 16 оффис удалил, проблема не ушла, вываливается исключение на других версиях:

Кликните здесь для просмотра всего текста

Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.

************ Текст исключения ************
System.InvalidCastException: Невозможно привести COM-объект типа "Microsoft.Office.Interop.Excel.ApplicationClass" к интерфейсному типу "Microsoft.Office.Interop.Excel._Application". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{000208D5-0000-0000-C000-000000000046}" возвратил следующую ошибку: Библиотека не зарегистрирована. (Исключение из HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)).
в System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
в Microsoft.Office.Interop.Excel.ApplicationClass.set_DisplayAlerts(Boolean RHS)
в M20k20.Form1.Form1_Load(Object sender, EventArgs e)
в System.EventHandler.Invoke(Object sender, EventArgs e)
в System.Windows.Forms.Form.OnLoad(EventArgs e)
в System.Windows.Forms.Form.OnCreateControl()
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl()
в System.Windows.Forms.Control.WmShowWindow(Message& m)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
в System.Windows.Forms.Form.WmShowWindow(Message& m)
в System.Windows.Forms.Form.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************ Загруженные сборки ************
mscorlib
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4069.0 built by: NET48REL1LAST_B
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
M2k20
Версия сборки: 1.0.0.0
Версия Win32: 1.0.0.0
CodeBase: file:///Y:/1.%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B/28.%20%D0%9F%D0%A2%D0%A3%20%D0%AE%D0%93/11.%20%D0%9C%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE-%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D1%81%D0%B D%D0%B0%D0%B1%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5/%D0%9C2k20/M2k20%20%D0%BD%D0%BE%D0%B2%D0%B0%D1%8F%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F.ex e
----------------------------------------
Microsoft.VisualBasic
Версия сборки: 10.0.0.0
Версия Win32: 14.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4001.0 built by: NET48REL1LAST_C
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4110.0 built by: NET48REL1LAST_B
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
Версия сборки: 4.0.0.0
Версия Win32: 4.8.4042.0 built by: NET48REL1LAST_C
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Runtime.Remoting
Версия сборки: 4.0.0.0
Версия Win32: 4.8.3761.0 built by: NET48REL1
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------


может Я чего-то не так сделал?)

Добавлено через 2 минуты
может имело смысл 12 версию поставить... сейчас попробую
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 09:51 10
Zhivoder, а другие версии офиса - это какие?

Добавлено через 3 минуты
Да, наверное Вам будет лучше использовать позднее связывание, тогда проблему с библиотекой должны уйти. И да, офис должен быть установлен на всех компах, где используется ваше приложение.
0
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 09:57  [ТС] 11
Yury Komar, Он установлен везде, только на некоторых машинах другая версия оффиса.
Пробовал 12 версию, не помогла.

Добавлено через 2 минуты
office 2007
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 10:01 12
Позднее связывание можно организовать так (перед этим удалив ссылки на Interop из проекта), далее, подтягиваеье библиотеку таким образом
VB.NET
1
2
3
Dim objApp As Object = CreateObject("Excel.Application")
Dim objBook As Object = objApp.Workbooks.Open("D:\book1.xls")
'...далее все по той же схеме, как и у вас, только явное указание типов (WorkBook, WorkSheet и т.п. нужно заменить на Object)
Добавлено через 2 минуты
Zhivoder, ну 12 версия должна сработать, возможно потому, что приложение ищет ссылку на библиотеку в том месте, откуда вы ее подключили, а ее там нет.
0
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 10:07  [ТС] 13
Yury Komar, Я тоже так подумал, но парадокс...на остальных машинах работает...
Про позднее связывание понял, пока оставлю на запасной вариант, еще помучаюсь, ну на крайняк попрошу сисадмина обновить оффис у сотрудницы)
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 10:11 14
Zhivoder, попробуйте зарегистрировать сборку 12й версии в своей системе и уже вибрать из списка GAC ссылку, а не явно указав файл. пересоберите и проверьте.

обязательно удаляйте все другие ссылки на эту библиотеку
0
2058 / 1476 / 383
Регистрация: 26.06.2017
Сообщений: 4,227
02.09.2021, 12:30 15
Мне сам подход к проблеме кажется не корректным. Вместо того чтобы жёстко фиксировать версию библиотеки лучше попытаться проверить какая(ие) уже зарегистрированы зарегистрирована ли вообще, а затем использовать самую свежую. Вот пример подключения библиотеки в коде.
1
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 13:00  [ТС] 16
Uswer, Мне понравился подход к делу, а где почитать как это использовать?
Ну Я имею ввиду, вот прописал строчку с дллимпорт, а дальше по коду надо что-то менять? Что в функцию за Дллимпорт вбивать?

Добавлено через 8 минут
что-то даже на майкрософтовском сайте информации не густо
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 13:00 17
Uswer, Хорошая идея, но, как ни крути, это, вроде, будет то же самое "позднее связывание", что и постом выше, создавая объект COM-сборки, который, в свою очередь, тоже берет актуальную версию, имеющуюся в системе и работает с ней.
0
2058 / 1476 / 383
Регистрация: 26.06.2017
Сообщений: 4,227
02.09.2021, 13:11 18
Цитата Сообщение от Zhivoder Посмотреть сообщение
на майкрософтовском сайте информации не густо
Да не густо, вот например
Цитата Сообщение от Zhivoder Посмотреть сообщение
а дальше по коду надо что-то менять?
Насколько я понимаю после подключения библиотеки Вы просто вызываете методы, используете типы данных, которые описаны в этой библиотеке и т.п. В общем работаете так, как будто она подключена через Impots, т.е. в коде менять ничего не потребуется.

Добавлено через 2 минуты
Yury Komar, возможно и так, но ведь теперь в коде можно организовать разного рода проверки: посмотреть в реестр, поисках на дисках и т.д. и при наличии нескольких версий DLL подключить нужную (не обязательно самую свежую кстати). А главное понять, что сама библиотека есть.
0
Модератор
Эксперт .NET
4303 / 3378 / 506
Регистрация: 27.01.2014
Сообщений: 6,180
02.09.2021, 13:17 19
Uswer, Удобно, че сказать. Надо попробовать будет.
0
32 / 28 / 3
Регистрация: 16.12.2019
Сообщений: 106
02.09.2021, 13:30  [ТС] 20
Блин ребят, Я не такой крутой как вы)))

1. Я отключаю ссылку на тот Интероп, что у меня есть?
2. Что пихать в функцию?
VB.NET
1
2
3
4
<DllImport("Microsoft.Office.Interop.Excel.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Shared Function LoadLibrary(ByVal libname As String) As IntPtr
 
    End Function
3. Если ответ на 1 вопрос "Да", то чем заменить подобного рода строки?
VB.NET
1
2
Private ExcelApp As New Microsoft.Office.Interop.Excel.Application
    Private database As Microsoft.Office.Interop.Excel.Workbook
P.S. Объясните пожалуйста, можете обзываться))))
0
02.09.2021, 13:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2021, 13:30
Помогаю со студенческими работами здесь

Interop.Microsoft.Office.Interop.Excel, как исправить ошибку несовместимости версий
Error 1 Assembly 'Interop.Microsoft.Office.Interop.Excel, Version=1.7.0.0, Culture=neutral,...

Interop.Microsoft.Office.Interop.Excel
Добрый день! Собственно есть Win10, Visual Studio 2019, есть MS Office 2007 с установленным...

Как получить шапку Word, Microsoft.Office.Interop.Word?
Всем доброго дня! Столкнулся с проблемой, не удается получить шапку doc документа. Само тело...

Работа с таблицей в Word через библиотеку Microsoft.Interop.Word
Здравствуйте, я продвинутый программист.Пишу программу и использованием библиотеки...

Считать текст из Word посредством Microsoft.Office.Interop.Word
Необходимо считать форматированный текст из Word посредством Microsoft.Office.Interop.Word. По...

Как задать стиль таблицы в Word через библиотеку Microsoft.Office.Interop.Word
Такая проблема пытаюсь задать стиль таблицы для Word. Пишет что элемент с указанным именем не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru