powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Произвести слияние Word с таблицей Excel через COM-объект
5 сообщений из 5, страница 1 из 1
Произвести слияние Word с таблицей Excel через COM-объект
    #39905235
Flying_cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею обработку на 1С. Из-под неё, посредством COM-объектов, хочу выполнить слияние документа Word c полями и Excel-таблицы, где значения этих полей лежат. Обычное такое слияние, полезная такая штука.

Имею такой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	Cn="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source="+NameForSource+";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";
			| Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37;Jet ";
	MSWord.ActiveDocument.MailMerge.MainDocumentType=wdFormLetters;
	MSWord.ActiveDocument.MailMerge.OpenDataSource(NameForSource,
		wdOpenFormatAuto,				// Format
		False,							// нужно ли диалоговое окно (Истина)
		True,							// Только для чтения (истина)
		Истина,							// LinkToSource выполнить запрос, заданный параметром Connection и SQLStatement при каждом открытии основного документа.
		False,							// Добавлять фацйл в список недавно открытых (истина)
		"" ,							// Пароль для источника
		"" ,							// Пароль для шаблона
		False,                           // Открывать повторно (ложь)
		"",								// Пароль, используемый для сохранения изменений в документе.
		"",								// Пароль, используемый для сохранения изменений в шаблоне.
		Cn,                             // Connection string
		"SELECT * FROM `Source$`",       // SQLStatement
		"",                             // SQLStatement1
		True,                               // Монопольный доступ (Истина)
		wdMergeSubTypeAccess			//  
	);
			
Это для подключения источника данных. "Собезьяничал" запись макроса. И тут столкнулся с проблемами.
1. Постоянно вылетает запрос про лист таблицы (хотя не должен, все данные вроде как есть).
2. В запросе висит совершенно "левая" таблица с совершенно другим именем, чем то, которое передано в качестве аргумента.
В чём дело, кто-нибудь может подсказать?
...
Рейтинг: 0 / 0
Произвести слияние Word с таблицей Excel через COM-объект
    #39905282
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying_cat
Код: plaintext
wdFormLetters
Эта переменная объявлена? А эта wdMergeSubTypeAccess? И эта wdOpenFormatAuto?
Если подключение к Word идет через CreateObject и библиотека Word не подключена в библиотеках, то 1С ничего не знает про них, как я полагаю. И их надо заменить их числовыми значениями. Чуть подробнее: https://www.excel-vba.ru/chto-umeet-excel/kak-iz-excel-obratitsya-k-drugomu-prilozheniyu/
Там про Excel, но суть не меняется. К тому же я не эксперт в 1С, здесь ветка вообще по офису...
...
Рейтинг: 0 / 0
Произвести слияние Word с таблицей Excel через COM-объект
    #39905403
Flying_cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist
Flying_cat
Код: plaintext
wdFormLetters
Эта переменная объявлена? А эта wdMergeSubTypeAccess? И эта wdOpenFormatAuto?

Само собой, переменные описаны и значения соответствуют тем, которые им присвоены в VBA.
The_Prist
К тому же я не эксперт в 1С, здесь ветка вообще по офису...
Эксперность в 1С не требуется. С таким же успехом это мог бы быть как Delphi, так и C++. Работа всё равно идёт через COM-объект.
Вопрос при этом остаётся прежним. Почему Word не соединяется с предложенным файлом, хотя код в прямую взят из записи макроса, который таки выполняет нужное мне соединение.
...
Рейтинг: 0 / 0
Произвести слияние Word с таблицей Excel через COM-объект
    #39905632
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying_cat
Эксперность в 1С не требуется
ну не скажите...COM объект, вызванный из разных приложений по разному может себя вести при передачи ему аргументов не так, как он ожидает. А тут уж полным ходом будет виновата платформа вызывающая. Вот, например, почему у Вас то ИСТИНА написано, то True? Уверены, что надо передавать именно True, если тип Boolean в 1С это ИСТИНА и ЛОЖЬ, а не True и False?
автор"SELECT * FROM `Source$`"что здесь есть Source? Это переменная или реально так источник назван? Может так попробовать указать:
Код: vbnet
1.
"SELECT * FROM [Source$]"


?
...
Рейтинг: 0 / 0
Произвести слияние Word с таблицей Excel через COM-объект
    #39905711
Flying_cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,
The_Prist
Flying_cat
Эксперность в 1С не требуется
ну не скажите...COM объект, вызванный из разных приложений по разному может себя вести при передачи ему аргументов не так, как он ожидает. А тут уж полным ходом будет виновата платформа вызывающая. Вот, например, почему у Вас то ИСТИНА написано, то True? Уверены, что надо передавать именно True, если тип Boolean в 1С это ИСТИНА и ЛОЖЬ, а не True и False?
Вы не поверите, но можно и так и так (в 1С). В прочем, это поправимо и уже пройденный этап.
The_Prist
автор"SELECT * FROM `Source$`"
что здесь есть Source? Это переменная или реально так источник назван? Может так попробовать указать:
Код: vbnet
1.
"SELECT * FROM [Source$]"


?Source - это имя листа Excel таблицы.

Вы будете смеяться, но ЭТО заработало (возможно, скобки не главное, но без них это точно не хотело работать)
Перед этим формируется временный Excel-файл из данных БД
Код: vbnet
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.
Коннект="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="""+ИмяДляИсточника+""";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1""";
	MSWord.ActiveDocument.MailMerge.MainDocumentType=wdFormLetters;
	MSWord.ActiveDocument.MailMerge.OpenDataSource(ИмяДляИсточника,
		wdOpenFormatAuto,				// Format
		Ложь,							// нужно ли диалоговое окно (Истина)
		Истина,							// Только для чтения (истина)
		Истина,							// LinkToSource выполнить запрос, заданный параметром Connection и SQLStatement при каждом открытии основного документа.
		Ложь,							// Добавлять файл в список недавно открытых (истина)
		"" ,							// Пароль для источника
		"" ,							// Пароль для шаблона
		Ложь,                           // Открывать повторно (ложь)
		"",								// Пароль, используемый для сохранения изменений в документе.
		"",								// Пароль, используемый для сохранения изменений в шаблоне.
		Коннект,                        // Connection string
		"SELECT * FROM [Source$]",      // SQLStatement
		"",                             // SQLStatement1
		,                               // Монопольный доступ (Истина)
		wdMergeSubTypeAccess			//  
	);
			
	// прописываем поля на место закладок		
	Для каждого Поле Из СписокПолей Цикл		
		MSWord.Selection.GoTo(wdGoToBookmark,,,Поле);
		MSWord.ActiveDocument.MailMerge.Fields.Add(MSWord.Selection.Range,Поле);
	КонецЦикла;
	
	MSWord.ActiveDocument.MailMerge.Destination = wdSendToNewDocument;
	MSWord.ActiveDocument.MailMerge.SuppressBlankLines = Истина;
	MSWord.ActiveDocument.MailMerge.DataSource.FirstRecord = 1;//wdDefaultFirstRecord;
	MSWord.ActiveDocument.MailMerge.DataSource.LastRecord = ТаблицаДанных.Количество();	//wdDefaultLastRecord;
	MSWord.ActiveDocument.MailMerge.Execute(Ложь);
	// закроем шаблон
	MSWord.Documents(Имечко).Activate();
	MSWord.ActiveDocument.Close(0);		//wdDoNotSaveChanges 
	MSWord.Visible=1;
	// удалим Excel-файл
	УдалитьФайлы(ИмяДляИсточника);

Большое спасибо!!!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Произвести слияние Word с таблицей Excel через COM-объект
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]