2.0 KiB
Формирование 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.