Что нового

[Элементы GUI] Заполнение формы документа с форматированием из GUI

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Здравствуйте.
Помогите сделать выгрузку в файл *.doc данных из формы GUI.

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\Icons\16.ico
#AutoIt3Wrapper_Outfile=Заявление на ЭЦП.Exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=e:\Мои документы\autoit\koda_1.7.0.1\forms\заявление ЭЦП.kxf
$Form1_1 = GUICreate("Заявление", 585, 520, 534, 217)
$FIO = GUICtrlCreateInput("", 176, 112, 345, 21)
$doljnost = GUICtrlCreateInput("", 176, 144, 345, 21)
$Podrazd = GUICtrlCreateInput("", 176, 176, 345, 21)
$Organiz = GUICtrlCreateInput("", 176, 208, 345, 21)
$Nas_punkt = GUICtrlCreateInput("", 176, 240, 345, 21)
$SNILS = GUICtrlCreateInput("", 176, 272, 345, 21)
$Phone = GUICtrlCreateInput("", 176, 304, 345, 21)
$pas_serial = GUICtrlCreateInput("", 152, 336, 89, 21)
$pas_number = GUICtrlCreateInput("", 352, 336, 169, 21)
$data = GUICtrlCreateInput("", 152, 368, 89, 21)
$Organ = GUICtrlCreateInput("", 352, 368, 169, 21)
$Button1 = GUICtrlCreateButton("КОПИРОВАТЬ", 120, 408, 305, 33, 0)
$Button2 = GUICtrlCreateButton("ВЫХОД", 120, 448, 305, 33, 0)
$Label1 = GUICtrlCreateLabel("Заявление на изготовление ключа проверки ЭЦП", 64, 40, 452, 28)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetFont(-1, 3, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x808080)
$Label3 = GUICtrlCreateLabel("Дата выдачи", 64, 368, 70, 17)
$Label4 = GUICtrlCreateLabel("Кем выдан", 248, 368, 60, 17)
$Label5 = GUICtrlCreateLabel("Серия паспорт", 64, 336, 79, 17)
$Label6 = GUICtrlCreateLabel("Номер паспорт", 248, 336, 82, 17)
$Label7 = GUICtrlCreateLabel("Телефон", 64, 304, 49, 17)
$Label8 = GUICtrlCreateLabel("СНИЛС", 64, 272, 42, 17)
$Label9 = GUICtrlCreateLabel("Населенный пункт", 64, 240, 99, 17)
$Label10 = GUICtrlCreateLabel("Организация", 64, 208, 71, 17)
$Label11 = GUICtrlCreateLabel("Подразделение", 64, 176, 84, 17)
$Label12 = GUICtrlCreateLabel("Должность", 64, 144, 62, 17)
$Label13 = GUICtrlCreateLabel("ФИО", 64, 112, 31, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


$hFile = FileOpen("list_user_ISOD.txt", 1)

While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
$Text_all = (GUICtrlRead ($FIO,0) & @TAB & GUICtrlRead ($doljnost,0) & @TAB & GUICtrlRead ($Podrazd,0) & @TAB & GUICtrlRead ($Organiz,0) & @TAB & GUICtrlRead ($Nas_punkt,0) & @TAB & GUICtrlRead ($SNILS,0) & @TAB & GUICtrlRead ($Phone,0) & @TAB & GUICtrlRead ($pas_serial,0) & @TAB & GUICtrlRead ($pas_number,0) & @TAB & GUICtrlRead ($data,0) & @TAB & GUICtrlRead ($Organ,0))
;~ MsgBox(0, $Text_all,$Text_all)
FileWriteLine($hFile, $Text_all & @CRLF)
		Case $Button2
			Exit

	EndSwitch
WEnd


Сейчас сделано, что из формы создается txt файл, потом макросом в Microsoft Office заполняется форма документа.
Возможна ли реализация создания документа *.doc без дополнительных файлов и макросов?

Форма документа
https://yadi.sk/i/mFNyushuf5jYo

имя сохраняемого файла должно быть по значению переменной $FIO
 

Вложения

  • Заявление.doc
    54 КБ · Просмотры: 6

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
ZeVSalt [?]
Возможна ли реализация создания документа *.doc без дополнительных файлов и макросов?
Я когда-то делал нечто подобное. Создавал шаблон *.doc с переменными, которые потом заменял на значения и сохранял с нужным именем.
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\Icons\16.ico
#AutoIt3Wrapper_Outfile=Заявление на ЭЦП.Exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <Word.au3>

Global $sTemplate = @ScriptDir & '\template.doc', $sFile = @ScriptDir & '\test.doc'


#Region ### START Koda GUI section ### Form=e:\Мои документы\autoit\koda_1.7.0.1\forms\заявление ЭЦП.kxf
$Form1_1 = GUICreate("Form1", 585, 520, 534, 217)
$FIO = GUICtrlCreateInput("", 176, 112, 345, 21)
$doljnost = GUICtrlCreateInput("", 176, 144, 345, 21)
$Podrazd = GUICtrlCreateInput("", 176, 176, 345, 21)
$Organiz = GUICtrlCreateInput("", 176, 208, 345, 21)
$Nas_punkt = GUICtrlCreateInput("", 176, 240, 345, 21)
$SNILS = GUICtrlCreateInput("", 176, 272, 345, 21)
$Phone = GUICtrlCreateInput("", 176, 304, 345, 21)
$pas_serial = GUICtrlCreateInput("", 152, 336, 89, 21)
$pas_number = GUICtrlCreateInput("", 352, 336, 169, 21)
$data = GUICtrlCreateInput("", 152, 368, 89, 21)
$Organ = GUICtrlCreateInput("", 352, 368, 169, 21)
$Button1 = GUICtrlCreateButton("КОПИРОВАТЬ", 120, 408, 305, 33, 0)
$Button2 = GUICtrlCreateButton("ВЫХОД", 120, 448, 305, 33, 0)
$Label1 = GUICtrlCreateLabel("Заявление на изготовление ключа проверки ЭЦП", 64, 40, 452, 28)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetFont(-1, 3, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x808080)
$Label3 = GUICtrlCreateLabel("Дата выдачи", 64, 368, 70, 17)
$Label4 = GUICtrlCreateLabel("Кем выдан", 248, 368, 60, 17)
$Label5 = GUICtrlCreateLabel("Серия паспорт", 64, 336, 79, 17)
$Label6 = GUICtrlCreateLabel("Номер паспорт", 248, 336, 82, 17)
$Label7 = GUICtrlCreateLabel("Телефон", 64, 304, 49, 17)
$Label8 = GUICtrlCreateLabel("СНИЛС", 64, 272, 42, 17)
$Label9 = GUICtrlCreateLabel("Населенный пункт", 64, 240, 99, 17)
$Label10 = GUICtrlCreateLabel("Организация", 64, 208, 71, 17)
$Label11 = GUICtrlCreateLabel("Подразделение", 64, 176, 84, 17)
$Label12 = GUICtrlCreateLabel("Должность", 64, 144, 62, 17)
$Label13 = GUICtrlCreateLabel("ФИО", 64, 112, 31, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1

            $oWord = _WordCreate($sFile, 0, 0)
            $oDoc = _WordDocGetCollection($oWord, 0)

$_FIO = GUICtrlRead ($FIO,0)
                _WordDocFindReplace($oDoc, '_FIO', $_FIO)
$_doljnost = GUICtrlRead ($doljnost,0)
                _WordDocFindReplace($oDoc, '_doljnost', $_doljnost)
$_Podrazd = GUICtrlRead ($Podrazd,0)
                _WordDocFindReplace($oDoc, '_Podrazd', $_Podrazd)
$_Organiz = GUICtrlRead ($Organiz,0)
                _WordDocFindReplace($oDoc, '_Organiz', $_Organiz)
$_Nas_punkt = GUICtrlRead ($Nas_punkt,0)
                _WordDocFindReplace($oDoc, '_Nas_punkt', $_Nas_punkt)
$_Phone = GUICtrlRead ($Phone,0)
                _WordDocFindReplace($oDoc, '_Phone', $_Phone)
$_pas_serial = GUICtrlRead ($pas_serial,0)
                _WordDocFindReplace($oDoc, '_pas_serial', $_pas_serial)
$_pas_number = GUICtrlRead ($pas_number,0)
                _WordDocFindReplace($oDoc, '_pas_number', $_pas_number)
$_data = GUICtrlRead ($data,0)
                _WordDocFindReplace($oDoc, '_data', $_data)
$_Organ = GUICtrlRead ($Organ,0)
                _WordDocFindReplace($oDoc, '_Organ', $_Organ)

            _WordDocSave($oDoc)
            _WordQuit($oWord)
            $oWord = 0
            $oDoc = 0
            ShellExecute($sFile)
		Case $Button2
			Exit

	EndSwitch
WEnd


выдает ошибку: --> Word.au3 Warning from function _WordDocFindReplace, $_WordStatus_NoMatch
и создается пустой файл
 

Вложения

  • template.doc
    53.5 КБ · Просмотры: 6
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
ZeVSalt [?]
и создается пустой файл
Так Вы открываете пустой файл, добавьте, например
Код:
;~ ...
		Case $Button1
			FileCopy($sTemplate, $sFile, 1)
;~ ...
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Код:
Case $Button1

FileCopy($sTemplate, $sFile, 1)

            $oWord = _WordCreate($sFile, 0, 0)


вставил, тоже самое
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Доработал, большое спасибо travissteil за оказанную помощь в написании, выкладываю готовый вариант, может кому пригодится.

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <Word.au3>
#include <Array.au3>
#include <File.au3>

Global $sTemplate = @ScriptDir & '\template.doc'



#Region ### START Koda GUI section ### 
$Form1_1 = GUICreate("Заявление", 585, 520, 534, 217)
$FIO = GUICtrlCreateInput("", 176, 112, 345, 21)
$doljnost = GUICtrlCreateInput("", 176, 144, 345, 21)
$Podrazd = GUICtrlCreateInput("", 176, 176, 345, 21)
$Organiz = GUICtrlCreateCombo("", 176, 208, 345, 21)
GUICtrlSetData(-1, "Организация 1|Организация 2")
$Nas_punkt = GUICtrlCreateCombo("", 176, 240, 345, 21)
GUICtrlSetData(-1, "нас.пункт 1|нас.пункт 2")
$SNILS = GUICtrlCreateInput("", 176, 272, 345, 21)
$Phone = GUICtrlCreateInput("(код города)" & "", 176, 304, 345, 21)
$pas_serial = GUICtrlCreateInput("", 152, 336, 89, 21)
$pas_number = GUICtrlCreateInput("", 352, 336, 169, 21)
$data = GUICtrlCreateInput("", 152, 368, 89, 21)
$Organ = GUICtrlCreateInput("", 352, 368, 169, 21)
$Button1 = GUICtrlCreateButton("СОХРАНИТЬ", , 448, 150, 33, 0)
$Button2 = GUICtrlCreateButton("ВЫХОД", 400, 448, 150, 33, 0)
$Button3 = GUICtrlCreateButton("ПЕЧАТЬ", 217, 448, 150, 33, 0)
$Label1 = GUICtrlCreateLabel("Заявление на изготовление ключа проверки ЭЦП", 64, 40, 452, 28)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
$Label3 = GUICtrlCreateLabel("Дата выдачи", 64, 368, 70, 17)
$Label4 = GUICtrlCreateLabel("Кем выдан", 248, 368, 60, 17)
$Label5 = GUICtrlCreateLabel("Серия паспорт", 64, 336, 79, 17)
$Label6 = GUICtrlCreateLabel("Номер паспорт", 248, 336, 82, 17)
$Label7 = GUICtrlCreateLabel("Телефон", 64, 304, 49, 17)
$Label8 = GUICtrlCreateLabel("СНИЛС", 64, 272, 42, 17)
$Label9 = GUICtrlCreateLabel("Населенный пункт", 64, 240, 99, 17)
$Label10 = GUICtrlCreateLabel("Организация", 64, 208, 71, 17)
$Label11 = GUICtrlCreateLabel("Подразделение", 64, 176, 84, 17)
$Label12 = GUICtrlCreateLabel("Должность", 64, 144, 62, 17)
$Label13 = GUICtrlCreateLabel("ФИО", 64, 112, 31, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Func ParseFullName($sFullName)
        $sFullName = StringRegExpReplace($sFullName, "[^\sЁёА-Яа-я]", Chr(32))
        $aFullName = StringRegExp(StringLower($sFullName), "\s*([ЁёА-Яа-я]+)\s*([ЁёА-Яа-я]+)\s*([ЁёА-Яа-я]+)\s*", 3)

        If @error Then
                Return -1
        EndIf

        $sSurname = StringUpper(StringLeft($aFullName[0], 1)) & StringRight($aFullName[0], StringLen($aFullName[0]) - 1)
        $sName = StringUpper(StringLeft($aFullName[1], 1)) & "."
        $sPatronymic = StringUpper(StringLeft($aFullName[2], 1)) & "."

        Return $sSurname & " " & $sName & " " & $sPatronymic
EndFunc   ;==>ParseFullName


Func ParseDate($sDate)
        $sDate = StringRegExpReplace($sDate, "[^\d]", "")
        $aDate = StringRegExp($sDate, "(\d{2})(\d{2})(\d{4}|\d{2})", 3)

        If @error Then
                Return -1
        EndIf

        $sDD = $aDate[0]
        $sMM = $aDate[1]
        $sYYYY = $aDate[2]

        If StringLen($sYYYY) = 2 Then
                If Int($sYYYY) <= 20 Then
                        $sYYYY = "20" & $sYYYY
                Else
                        $sYYYY = "19" & $sYYYY
                EndIf
        EndIf

        If (($sDD < 1) Or ($sDD > 31)) Or (($sMM < 1) Or ($sMM > 12)) Then
                Return -1
        Else
                Return $sDD & "." & $sMM & "." & $sYYYY
        EndIf
EndFunc   ;==>ParseDate

While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1

            $oWord = _WordCreate($sTemplate, 0, 0)
            $oDoc = _WordDocGetCollection($oWord, 0)

$_FIO = GUICtrlRead ($FIO,0)
                _WordDocFindReplace($oDoc, '_FIO', $_FIO)
$_doljnost = GUICtrlRead ($doljnost,0)
                _WordDocFindReplace($oDoc, '_doljnost', $_doljnost)
$_Podrazd = GUICtrlRead ($Podrazd,0)
                _WordDocFindReplace($oDoc, '_Podrazd', $_Podrazd)
$_Organiz = GUICtrlRead ($Organiz,0)
                _WordDocFindReplace($oDoc, '_Organiz', $_Organiz)
$_Nas_punkt = GUICtrlRead ($Nas_punkt,0)
                _WordDocFindReplace($oDoc, '_Nas_punkt', $_Nas_punkt)
$_Phone = GUICtrlRead ($Phone,0)
                _WordDocFindReplace($oDoc, '_Phone', $_Phone)
$_pas_serial = GUICtrlRead ($pas_serial,0)
                _WordDocFindReplace($oDoc, '_pas_serial', $_pas_serial)
$_pas_number = GUICtrlRead ($pas_number,0)
                _WordDocFindReplace($oDoc, '_pas_number', $_pas_number)
$_data = GUICtrlRead ($data,0)
$_Organ = GUICtrlRead ($Organ,0)
                _WordDocFindReplace($oDoc, '_Organ', $_Organ)

;~                      Считываю строку из контрола
                        $sSNILS = GUICtrlRead($SNILS, 0)
;~                      Парсю и записываю 11 чисел в массив
                        $aSNILS = StringRegExp($sSNILS, "\d", 3)
;~                      Проверяю что их реально 11, и ничего не забыли
                        If UBound($aSNILS) <> 11 Then
                                MsgBox(1, "Предупреждение", "Вы ввели НЕ 11 цифр СНИЛС")

                        EndIf
;~                      В цикле заменяю все значения в шаблоне
                        For $I = 0 To UBound($aSNILS) - 1
                                _WordDocFindReplace($oDoc, 'SNILS_' & $I, $aSNILS[$I], 1)
						Next


$min_name = ParseFullName ($_FIO)
_WordDocFindReplace($oDoc, '_mname', $min_name)

$pdata = ParseDate ($_data)
_WordDocFindReplace($oDoc, '_data', $pdata)

            _WordDocSaveAs($oDoc, @ScriptDir & $_FIO)
            _WordQuit($oWord)
            $oWord = 0
            $oDoc = 0
;~             ShellExecute($_FIO) ; открытие документа после сохранения
		Case $Button2
			Exit

		Case $Button3
			$print = _FilePrint(@ScriptDir & $_FIO & '.doc')

	EndSwitch
WEnd
 

Вложения

  • template.doc
    56.5 КБ · Просмотры: 11

alex33

Скриптер
Сообщения
1,457
Репутация
186
ZeVSalt [?]
Кажется, здесь ошибка:
Код:
_WordDocSaveAs($oDoc, @ScriptDir & $_FIO)

1. Не хватает слеша /
2. Файлу надо задать расширение (например .doc)

Исправленный вариант:
Код:
_WordDocSaveAs($oDoc, @ScriptDir & "\" & $_FIO & ".doc")
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Если я правильно понимаю, первоначально переменная объявлена в Global
Код:
Global $sTemplate = @ScriptDir & '\template.doc'


затем тут
Код:
$oWord = _WordCreate($sTemplate, 0, 0)
$oDoc = _WordDocGetCollection($oWord, 0)

т.о. в функции _WordDocSaveAs переменная $:shok:bject принимает значение глобальной, т.е. файл шаблона заполненный скриптом, мы сохраняем под новым именем $_FIO в папке со скриптом @ScriptDir
поэтому ИМХО дополнительное указание расширения и знак / , излишни.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
ZeVSalt [?]
поэтому ИМХО дополнительное указание расширения и знак / , излишни.
Тогда у вас получается неверный путь к файлу.
Вот запустите и сравните:
Код:
Global $_FIO="Qwerty"; для примера

;1. Error
MsgBox(0, "1", @ScriptDir & $_FIO)

;2. OK
MsgBox(0, "2", @ScriptDir & "\" & $_FIO & ".doc")
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
alex33 сказал(а):
ZeVSalt [?]
поэтому ИМХО дополнительное указание расширения и знак / , излишни.
Тогда у вас получается неверный путь к файлу.
Вот запустите и сравните:
Код:
Global $_FIO="Qwerty"; для примера

;1. Error
MsgBox(0, "1", @ScriptDir & $_FIO)

;2. OK
MsgBox(0, "2", @ScriptDir & "\" & $_FIO & ".doc")

УВас изначально в объявлении Global ошибка, в моём варианте указывается путь и расширение файла при объявлении, у Вас этого нет, поэтому в Вашем варианте вываливается в ошибку.
Код:
Global $sTemplate = @ScriptDir & '\template.doc'
Global $_FIO="Qwerty"; для примера

Посмотрите разницу.
 

id.balandin

Новичок
Сообщения
30
Репутация
0
У меня ошибка:
$Button1 = GUICtrlCreateButton("?????????", , 448, 150, 33, 0)
$Button1 = GUICtrlCreateButton("?????????", ^ ERROR

ЗЫ: WIN 10 у меня (х86)
 

id.balandin

Новичок
Сообщения
30
Репутация
0
Там не хватало цифры для координат.
Поправил.
Столкнулся с ошибкой:
Распечтака (но бог с ней)
$print = _FilePrint(@ScriptDir & $_FIO & '.doc')
$print = _FilePrint(@ScriptDir & ^ ERROR
Сохранение:
$oWord = _WordCreate($sTemplate, 0, 0)
$oWord = ^ ERROR
но, почитав тему пока не могу понять (выше были такие же ошибки)...
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Попробуйте в начале скрипта вставить это:
#include <Word.au3>
А что бы исправить $_FIO добавте это:
Global $_FIO = '\123'


Добавлено:
Сообщение автоматически объединено:

Мне кажется, что вы ставите лишние спойлеры
Имхо
 

id.balandin

Новичок
Сообщения
30
Репутация
0
#include <Word.au3>
Библиотека есть.

А что бы исправить $_FIO добавте это:
Global $_FIO = '\123'
Не понял? Поясни пожалуйста.
 
Верх