Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 12.05.2017
Сообщений: 19

Как автоматизировать заполнение документа Word данными?

10.02.2018, 17:06. Показов 7450. Ответов 9
Метки нет (Все метки)

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

Подскажите пожалуйста как реализовать такую задумку?

В организации есть 4 офис-менеджера, т.е. каждый из них может подписывать документы.

Сотрудник отдела продаж, когда заключает договор с клиентом, должен распечатать договор с данными того офис-менеджера, которые на данный момент находится в офисе.

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


В VB и макросах практически не разбираюсь, но готов с вашей помощью оперативно обучиться.

Заранее спасибо за подсказки и советы!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2018, 17:06
Ответы с готовыми решениями:

Как автоматизировать заполнение документа Word нужными данными?
Здравствуйте. Подскажите пожалуйста как реализовать такую задумку? В организации есть 4 офис-менеджера, т.е. каждый из них может...

Заполнение документа Word несколько раз данными из другого документа
есть некий документ Word(test.docx). Нужно создать новый документ(test1.docx), и заполнить его несколько раз данными из первого документа....

Заполнение Word документа данными из строки DBGrid
Не знаю возможно ли это, но было бы очень здорово, если бы я смог это реализовать. В общем есть DBGrid с такими вот колонками :...

9
16 / 15 / 4
Регистрация: 07.11.2017
Сообщений: 48
10.02.2018, 17:45
Как то завалялся небольшой код, может разберешься. Перед этим подключи библиотеку Microsoft.Office.Interop.Word, добавь новый модуль и впиши следующий код. Придется очистить все что касается "Red"
VB.NET Скопировано
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Imports Word = Microsoft.Office.Interop.Word
Module ModuleMWord
    Dim Doc As Word.Document
    Dim App As Word.Application
 
    Private Sub WrTitle(ByVal Text As String)
        Dim Par As Word.Paragraph = Doc.Content.Paragraphs.Add(Doc.Bookmarks.Item("\endofdoc").Range)
        Par.Range.Text = Text
        Par.Range.Font.Size = 14
        Par.Range.Font.Name = "Times New Roman"
        Par.Range.Font.Bold = True
        Par.Format.SpaceBefore = 0     'Интервал перед
        Par.Format.SpaceAfter = 0   'Интервал после
        Par.Format.Space1()
        Par.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
        Par.Range.InsertParagraphAfter()
    End Sub
 
    Private Sub WrText(ByVal Text As String, Optional ByVal Bold As Boolean = False)
        Dim Par As Word.Paragraph = Doc.Content.Paragraphs.Add(Doc.Bookmarks.Item("\endofdoc").Range)
        Par.Range.Text = Text
        Par.Range.Font.Bold = Bold
        Par.Range.Font.Name = "Times New Roman"
        Par.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft
        Par.Range.InsertParagraphAfter()
    End Sub
 
    Private Sub WrFText(ByVal Form As String, Optional ByVal Text As String = "")
        Dim Par As Word.Paragraph = Doc.Content.Paragraphs.Add(Doc.Bookmarks.Item("\endofdoc").Range)
        Dim Rn As Word.Range
        Par.Range.Text = Form & Text
        Par.Range.Font.Bold = False
        Par.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter
        Rn = Par.Range
        Rn.SetRange(Par.Range.Start, Par.Range.Start + Len(Form))
        Doc.OMaths.Add(Rn).OMaths.BuildUp()
        Par.Range.InsertParagraphAfter()
    End Sub
 
    Private Sub WrSearchForm(ByVal Text As String)
        Dim Rng As Word.Range = Doc.Range
        With Rng.Find
            .ClearFormatting()
            .Text = Text
            .Forward = True
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
            If .Execute Then
                Doc.Range(Rng.Start, Rng.End)
                Doc.OMaths.Add(Rng).OMaths.BuildUp()
            End If
        End With
    End Sub
 
    Public Sub WriteWordDemo()
        App = New Word.Application
        App.Visible = True
        Doc = App.Documents.Add
        Doc.PageSetup.LeftMargin = 15
        Doc.PageSetup.RightMargin = 15
        Doc.PageSetup.TopMargin = 15
        Doc.PageSetup.BottomMargin = 15
 
        WrTitle("1 ВЫБОР ЭЛЕКТРОДВИГАТЕЛЯ И КИНЕМАТИЧЕСКИЙ РАСЧЕТ")
 
        WrFText("F_t=" & Red.FL, " Нм; V=" & Red.VL & " м/с; D_б=" & Red.DB & " м; U= " & Red.PC)
        WrSearchForm("D_б=" & Red.DB)
 
        WrText("По табл. 1.1 [7] принял: КПД пары цилиндрических зубчатых колёс η_1=" & Red.KPD1 & _
            "; коэффициент, учитывающий потери пары подшипников качения η_2=" & Red.KPD2 & _
            "; КПД муфты η_3=" & Red.KPD3)
 
        WrSearchForm("η_1=" & Red.KPD1)
        WrSearchForm("η_2=" & Red.KPD2)
        WrSearchForm("η_3=" & Red.KPD3)
 
        WrText("Общий КПД привода равен:")
        WrFText("η_общ=η_1×η_2^3×η_3^2", "    ()")
        WrFText("η_общ=" & Red.KPD1 & "×" & Red.KPD2 & "^3×" & Red.KPD3 & "^2=" & Red.KPDX)
 
        WrText("Мощность на валу барабана:")
        WrFText("P_б=F_T×V", "    ()")
        WrFText("P_б=" & Red.FL & "×" & Red.VL & "=" & Red.PB, " кВт")
 
        WrText("Требуемая мощность электродвигателя:")
        WrFText("P_тр=P_б/η_общ", "    ()")
        WrFText("P_тр=" & Red.PB & "/" & Red.KPDX & "=" & Red.PT, " кВт")
 
        WrText("Угловая скорость вала барабана:")
        WrFText("ω_б=2V/D_б", "    ()")
        WrFText("ω_б=2×" & Red.VL & "/" & Red.DB & "=" & Red.UV, " рад/с")
 
        WrText("Частота вращения вала барабана:")
        WrFText("n_б=(30ω_б)/π", "    ()")
        WrFText("n_б=(30×" & Red.UV & ")/" & Math.Round(Math.PI, 2) & "=" & Red.NB, " об/мин")
 
        WrText("Определяем требуемую частоту вращения вала электродвигателя:")
        WrFText("n_тр=n_б×U", "    ()")
        WrFText("n_тр=" & Red.NB & "×" & Red.PC & "=" & Red.NT, " об/мин")
 
        WrText("По табл. П.1 [] принимаем электродвигатель трехфазный, короткозамкнутый, серии 4А, закрытый, обдуваемый, " & _
               "с синхронной частотой вращения n_c= " & Red.Motor.RPMS & " об/мин " & Red.Motor.Name & ", с параметрами P_дв= " & _
               Red.Motor.Power & " кВт, S= " & Red.Motor.Slip & "%.")
        WrSearchForm("n_c=")
        WrSearchForm("P_дв=")
 
        WrText("Определяем номинальную частоту вращения вала электродвигателя:")
        WrFText("n_ном=n_c×(1-S)", "    ()")
        WrFText("n_ном=" & Red.Motor.RPMS & "×(1-" & Red.Motor.Slip / 100 & ")= " & Red.Motor.RPMA, " об/мин")
 
        WrText("Кинематический расчет")
        WrText("Ведущий вал:", True)
        WrFText("P_1=P_дв=" & Red.Motor.Power, " кВт")
        WrFText("n_1=n_ном=" & Red.Motor.RPMA, " oб/мин")
        WrFText("ω_1=(πn_1)/30=(3,14×" & Red.Motor.RPMA & ")/30=" & Red.UV1, " рад/с")
        WrFText("T_1=P_1/ω_1", "    ()")
        WrFText("T_1=" & Red.Motor.Power & "/" & Red.UV1 & "=" & Red.T1, " Нм")
 
        WrText("Ведомый вал:", True)
        WrFText("P_2=P_1×η_2^2×η_1=" & Red.Motor.Power & "×" & Red.KPD2 & "^2×" & Red.KPD1 & "=" & Red.P2, " кВт")
        WrFText("n_2=n_1/U=" & Red.Motor.RPMA & "/" & Red.PC & "=" & Red.N2, " об/мин")
        WrFText("ω_2=ω_1/U=" & Red.UV1 & "/" & Red.PC & "=" & Red.UV2, " рад/с")
        WrFText("T_2=P_2/ω_2 =" & Red.P2 & "/" & Red.UV2 & "=" & Red.T2, " Нм")
 
        WrText("Расхождение с заданным значением угловой скорости:")
        WrFText("∆=(n_2-n_1)/n_1 ×100%=(" & Math.Max(Red.N2, Red.NB) & "-" & Math.Min(Red.N2, Red.NB) & ")/" & _
                Math.Min(Red.N2, Red.NB), "×100%=" & Red.Delta & "<5%    ()")
    End Sub
End Module
на форму добавь кнопку и впиши следующее:
VB.NET Скопировано
1
WriteWordDemo()
Можно по другому: через закладки. Если есть готовый шаблон, и в некоторых местах нужно добавить определенный текст, вставляешь в то место закладку, допустим с именем "X000" то записать в это место можно:
VB.NET Скопировано
1
Doc.Bookmarks.Item("X000").Range.Text = "Привет!"
1
1 / 1 / 0
Регистрация: 12.05.2017
Сообщений: 19
12.02.2018, 23:47  [ТС]
Скажите пожалуйста, а файл с макросами и формой не может быть сохранен со стандартным расширением?
только .docm ??
0
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
13.02.2018, 14:05
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
 Public DocWord1 As Microsoft.Office.Interop.Word.Document 
Sub mrepl(n1z, n2z)
        DocWord1.Application.Selection.WholeStory()
        DocWord1.Application.Selection.Find.ClearFormatting()
        DocWord1.Application.Selection.Find.Replacement.ClearFormatting()
        Try
            With DocWord1.Application.Selection.Find
                .Text = n1z
                .Replacement.Text = "" & n2z
                DocWord1.Application.Selection.Find.Execute(Replace:=Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll)
            End With
        Catch ex As Exception
            With DocWord1.Application.Selection.Find
                .Text = n1z
                .Replacement.Text = " "
                DocWord1.Application.Selection.Find.Execute(Replace:=Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll)
            End With
 
        End Try
 
        Exit Sub
 
    End Sub
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
AppWord = New Microsoft.Office.Interop.Word.Application
DocWord1 = AppWord.Documents.Open("Путь до твоего файла")
 
mrepl("[Какое-то поле]", "Какое-от значение")
DocWord1.SaveAs2("Путь где сохранить обработанный файл")
DocWord1.Close(False)
AppWord.Quit()
AppWord = Nothing
  End Sub
Делаешь шаблон договора и расставляешь куда нужно поля в [Поле].
0
1 / 1 / 0
Регистрация: 12.05.2017
Сообщений: 19
13.02.2018, 17:41  [ТС]
Ох, как же тяжело смотреть на эти строки....

Помогите пожалуйста разобраться с такими вопросами:

1) эти 2 примера кода - должны быть в одном фале?

2) Когда я вставляю код, у меня часть его красным выделяется - надо какую-то библиотеку подключить?


3) Хотел такую форму внедрить, чтобы выскакивала при открытии файла


4) У меня файл Word скачивает сотрудник из CRM-системы, она в документах проставляет №договора и пр.
Соответственно, после этого сотрудник открывает файл и должно появиться окно с выбором офис-менеджера, реквизитами которого надо будет дозаполнить документы.
Такой файл с макросами и формой может быть сохранен в формате .docx ? Т.к. Word мне постоянно предлагает сохраниться в .docm
0
16 / 15 / 4
Регистрация: 07.11.2017
Сообщений: 48
13.02.2018, 19:57
Лучший ответ Сообщение было отмечено alex_avd как решение

Решение

Это код для Visual Studio, не для макросов Word. С макросами в ветку VBA. У вас Студия есть?
1
1 / 1 / 0
Регистрация: 12.05.2017
Сообщений: 19
13.02.2018, 20:25  [ТС]
Цитата Сообщение от Mickey6X6 Посмотреть сообщение
С макросами в ветку VBA. У вас Студия есть?
Да, видимо мне туда, спасибо.
Студии нет...
0
16 / 15 / 4
Регистрация: 07.11.2017
Сообщений: 48
13.02.2018, 23:25
Лучший ответ Сообщение было отмечено alex_avd как решение

Решение

Набросал проектик под вашу задачу. Что бы запустить разорхивируйте в папку, пройдите Word_X\Bin\Debug запустите Word_X.exe В Data.xml хранятся пользователи и ваши закладки. Что бы добавить пользователя нажмите на кнопку + и заполните поля. Обратите внимание на номера, пригодятся для заполнения закладок. Открываем Dogovor.doc Что бы добавить закладку в шаблон Word документа выполните действия на скриншоте. Сохраняем, закрываем. Потом внести в базу(кнопка с ручкой) Откроется форма с DataGridView с двумя столбиками. В первом столбике нужно ввести название закладки(точно такое как в word документе) во второй столбик вставить цифру(соответствующую номеру поля при заполнении пользователя). Сохраняем. А теперь нажимаем на кнопку "Открыть договор" и радуемся выполнению программы)
Миниатюры
Как автоматизировать заполнение документа Word данными?  
Вложения
Тип файла: rar Word_X.rar (110.4 Кб, 117 просмотров)
3
1 / 1 / 0
Регистрация: 12.05.2017
Сообщений: 19
15.02.2018, 21:24  [ТС]
Цитата Сообщение от Mickey6X6 Посмотреть сообщение
радуемся выполнению программы
Огромное спасибо, действительно неплохое решение.
Спасибо, что потратили на меня ваше время!
К сожалению, нашим сотрудникам этот вариант будет слишком непростым.
Буду пытать счастья в нужной ветке.
Еще раз - от души благодарю!!!
1
16 / 15 / 4
Регистрация: 07.11.2017
Сообщений: 48
15.02.2018, 21:52
Можно просто ваш договор положить в папку с исполняемым файлом, переименовать на Dogovor.docx, и всего лишь 1 раз добавить пользователей, и порасставить закладки. Все сохраняется(не нужно каждый раз калдовать). Все сводится к 2 телодвижениям: выбор специалиста, и клик по кнопке открытия документа. Единственное что некоторые поля могут не подходить для конкретно вашего случая. Но и это решаемо.
Всегда пожалуйста! Удачи в освоении макросов!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2018, 21:52
Помогаю со студенческими работами здесь

Заполнение книги Excel данными из документа Word
Добрый день. Пролистал около десятка тем на этом форуме и еще на нескольких, так и не смог найти более менее полного решения для свой...

Заполнение сложного документа Word данными Excel
Поискал в интернете и вроде бы нашел простенький макрос для переноса данных из каждой ячейки Excel в места закладок Word. Как перенести...

Заполнение полей в документе word данными из документа excel
Имеется типовой документ word, назовем его АКТ, в котором вся информация остается неизменной, за исключением нескольких полей (см. рисунок...

Заполнение Таблицы базы данных данными из документа Word
Всем привет. Начал делать программу тестер. Дали мне данные тестов(вопросы и варианты ответов) все это хранится в word'овском документе....

Автоматизировать процесс заполнения документа в Word
Доброго времени суток уважаемые форумчане! Возникла идея, создать программу по работе с бланками в MS Office для облегчения себе жизни. В...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер