Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49

Сделать отчёт в Word посредством позднего связывания

04.04.2018, 11:27. Показов 2437. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Стоит задача сделать отчёт в WORD посредством позднего связывания.
В отчёта присутствует как текст, так и таблицы.
Поиск дал очень мало результата, мало кто использует позднее связывание.
Пока есть вот такой код

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
        
        FWord=Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
        object WordDoc = FWord.GetType().InvokeMember("Documents", System.Reflection.BindingFlags.GetProperty, null, FWord, null);
        FWord.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, FWord, new Object[] { true });
        object Doc = WordDoc.GetType().InvokeMember("ADD", System.Reflection.BindingFlags.InvokeMethod, null, WordDoc, null);
//всё что выше создаёт документ WORD        
 
        object Select = FWord.GetType().InvokeMember("Selection", System.Reflection.BindingFlags.GetProperty, null, FWord, null);
// ставим курсом
         object Tables = Select.GetType().InvokeMember("Tables", System.Reflection.BindingFlags.GetProperty, null, rg2, new object[] { });
        object Table1 = Tables.GetType().InvokeMember("ADD", System.Reflection.BindingFlags.InvokeMethod, null, Tables, new object[] { rg2, 1, 1, 1, 1 });
//создаём таблицу размерность 1,1
        object TW = Table1.GetType().InvokeMember("Borders", System.Reflection.BindingFlags.GetProperty, null, Table1, null);
        TW.GetType().InvokeMember("OutSideLineStyle", System.Reflection.BindingFlags.SetProperty, null, TW, new object[] { 1 });  //внешние границы таблицы
        TW.GetType().InvokeMember("OutSideColor", System.Reflection.BindingFlags.SetProperty, null, TW, new object[] { 0 });      //цвет внешних границ таблицы
        object TblCell = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 1, 1 });
//курсом на поле 1,1
        TblCell.GetType().InvokeMember("VerticalAlignment", System.Reflection.BindingFlags.SetProperty, null, TblCell, new object[] { 1 });
        TblCell.GetType().InvokeMember("Width", System.Reflection.BindingFlags.SetProperty, null, TblCell, new object[] { 12 });
        TblCell.GetType().InvokeMember("Height", System.Reflection.BindingFlags.SetProperty, null, TblCell, new object[] { 15 });
        rg2.GetType().InvokeMember("Text", System.Reflection.BindingFlags.SetProperty, null, rg2, new object[] { "0358875" });
//указали ширину, высоту и ввели текст в поле(ячейку)     
 
//вот далее зашёл в тупик. Нужно вставить текст перед таблицей   
       Select.GetType().InvokeMember("InsertAfter", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[1] { "ТЕХНИЧЕСКИЙ ПАСПОРТ" });
//но текст вставляется в ячейку где фокус и перевести фокус за таблицу ни как не получается.
Попытка использовать макросы провалилась. В макросе можно создать таблицу, но нельзя таблицу перемещать
Буду благодарен за попытку помочь и разъяснения моих ошибок.
В EXCEL всё проще, а вот WORD как-то тяжело

Пробовал ввести с начало текст и потом вставить таблицу, но результат такой что весь текст попадает в ячейку таблицы или таблица создаётся на следующей строке и её нельзя переместить в другое место

Добавлено через 2 часа 53 минуты
вообщем решил данный вопрос вот так

C#
1
2
3
        object Rows = Table1.GetType().InvokeMember("Rows", System.Reflection.BindingFlags.GetProperty, null, Table1, new object[0]);
        Rows.GetType().InvokeMember("Alignment", System.Reflection.BindingFlags.SetProperty, null, Rows, new object[] { 2 });
        Rows.GetType().InvokeMember("WrapAroundText", System.Reflection.BindingFlags.SetProperty, null, Rows, new object[] { true });
резльтат тот который и планировался
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2018, 11:27
Ответы с готовыми решениями:

GetObject отражает особенности позднего связывания
Запуск кода из Excel. На долю секунды появляется окно Access, как можно сделать, чтобы оно не появлялось? Set dWorkspace =...

Как в Excel изменить ReferenceStyle на R1C1 с учетом позднего связывания?
Доброго времени суток! Не подскажете, как в Excel изменить ReferenceStyle на R1C1 с учетом позднего связывания? Добавлено через...

как в VC++ создать ActiveX и использовать его методом позднего связывания?
Уважаемые знатоки! Подскажите, пожалуйста, как в VC++ создать ActiveX и использовать его методом позднего связывания? То есть, подобие...

14
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
04.04.2018, 11:37
andr534, конечно мало кто использует такой подход потому что код с Reflection тяжело писать и еще тяжелее поддерживать. Лучше использовать dynamic.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.04.2018, 11:38
Цитата Сообщение от andr534 Посмотреть сообщение
мало кто использует позднее связывание
Использование dynamic значительно упростит позднее связывание. Код ничем не будет отличаться от раннего связывания, кроме типов переменных
Я делал так: добавлял нужные библиотеки, писал с ранним связыванием. Потом удалял библиотеки и там, где были ошибки по типу, ставил тип dynamic
2
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
06.04.2018, 15:08  [ТС]
упёрся в следующую проблему по объединению сток или столбцов

выделяю в таблице ячейку 2,1 и 2,2 в таблице 3Х4
C#
1
2
3
4
        object  TblCell = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 2, 1 });
        object TblCell1 = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 2, 2 });
 
        TblCells.GetType().InvokeMember("Merge", System.Reflection.BindingFlags.InvokeMethod, null, TblCells, null);
а вот после выделения как-то всё непонятно
Кто в курсе, будьте добры, направьте в нужном направлении
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
09.04.2018, 11:37  [ТС]
в общем решил проблему от обратного, не объединением, а удалением

C#
1
2
3
4
5
6
7
object TblCell1 = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 2, 2 });
 
Table1.GetType().InvokeMember("Delete", System.Reflection.BindingFlags.InvokeMethod, null, TblCell1 , null);
 
TblCell1 = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 2, 1 });
 
TblCell1.GetType().InvokeMember("Width", System.Reflection.BindingFlags.InvokeMethod, null, TblCell1, new object[] { 400 });
-становлюсь на колонку в строке 2 колонка 2
- удаляю колонку
- становлюсь на колонку в сроке 2 колонка 1
- увеличиваю ширину колонки до границ таблицы

Если кто найдёт другие споробы через объединение, пишите. Буду раз узнать новое
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
11.04.2018, 15:13  [ТС]
решил данную задачу более корректным способом. Исходные данные: Таблица 7 строк и 4 колонки
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        TblCell = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 6, 1 });
//выделяем строку 6 колонку 1
        object TblCell1 = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 7, 1 });
//выделяем строку 7 колонку 1
        object Cells = TblCell1.GetType().InvokeMember("Merge", System.Reflection.BindingFlags.InvokeMethod, null, TblCell1, new object[] { TblCell});
//делаем объединение в строке 6 и 7 по колонке 1
 
        TblCell = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 6, 2 });
//выделяем строку 6 колонку 2
        TblCell1 = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 7, 2 });
//выделяем строку 7 колонку 2
        Cells = TblCell1.GetType().InvokeMember("Merge", System.Reflection.BindingFlags.InvokeMethod, null, TblCell1, new object[] { TblCell });
//делаем объединение строк 6 и 7  по колонке 2
 
        TblCell = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 7, 3 });
//выделяем строку 7 колонку 3
        TblCell1 = Table1.GetType().InvokeMember("Cell", System.Reflection.BindingFlags.InvokeMethod, null, Table1, new object[] { 7, 4 });
//выделяем строку 7 колонку 4
        Cells = TblCell1.GetType().InvokeMember("Merge", System.Reflection.BindingFlags.InvokeMethod, null, TblCell1, new object[] { TblCell });
//объединяем колонки 3 и 4 в строке 7
Всем удачи
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
11.04.2018, 20:15
Цитата Сообщение от andr534 Посмотреть сообщение
Всем удачи
Удачи тому кто это будет поддерживать. Почему ты проигнорировал советы использовать dynamic?
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
12.04.2018, 10:12  [ТС]
кто хочет, тот разберётся. А кто не хочет, тому бесстолку что-либо объяснять
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
12.04.2018, 15:06
Цитата Сообщение от andr534 Посмотреть сообщение
кто хочет, тот разберётся. А кто не хочет, тому бесстолку что-либо объяснять
Звучит как идеальная отмазка для написания говно-кода. Кому надо тот разберется, ага. Проще будет выкинуть и написать заново.
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
12.04.2018, 15:10  [ТС]
расскажите пожалуйста как пользоваться dynamic?
В примерах. Я понятия не имею об этом.
Позднее связывание нужно для того чтобы избежать зависимости от версии OFFICE.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
12.04.2018, 15:26
andr534, подробные примеры есть в сети. Я покажу самый простой пример.
C#
1
2
3
dynamic wordApp = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
wordApp.Visible = true;
wordApp.Quit();
Хороший подход к написанию такого кода дал ViterAlex выше:
Цитата Сообщение от ViterAlex Посмотреть сообщение
Я делал так: добавлял нужные библиотеки, писал с ранним связыванием. Потом удалял библиотеки и там, где были ошибки по типу, ставил тип dynamic
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
12.04.2018, 15:29  [ТС]
Mucha grasias! Попробую применить в этом варианте.
Хотя в нашей конторе пиши хоть как, никто не будет разбираться в чужом коде((
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18267 / 14190 / 5368
Регистрация: 17.03.2014
Сообщений: 28,879
Записей в блоге: 1
12.04.2018, 15:37
Цитата Сообщение от andr534 Посмотреть сообщение
Хотя в нашей конторе пиши хоть как, никто не будет разбираться в чужом коде((
Но ведь самому же приятнее писать красивый код?
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
12.04.2018, 17:24  [ТС]
ну это да, эстетику никто не отменял

Добавлено через 1 час 33 минуты
есть ли готовое решение вопроса с подстрочным текстом, это когда под строкой пояснение или уточнение.
Пока ни как не удаётся найти простое решение.
Можно через таблицу нарисовав верхнюю линию и в ячейку текст, а можно строка подчёркивания со свойством подстрока и ниже текст и всё это увязать с межстрочным интервалом.
Есть ещё какие варианты?
0
-8 / 1 / 1
Регистрация: 27.04.2016
Сообщений: 49
17.04.2018, 10:05  [ТС]
решил вопрос с подстрочным текстом

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
        
//переход на новую строку
Paragraph = Select.GetType().InvokeMember("TypeParagraph", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[0]);
//установка шрифта
        Fonts = Select.GetType().InvokeMember("Font", System.Reflection.BindingFlags.GetProperty, null, Select, null);
        Fonts.GetType().InvokeMember("Size", System.Reflection.BindingFlags.SetProperty, null, Fonts, new object[1] { (float)10.0 });
        Fonts.GetType().InvokeMember("Bold", System.Reflection.BindingFlags.SetProperty, null, Fonts, new object[1] { false });
 //текст       
Select.GetType().InvokeMember("TypeText", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[] { "Начальник       " });
 
//форматируем строку для задания строки с подстрочным текста
        ParagraphFormat = Select.GetType().InvokeMember("ParagraphFormat", System.Reflection.BindingFlags.GetProperty, null, Select, null);
        ParagraphFormat.GetType().InvokeMember("LineSpacing", System.Reflection.BindingFlags.SetProperty, null, ParagraphFormat, new object[] { 10 });
        ParagraphFormat.GetType().InvokeMember("SpaceAfter", System.Reflection.BindingFlags.SetProperty, null, ParagraphFormat, new object[] { 0 });
//текст
        Select.GetType().InvokeMember("TypeText", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[] { "____________________" });
 
        Fonts = Select.GetType().InvokeMember("Font", System.Reflection.BindingFlags.GetProperty, null, Select, null);
        Fonts.GetType().InvokeMember("Size", System.Reflection.BindingFlags.SetProperty, null, Fonts, new object[1] { (float)10.0 });
        Fonts.GetType().InvokeMember("Bold", System.Reflection.BindingFlags.SetProperty, null, Fonts, new object[1] { false });
        Select.GetType().InvokeMember("TypeText", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[] { "             Приёмщик завода       " });
 
        ParagraphFormat = Select.GetType().InvokeMember("ParagraphFormat", System.Reflection.BindingFlags.GetProperty, null, Select, null);
        ParagraphFormat.GetType().InvokeMember("LineSpacing", System.Reflection.BindingFlags.SetProperty, null, ParagraphFormat, new object[] { 10 });
        ParagraphFormat.GetType().InvokeMember("SpaceAfter", System.Reflection.BindingFlags.SetProperty, null, ParagraphFormat, new object[] { 0 });
        Select.GetType().InvokeMember("TypeText", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[] { "____________________" });
 
        Fonts = Select.GetType().InvokeMember("Font", System.Reflection.BindingFlags.GetProperty, null, Select, null);
        Fonts.GetType().InvokeMember("Size", System.Reflection.BindingFlags.SetProperty, null, Fonts, new object[1] { (float)6.0 });
        Fonts.GetType().InvokeMember("Bold", System.Reflection.BindingFlags.SetProperty, null, Fonts, new object[1] { false });
        Paragraph = Select.GetType().InvokeMember("TypeParagraph", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[0]);
 
        Select.GetType().InvokeMember("TypeText", System.Reflection.BindingFlags.InvokeMethod, null, Select, new object[] { "                                                                          (подпись)                                                                                                                                          (подпись)" });
должно получиться вот такое
Миниатюры
Сделать отчёт в Word посредством позднего связывания  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2018, 10:05
Помогаю со студенческими работами здесь

Как "наплевать" на механизм позднего связывания и вызвать любую виртуальную функцию?
Есть базовый класс А с виртуальной функцией f1, у него есть несколько потомков. Как "наплевать" на механизм позднего связывания и...

как сделать чтобы открывался не отчет, а word
есть база данных. как сделать так чтобы когда вводишь в форме не открывался отчет а открывался word чтобы можно было печатать документ??

Нужно сделать отчет таблицей, чтобы потом открыть в Word, соответственно, тоже таблицей. Как это сделать?
В аксессе делаю отчет. Нужно сделать его таблицей, чтобы потом открыть в ворде, соответственно, тоже таблицей. Как это сделать?

Как открыть документ Word с использованием полного связывания?
Здравствуйте. Пытаюсь открыть word документ Dim objWord As Object Sub asd() Set objWord =...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru