10 lines
2.0 KiB
Markdown
10 lines
2.0 KiB
Markdown
# Формирование Word-документа
|
||
|
||
`ReportWithWorder.OutputReport` проверяет `.docx`-шаблон, создает каталог проекта и имя `Ведомость объемов работ (yyyy.MM.dd HH.mm.ss).docx` (`ReportWithWorder.cs:30-54`). Движок по умолчанию — Microsoft Office Interop, но пользователю предлагается переключиться на SautinSoft (`ReportWithWorder.cs:54-85`).
|
||
|
||
`Worder.Load` копирует шаблон в `%TEMP%` (`Worder.cs:305-322`). Office-ветка создает `Word.Application`, открывает временный документ, берет `Tables[1]`, таблицы footer первой и основной страницы, делает Word видимым и меняет View/Selection (`Worder.cs:326-355`). SautinSoft-ветка загружает DocumentCore и берет первую таблицу и footer-таблицы по индексам (`Worder.cs:357-370`).
|
||
|
||
Основные строки результата строятся `ReportWithWorder.cs:93-1287`: группы `PipingElement` и сварные стыки превращаются в строки `Cells12345TableRow`; строки добавляются через `Worder.AddNewRowToTable`. `Worder.cs:588-626` показывает, что Office использует `_wordTable.Rows.Add(ref oMissing)`, а SautinSoft клонирует вторую строку.
|
||
|
||
Поля обновляются в основном тексте и headers/footers (`Worder.cs:742-763`), затем документ сохраняется, закрывается и Word завершается (`Worder.cs:383-420`). Важный риск: COM-объекты не освобождаются через `Marshal.FinalReleaseComObject`, а `Load`/`SaveAndUnload` ловят исключения и продолжают путь копирования (`Worder.cs:372-380`, `508-519`); возможны поврежденный результат и зависший WINWORD.EXE.
|