
Для заполнения документа необходимо всего лишь:
- Скопировать в документ свой текст, шаблон документа;
- Расставить закладки (Bookmarks) и задать им имена;
- Любым серверным скриптом(php, aspx, и др.) заменить файл имя документа.docx.zip/CustomXML/item2.xml.
А теперь по подробнее.
Уже достаточно давно я интересуюсь возможными альтернативами заполнения документации в формате .docx на стороне сервера. Искал давно, но ничего такого, что бы радовало не нашел, наиболее понравившимися из того, что нашел было PHPWord, и недавняя статья Честная генерация DOCX на PHP. Часть 1.
В моем случае следующая специфика задач:
- генерация файлов docx с нуля не подходит, т.к. формы периодически меняются и нет желания постоянно их перекладывать в код;
- вариант с заменой по регулярке тоже не очень, использовал PHPWord в целом очень ничего библиотека, только сначала вообще плохо искал, потом, когда поправил их код и регулярку, начало лучше искать, но проблема этогшо метода в том, что иногда форматирование нарушалось;
- требуется легко, просто и быстро.
не найдя того, что хотел, решил изучать C#, маялся конечно долго, но оно того стоит, представляю Вам собственно сами файлы(Яндекс.Диск): файл .docx, файл .vsto
Особенности чтобы все нормально работало
имена закладок (Bookmarks) задаются исходя из того, как вы назовете поля в XML файле по следующему принципу:
Интел компани
Генерального директора
Петров Иван
Устава
23
34
имя поля к примеру: Company_Loc_a так должна называться закладка
я ниже 3го уровня не пробовал, но должен работать до бесконечной вложенности.
Буду рад советам
В настоящий момент файл не совсем то, чего я от него хочу, буду благодарен за замечания, а главное посоветуйте, если не трудно:
1) как сделать 1 файл, т.е. либо отвязаться от файла vsto либо интегрировать его ка-нибудь, или может на сервер кинуть и ссылку внедрить?
2) сейчас я привязывался к закладкам Bookmarks
this.Bookmarks[i.Key]
i.Key — это имя закладкикак сделать аналогично с PlainText…
сейчас его можно вызвать, но только одним способом
this.CompanyName
где CompanyName — имя поля текста.3) и подскажите, есть в C# что-то похожее на this.{i.Key} чтобы динамически вызывать параметр или как в PHP $$ или ${переменная со сзначением создаваемой переменной} ??