@LuckyRuS

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

Просьба помочь в решении вопроса по созданию программы, задача которой заполнение двух-трех разных типов анкет ---> генерация сформированного файла в формате Word или PDF ---> Отправка файла на определенный почтовый адрес.

Цель следующая:

1. Появляется выпадающий список типа:
  • - анкета для абитуриента
  • - анкета для студента
  • - анкета для преподавателя

2. По мере того или иного выбора, требуется заполнить стандартные поля:
  • - ФИО
  • - Факультет (должность)
  • - Номер телефона

3. Если все условия соблюдены (заполнены все поля), появляется кнопка "ОТПРАВИТЬ", после нажатия на которую формируется уже ранее подготовленный шаблон DOC или PDF, который отправляется на почтовый адрес деканата.

Ранее просмотрел вариант с Windows Forms и C++, но что то не то. Других дельных описаний в сети не нашел. Буду признателен в помощи, правильном направлении в решении данной задачи. Может у кого имеется нечто подобное.
  • Вопрос задан
  • 2271 просмотр
Решения вопроса 1
FoggyFinder
@FoggyFinder
Не ясно почему были убрана метка "Программирование" из вопроса. Получается ответ в некотором роде будет оффтопом.

Теперь по существу:

Не знаю если такая возможность в Word, но если есть, то лучше (быстрее) будет воспользоваться именно ей.

Но если нужна именно программа, то я бы начал с составления ТЗ (технического задания), в котором было бы подробное описание требуемого функционала.

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

Примечание: Возможно F# не самый лучший выбор для данной задачи, но так как для своих персональных программ использую его, то и код привожу на нем.

1. Определяются основные объекты (Студент, Преподаватель, Абитуриент) для которых в виде свойств перечисляются характеристики для заполнения:

module Model

type Student = {
    Name : string
    Surname : string
    LastName : string
    Phone : string
    Faculty : string
}


Отдельно, для удобства, представляем наши записи в виде размеченного объединения:

[<RequireQualifiedAccess>]
type AccountType = 
    | Student of Student
    | Enrollee of Enrollee
    | Teacher of Teacher


Создаем модуль Defaults в котором будут находится значения по умолчанию для объектов (будет нужно для отображения):

[<RequireQualifiedAccess>]
module Defaults = 
    let student:Student = {
        Name = ""
        Surname = ""
        LastName = ""
        Phone = ""
        Faculty = ""
    }


Следующий шаг - создание или редактирование / заполнение готового Word или Pdf шаблона данными.

Есть несколько вариантов (библиотек) для работы и с тем и с другим форматом. Для Pdf есть очень известная библиотека:

iTextSharp

Есть и другие, как например,

SharpLayout

Документация в которой оставляет желать лучшего, но по крайней мере понятно что у нее нет проблем с отображением символов кириллицы.

Простейший вывод в виде таблицы может выглядеть так:

[<RequireQualifiedAccess>]
module PdfReport

open Model
open PdfSharp.Drawing
open SharpLayout

let private defaultSettings = 
    PageSettings(
        TopMargin=Util.Cm(1.2),
        BottomMargin=Util.Cm(1.0),
        LeftMargin=Util.Cm(2.0),
        RightMargin=Util.Cm(1.0))

let private createReportForTeacher teacher = 
    let document = Document()
    let section = document.Add(Section(defaultSettings))
    
    let font = 
        Font("Times New Roman", 10.0, XFontStyle.Regular, XPdfFontOptions.UnicodeDefault)
        |> Option
    
    section.Add(Paragraph().Add("Информация об преподователе", font.Value).Alignment(HorizontalAlign.Center.AsOption().ToNullable())) |> ignore

    let table = section.AddTable().Font font
    
    let c1 = table.AddColumn(Util.Px(600.0))
    let c2 = table.AddColumn(Util.Px(600.0))
    
    let r1 = table.AddRow()
    let r2 = table.AddRow()
    let r3 = table.AddRow()
    let r4 = table.AddRow()    
    let r5 = table.AddRow()

    r1.[c1].Add(Paragraph().Add("Имя:")) |> ignore
    r1.[c2].Add(Paragraph().Add(teacher.Name)) |> ignore

    r2.[c1].Add(Paragraph().Add("Фамилия:")) |> ignore
    r2.[c2].Add(Paragraph().Add(teacher.LastName)) |> ignore

    r3.[c1].Add(Paragraph().Add("Отчество:")) |> ignore
    r3.[c2].Add(Paragraph().Add(teacher.Surname)) |> ignore

    r4.[c1].Add(Paragraph().Add("Телефон:")) |> ignore
    r4.[c2].Add(Paragraph().Add(teacher.Phone)) |> ignore

    r5.[c1].Add(Paragraph().Add("Факультет:")) |> ignore
    r5.[c2].Add(Paragraph().Add(teacher.Faculty)) |> ignore

    document


Теперь что касается отображения, мне удобнее использовать WPF, ссылка на руководство и библиотеку
Gjallarhorn.Bindable.

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

Каждое отображение определим в виде навигационного состояния:

[<RequireQualifiedAccess>]
type NavMessages = 
    | Student
    | Teacher
    | Enrollee


работу с каждым типом вынесем в отдельные дочерние компоненты (StudentComponent, ...). Для каждого свойства можно определить собственное правило проверки корректности.

let appComp =
    Component.create<AppModel, NavMessages, Messages> [
        <@ ctx.Model.Student @> |> Bind.comp (fun m -> m.Student) studentComp fst
        <@ ctx.Model.Enrollee @> |> Bind.comp (fun m -> m.Enrollee) enrolleeComp fst
        <@ ctx.Model.Teacher @> |> Bind.comp (fun m -> m.Teacher) teacherComp fst
                        
        <@ ctx.Model.Menu @> |> Bind.comp (fun m -> m.Menu) menuComponent fst
    
        <@ ctx.SendReport @> |> Bind.cmd
    ]


Команда SendReport будет отвечать за созданием отчета и отправку его на почту. Кнопка будет активна только в том случае, если все поля заполнены без ошибок.

Остается определить функцию обновления модели приложения:

let upd (nav : Dispatcher<NavMessages>) message model = 
    match message with
    | Messages.SendReport ->
        let v, m = 
            match model.Menu.Current with
            | NavMessages.Enrollee -> 
                AccountType.Enrollee model.Enrollee, { model with Enrollee = Defaults.enrollee }
            | NavMessages.Student -> 
                AccountType.Student model.Student, { model with Student = Defaults.student }
            | NavMessages.Teacher -> 
                AccountType.Teacher model.Teacher, { model with Teacher = Defaults.teacher }
        v
        |> PdfReport.createReport
        |> PdfReport.saveReport "test.pdf"
        |> PdfReport.sendReport
        m
    | Messages.SetCurrent current ->
        current |> nav.Dispatch
        { model with Menu = { model.Menu with Current = current }}
    | Messages.UpdateEnrollee msg ->
        { model with Enrollee = EnrolleeComponent.update model.Enrollee msg }
    | Messages.UpdateStudent msg ->
        { model with Student = StudentComponent.update model.Student msg }
    | Messages.UpdateTeacher msg ->
        { model with Teacher = TeacherComponent.update model.Teacher msg }

open Gjallarhorn.Bindable.Framework

let applicationCore nav =
    let navigation = Dispatcher<NavMessages>()
    Framework.application init (upd navigation) appComp nav
    |> Framework.withNavigation navigation


Для работы с почтой вам нужно будет указать данные с которых вы хотите отправлять письмо. Как это сделать написано тут.

Теперь, чтобы добавить новый тип нужно будет сделать следующее:

1. Определить запись для нового объекта, описывающую его свойства.
2. Создать функцию генерирующую отчет для этого типа.
3. Создать компонент.
4. Создать пользовательский элемент управления для отображения.
5. Добавить его в общую модель программы.

В итоге получилось следующее:

5c7ece7614321212016044.gif

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

В данном примере был записан такой pdf:

5c7eceaae88cf238140201.jpeg

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

Только учтите, что набросок можно сделать за пару часов, а довести до ума будет занимать намного больше времени.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
tsklab
@tsklab
Здесь отвечаю на вопросы.
MS Word, "Рассылки".
100 студентов/преподавателей одновременно и пусть сами заполняют свои данные и отсылают
Создание и рассылка форм PDF.
Ответ написан
@LuckyRuS Автор вопроса
Foggy Finder "Как только отчет был отправлен, запись сбрасывается до значения по умолчанию"
Это только формирование PDF или сразу его последующая отправка на почту? Ответ идеальный, если покажу подобное то 4-ку мне сразу за год обеспечена! Благодарю!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы