Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/179: Рейтинг темы: голосов - 179, средняя оценка - 4.78
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077

Работа с Word/Excel через Ole/иные способы

20.11.2009, 12:29. Показов 35935. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, товарищи.

Да, много читал всего интересного в Интернет по этому вопросу - и тут, и тут...

Но это всё мне не подходит, точнее сказать следующе:
1. в первом случае не понятно, какая библиотека используется. В стандартной комплектации Windows SDK её нет, возможно она под Борланд? Короче говоря этот способ уместен, если только есливзять чистый COM/OLE, но это достаточно длительное время займёт - изучение этого...
2. Вторая статья - интересная, но вываливает мне не один десяток ошибок... Да и к тому же там никак под 2003. или даже под 2000й офис сделана статья, а под 2007 не пашет, так как имена библиотек уже изменились... Разбирался с этим месяц назад - уже подзабыл маленько...

В общем, просьба такая:
1. Если у вас есть хорошие примерчики для Ole, то скиньте - хоть подразобраться что к чему
2. Если есть примеры со вторым способом - то тоже было бы неплохо на них посмотреть, чтобы понять - в чём не прав я...
3. Может ещё какие есть варианты? Но нужно исходить из того, что программу пишу в Visual C++ c использованием WinAPI...
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2009, 12:29
Ответы с готовыми решениями:

Работа с документом Word через Ole в Delphi
Как можно скопировать текст из одного документа и вставить в определенное место в другом??? Как можно несколько документов соединить в...

Работа с Excel через OLE
Здравствуйте Использую C++ Builder 6, пытаюсь подключится к уже запущеному Excel приложению, использую функцию GetActiveOleObject: ...

Иные способы выхода в интернет
Все видели сегодняшние новости, в которых обмолвились об отключении интернета в России в случае чрезвычайных ситуаций. Конечно, врятли это...

23
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
21.11.2009, 23:39
Работаю 2-м способом, т.е.через #import, ADO.
Правда, офис не из новых, 2000, и ХР (т.е.2002). И среда разработки Visual Studio 6.0, SP5

Вот начало:
--------------------------
файл office.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef MSO2000
#include "office2K.h"
#endif
 
#ifdef MSO2002
#include "office2K2.h"
#endif
 
#ifdef MSO2003
#include "office2K3.h"
#endif
 
#ifdef MSOXP
#include "officeXP.h"
#endif
--------------------------
файл office2K.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "E:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\MSO9.DLL"
 
#import "E:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\excel9.olb" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    no_dual_interfaces
using namespace Excel;
 
#import "E:\Program Files\Microsoft Office\Office\MSWORD9.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
--------------------------
файл office2K2.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\OFFICE10\MSO.DLL" \
    named_guids, \
    rename("RGB","officeRGB"), \
    rename("DocumentProperties", "officeDocumentProperties")  
using namespace Office;
 
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\VBA\VBA6\Vbe6ext.olb" \
    rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE10\excel.exe" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    no_dual_interfaces
using namespace Excel;
/*
 // NOTE: UNCOMMENT FOLLOWING LINE IF USING MDAC 2.1 (ADO 2.1) and comment line with Msdasc.dll. 
#import "F:\Program Files\Common Files\System\OLE DB\OLEDB32.dll" rename_namespace("dl20")
using namespace dl20;
 
// NOTE: UNCOMMENT FOLLOWING LINE IF USING MDAC 2.0 (ADO 2.0) and comment above line. 
//#import "C:\Program Files\Common Files\System\OLE DB\Msdasc.dll" rename_namespace("dl20")
 
//Reason: Datalink connection string builder, was moved to oledb32.dll in ADO2.1 
//where as in ADO2.0 it was located in Msdasc.dll (ADO2.0)
 
#import "F:\Program Files\Common Files\SYSTEM\ADO\MSADO15.DLL" \
    rename_namespace("ado20") \
    rename( "EOF", "adoEOF")
using namespace ado20;
*/
#import "C:\Program Files\Microsoft Office\Office10\MSWORD.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
--------------------------

MSO2000 и пр. - мои препроцессорные константы, в настройках проекта
1
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 11
20.01.2010, 22:11
Вот у меня тоже проблемка, только с вордом... Пробовала писать представленные тут коды, с единым уточнением - изменяю пути к файлам типа excel9.olb, но для ворда. Вижу это решение уже не раз и пробовала на 2-х различных компьютерах (так получилось =) ) Оба раза выдало ошибку, типа "не нахожу я ваши файлики в этом месте!". Попробовала сама найти эти файлы и их там таки нет! =(
То ли я совсем плохо соображаю, то ли не пойму совсем =(
Эти файлы стандартные или я пропустила самую важную часть всех перечитанных статей - о том, что их выкачивают? Или может они варьируют свое местонахождение в зависимости от версии?
Вообще может есть какая-то библиотека, которая дает возможность читать (мне только это надо) тексты из вордовских файлов, может что-то на подобии как в делфях?
0
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 11
26.01.2010, 19:16
Разобралась =)
Только вот теперь мучает меня такой вопрос: при подключении и компиляции проекта все супер и окей, а вот будет ли так же все супер и окей в том случае, если я пишу приложение с расчетом на различные машины, т.е. Word и Excell могут там быть установлены не на диск С:, как по умолчанию или не в ту папку. Т.о. вылетит ошибка или как?
0
2 / 2 / 0
Регистрация: 21.11.2008
Сообщений: 67
11.02.2011, 17:08
Цитата Сообщение от Том Ардер Посмотреть сообщение
Работаю 2-м способом, т.е.через #import, ADO.
Правда, офис не из новых, 2000, и ХР (т.е.2002). И среда разработки Visual Studio 6.0, SP5

Вот начало:
--------------------------
файл office.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef MSO2000
#include "office2K.h"
#endif
 
#ifdef MSO2002
#include "office2K2.h"
#endif
 
#ifdef MSO2003
#include "office2K3.h"
#endif
 
#ifdef MSOXP
#include "officeXP.h"
#endif
--------------------------
файл office2K.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "E:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\MSO9.DLL"
 
#import "E:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\excel9.olb" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    no_dual_interfaces
using namespace Excel;
 
#import "E:\Program Files\Microsoft Office\Office\MSWORD9.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
--------------------------
файл office2K2.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\OFFICE10\MSO.DLL" \
    named_guids, \
    rename("RGB","officeRGB"), \
    rename("DocumentProperties", "officeDocumentProperties")  
using namespace Office;
 
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\VBA\VBA6\Vbe6ext.olb" \
    rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE10\excel.exe" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    no_dual_interfaces
using namespace Excel;
/*
 // NOTE: UNCOMMENT FOLLOWING LINE IF USING MDAC 2.1 (ADO 2.1) and comment line with Msdasc.dll. 
#import "F:\Program Files\Common Files\System\OLE DB\OLEDB32.dll" rename_namespace("dl20")
using namespace dl20;
 
// NOTE: UNCOMMENT FOLLOWING LINE IF USING MDAC 2.0 (ADO 2.0) and comment above line. 
//#import "C:\Program Files\Common Files\System\OLE DB\Msdasc.dll" rename_namespace("dl20")
 
//Reason: Datalink connection string builder, was moved to oledb32.dll in ADO2.1 
//where as in ADO2.0 it was located in Msdasc.dll (ADO2.0)
 
#import "F:\Program Files\Common Files\SYSTEM\ADO\MSADO15.DLL" \
    rename_namespace("ado20") \
    rename( "EOF", "adoEOF")
using namespace ado20;
*/
#import "C:\Program Files\Microsoft Office\Office10\MSWORD.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
--------------------------

MSO2000 и пр. - мои препроцессорные константы, в настройках проекта
а есть пример как работать с 2003 или 2007 офисом?
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
12.02.2011, 00:04  [ТС]
Goran71, загляни в мою соседнюю тему, я там привёл пример.
Чуток разница в #import - другие пути, но в целом принцип остался тем же.
Только вот у меня с тем же 2010м экселем возникли траблы...
0
nike1987
28.06.2011, 11:11
Всем привет.У меня вопрос по редактированию таблиц в Ворде.Не могу понять как писать значения в колонках.И вообще есть ли более менее нормальное описание функций с примерами.Нашёл только вот это http://msdn.microsoft.com/en-u... 54954.aspx Но там вообще ничего не понятно=((((.Буду очень признателен если скинете каки-нить примерчики с работой в ворде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try {
 
        using namespace Word;
        _ApplicationPtr word(L"Word.Application");
        word->Visible = true;
        word->Activate();
 
        //создаем новый документ 
        _DocumentPtr wdoc1 = word->Documents->Add();
        RangePtr range = wdoc1->Content;
        range->LanguageID = wdRussian;
 
        range->Tables->Add(range,5,5);
 
 
        //Сохраняем, закрываем
        wdoc1->SaveAs(&_variant_t("C:\\1test.doc"));
        wdoc1->Close();
 
    } catch (_com_error& er) {
14 / 14 / 4
Регистрация: 10.07.2010
Сообщений: 130
29.06.2011, 20:36
а зачем так издеваться? не легче ли сделать так: Ctrl+W->Add Class...->From a Type Library...->папка с ворд->Office12 и выбираем MSWORD.OLB
0
1 / 1 / 0
Регистрация: 05.09.2013
Сообщений: 45
26.03.2015, 10:31
Господа звиняйте за некропост но я таки интересуюсь знать вот какой проблемой.
Библиотеки офиса подключаются директивой ПРЕпроцессора #import и в зависимости от версии офиса они могут быть различны. Далее - пути по которым они располагаются так же могут быть различны - зависит от извращенности хозяина ОС (назвать папку Program Files как-то по другому, в х64 вообще она называется Program Files (x86) итд итп). Решить эту проблему можно пхнув нужные либы например на диск С в какую-либо отдельную папку и молиться о том что нужная версия офиса у пользователя имеется. Но что делать если это не так? Можно ли это как-то проверить или позволить программе спокойно свалиться?

И еще вопрос. Мне нужно чтобы в зависимости от извращений пользователя (стоит 2 версии офиса - 2003 и 2010) программа выбирала какую-либо одну, например, ту которая запускается по-умолчанию. Так же если у пользователя отсутствует версия 2003 но есть 2010 импортировались те либы которые подходят под установленную версию офиса.

Как это можно реализовать?
Заранее спасибо.
0
2 / 2 / 1
Регистрация: 08.02.2020
Сообщений: 215
16.02.2020, 01:25
А как быть, если я файла MSO.DLL в своем офисе вообще не нахожу? Офис 2013, если не ошибаюсь. Есть куча ДЛЛ с похожими названиями, какая нужна?

Добавлено через 21 минуту
А нет, нашлась. У меня офис 2013.

Делаю файл office.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifdef MSO2013
#include "office2K13.h"
#endif
 
#ifdef MSO2000
#include "office2K.h"
#endif
 
#ifdef MSO2002
#include "office2K2.h"
#endif
 
#ifdef MSO2003
#include "office2K3.h"
#endif
 
#ifdef MSOXP
#include "officeXP.h"
#endif
Делаю office2K13.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\OFFICE15\MSO.DLL" \
    named_guids, \
    rename("RGB","officeRGB"), \
    rename("DocumentProperties", "officeDocumentProperties")  
using namespace Office;
 
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\VBA\VBA6\Vbe6ext.olb" \
    rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE15\excel.exe" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    no_dual_interfaces
using namespace Excel;
 
#import "C:\Program Files\Microsoft Office\Office15\MSWORD.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
Все верно? Пути все проверил.

Студия пока не стоит, попробовал приведенный выше код в CodeBlocks - виснет намертво еще при компиляции. Или строго Вижуал Студия нужна?
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
16.02.2020, 19:54
Сейчас у меня VS 2017, Office 2013 (64) и такие настройки, работают (Windows 10/64)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#import "C:\PROGRAM FILES (x86)\COMMON FILES\MICROSOFT SHARED\OFFICE15\MSO.DLL" \
    rename("IAccessible", "IAccessibleXL")
using namespace Office;
 
#import "C:\PROGRAM FILES (x86)\COMMON FILES\MICROSOFT SHARED\VBA\VBA6\Vbe6ext.olb" \
    rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "C:\Program Files\Microsoft Office\Office15\excel.exe" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RGBXL") \
    rename("DocumentProperties", "DocumentPropertiesXL")
using namespace Excel;
0
2 / 2 / 1
Регистрация: 08.02.2020
Сообщений: 215
17.02.2020, 01:21
А что мне писать в начале программы? Я правильно понимаю, что можно просто сразу написать #include "office2K13.h" и никакой office.h не упоминать? Ну, если я правильно понимаю смысл файла office.h, он служит для выбора верной версии офиса. Но это все равно ненадежно - все офисы не перечислишь, и не факт, что даже если версия на другом компе та же, она установлена с путями по умолчанию.

З.Ы. А где тут про Ворд?
0
2 / 2 / 1
Регистрация: 08.02.2020
Сообщений: 215
18.02.2020, 11:15
Попробовал в Вижуал Студии 2015, результатов не понял

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include "office2K13.h"
 
int main()
{
    using namespace Word;
    _ApplicationPtr word(L"Word.Application");
    word->Visible = true;
    word->Activate();
 
    std::cout << "Hello!";
    
    return 0;
}
Файл office2K13.h, все пути к файлам проверены:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\OFFICE15\MSO.DLL" \
    named_guids, \
    rename("RGB","officeRGB"), \
    rename("DocumentProperties", "officeDocumentProperties")  
using namespace Office;
 
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\VBA\VBA6\Vbe6ext.olb" \
    rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE15\excel.exe" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RBGXL") \
    rename("DocumentProperties", "DocumentPropertiesXL") \
    no_dual_interfaces
using namespace Excel;
 
#import "C:\Program Files\Microsoft Office\Office15\MSWORD.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
Ошибок не выдает ни при компиляции, ни при запуске - программа просто не делает ничего, даже "Hello!" не пишет

Добавлено через 10 минут
З.Ы. Наконец программа увидела модуль, получил кучу ругани

Так тоже пробовал, то же самое.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\OFFICE15\MSO.DLL" \ 
rename("IAccessible", "IAccessibleXL")  
using namespace Office;
 
#import "C:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\VBA\VBA6\Vbe6ext.olb" 
\ rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE15\excel.exe" \ rename("DialogBox", "DialogBoxXL") 
\ rename("RGB", "RBGXL") \ rename("DocumentProperties", "DocumentPropertiesXL") 
using namespace Excel;
 
#import "C:\Program Files\Microsoft Office\Office15\MSWORD.OLB" 
\ rename("ExitWindows","_ExitWindows") 
\ rename("FieldsPtr","WordFieldsPtr") \ rename_namespace("WinWord")
using namespace WinWord;
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
18.02.2020, 15:42
Код - рабочий (версия 2013)
C++
1
2
3
4
5
#import "C:\Program Files\Microsoft Office\Office15\MSWORD.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
Цитата Сообщение от archerix Посмотреть сообщение
программа просто не делает ничего
не имея кода программы и не обладая телепатией и ясновидением, сказать ничего не могу.
0
2 / 2 / 1
Регистрация: 08.02.2020
Сообщений: 215
19.02.2020, 01:59
То была какая-то ошибка - походу компилятор не находил файл. Когда я его ему показал, начал ругаться

А сама простейшая программа и содержимое файла есть в сообщении выше Вроде то же самое написано.

Добавлено через 3 часа 51 минуту
А если прямо так записать в основную программу, чтобы проще было менять, должно работать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#import "C:\Program Files\Microsoft Office\Office15\MSWORD.OLB" \
    rename("ExitWindows","_ExitWindows") \
    rename("FieldsPtr","WordFieldsPtr") \
    rename_namespace("WinWord")
using namespace WinWord;
 
int main()
{
    using namespace Word;
    _ApplicationPtr word(L"Word.Application");
    word->Visible = true;
    word->Activate();
 
    return 0;
}
Добавлено через 4 часа 31 минуту
196 ошибок
0
2 / 2 / 1
Регистрация: 08.02.2020
Сообщений: 215
20.02.2020, 01:31
Попробовал по вот этой статье (https://www.technical-recipes.... xcel-in-c/) - ошибок вроде не выдает. Компилируется, запускается, и не делает ничего Выскакивает консолька с предложением нажать любую кнопку, Эксель не выскакивает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// ConsoleApplication9.cpp : Defines the entry point for the console application.
#include "stdafx.h"
 
#import "C:\\PROGRAM FILES\\COMMON FILES\\MICROSOFT SHARED\\OFFICE15\\MSO.DLL" \
    rename( "RGB", "MSORGB" )
using namespace Office;
 
#import "C:\\PROGRAM FILES\\COMMON FILES\\MICROSOFT SHARED\\VBA\\VBA6\\VBE6EXT.OLB"
using namespace VBIDE;
 
#import "C:\\PROGRAM FILES\\MICROSOFT OFFICE\\OFFICE15\\EXCEL.EXE" \
    rename( "DialogBox", "ExcelDialogBox" ) \
    rename( "RGB", "ExcelRGB" ) \
    rename( "CopyFile", "ExcelCopyFile" ) \
    rename( "ReplaceText", "ExcelReplaceText" ) \
    exclude( "IFont", "IPicture" ) no_dual_interfaces
using namespace Excel;
 
 
int main()
{
 
    HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    Excel::_ApplicationPtr pXL;
    pXL->Workbooks->Open(L"D:\\testOle.xls");
    pXL->Visible = true;
 
    return 0;
}
0
2 / 2 / 1
Регистрация: 08.02.2020
Сообщений: 215
29.02.2020, 11:27
Снова вернулся к этой программке, результат тот же - никакого. Может быть, кроме самого кода еще нужно какие-то настройки в ВижуалСтудии сделать?
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 6
14.05.2021, 02:26
Приветствую.

Попытался тоже подключиться к экселю из Visual Studio. Использую OFFICE 2016 и VS 2019.

Сейчас имею следующий код, который почему-то не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* Программа для работы с экселем
*  напрямую из с++
*/
 
#import "MSO.DLL" \
    rename("IAccessible", "IAccessibleXL")
using namespace Office;
 
#import "Vbe6ext.olb" \
    rename("Events", "EventsVB")
using namespace VBIDE;
 
#import "excel.exe" \
    rename("DialogBox", "DialogBoxXL") \
    rename("RGB", "RGBXL") \
    rename("DocumentProperties", "DocumentPropertiesXL")
using namespace Excel;
 
int main()
{
 
    HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    Excel::_ApplicationPtr pXL;
    pXL->Workbooks->Open(L"D:\\testOle.xls");
    pXL->Visible = true;
 
    return 0;
}
Собственно, почему я вообще считаю что он должен работать:
1. Все файлы из #import я поместил в папку с проектом и он успешно создал версии .tlh и .tli
(к сожалению не знаю как тут пользоваться спойлерами и картинками, так что вот ссылка https://prnt.sc/12w9od5)
2. Эти файлы не пустые и вполне себе читаемые:
(рандомный кусок кода из mso.tlh
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      virtual HRESULT __stdcall get_Parent (
        /*[out,retval]*/ IDispatch * * Parent ) = 0;
      virtual HRESULT __stdcall get_Extended (
        /*[out,retval]*/ BSTR * Extended ) = 0;
      virtual HRESULT __stdcall put_Extended (
        /*[in]*/ BSTR Extended ) = 0;
      virtual HRESULT __stdcall get_Id (
        /*[out,retval]*/ BSTR * Id ) = 0;
      virtual HRESULT __stdcall put_Id (
        /*[in]*/ BSTR Id ) = 0;
      virtual HRESULT __stdcall get_Language (
        /*[out,retval]*/ enum MsoScriptLanguage * Language ) = 0;
      virtual HRESULT __stdcall put_Language (
        /*[in]*/ enum MsoScriptLanguage Language ) = 0;
      virtual HRESULT __stdcall get_Location (
        /*[out,retval]*/ enum MsoScriptLocation * Location ) = 0;
      virtual HRESULT __stdcall raw_Delete ( ) = 0;
      virtual HRESULT __stdcall get_Shape (
        /*[out,retval]*/ IDispatch * * Object ) = 0;
      virtual HRESULT __stdcall get_ScriptText (
        /*[out,retval]*/ BSTR * Script ) = 0;
      virtual HRESULT __stdcall put_ScriptText (
        /*[in]*/ BSTR Script ) = 0;
3. Странное поведение IDE, а именно HRESULT в main из этих файлов смог определиться, но при этом висит ошибка, которая звучит как С1083 "Не удаётся открыть файл библиотека типов: MSO.DLL: No such file or directory,"
При этом красным подчёркивается единственная строчка с pXL->Visible = true; (примерно 25 строка кода)
4. Помимо этого имеется 500+ ошибок E0102 "нестандартное опережающее объявление перечисляемого типа", но выглядят эти ошибки так, что сами пропадут, как только будет решена основная из пункта 3.

Помогите, пожалуйста, разобраться в этом. Настройки VS стоят исходные, ничего не менял (разве что поменял кодировку с Юникода на многобайтовую, но что-то мне подсказывает, что не в этом проблема), установил буквально позавчера после сноса системы. В Visual Studio Installer постарался выбрать все пункты, которые могут быть связанны с MS Office, даже не относящиеся к с++

Добавлено через 10 минут
Последняя проблема была решена!
Всё что нужно было сделать - это дать абсолютное имя файла в #import.
Теперь новая ошибка
Звучит она так:
"Возникло необработанное исключение по адресу 0x00007FF9B225A839 в работа с экселем.exe: исключение Microsoft C++: _com_error по адресу памяти 0x000000BB1E0FF700."
(25 строка отказывалась компилироваться, так что я её удалил, а эта ошибка возникла в 24 строке)
0
0 / 0 / 0
Регистрация: 28.01.2019
Сообщений: 6
14.05.2021, 10:09
На всеобщее (надеюсь) счастье, наткнулся на решение этой проблемы на сайте Microsoft, вот ссылка:
https://docs.microsoft.com/en-... cel-from-c
Импорты не требуются, но, как я понимаю, требуется установленный на комп эксель.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
22.12.2023, 22:37
Цитата Сообщение от Том Ардер Посмотреть сообщение
#import "E:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\MSO9.DLL"
А если отсуствует такой файл по указанному пути то что делать? Есть ещё такой путь C:\Program Files (x86)\Microsoft Office\Office14 но там нету такой библиотеки. Офис у меня 10ый.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2023, 22:37
Помогаю со студенческими работами здесь

Иные способы установки Windows XP
Всех с праздником! Ребята подскажите какие еще существуют способы установки Windows Xp помимо установки через DvD-rom и флешку. Имеется...

Работа в Word через WBA в Excel
Нужна простенька программа, которая будет открывать документ word вставлять туда данные из excel и сохранять ворд-документ под новым...

Ole excel и word
Здравствуйте, проблема такая: при использование ole для word и excel при использование word и excel не закрывается excel(висит в диспетчера...

Работа с word через excel (передача строки)
Здравствуйте, возникла следующая проблемка, а точнее вопрос: Есть файл excel, который при определенном действии создает файл word. ...

Ошибка при открытии OLE Word из Excel
Всем доброго времени суток! Имеется тестовый код Sub Test2() Dim WDApp As Object Dim WDDoc, oWord, oDocument As Object ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru