Создание DOCX / WORD XML в C#

Привет Программисты!

Подскажите, пожалуйста, как можно создать вордовский документ при помощи C#.

Должен выводиться отформатированый текст и на определённые позиции переменные данные.

Какие есть варианты?

Спасибо!

Лига программистов

2.3K поста12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

3
Автор поста оценил этот комментарий

Самый простой вариант без потусторонних библиотек.

Делаете красивый шаблон, с нужными отступами и рюшечками. Там, где потом программно нужно будет поменять текст, вставляете что-то вроде {{My_string_1}}

Сохраняете  как файл rtf.

Потом в C# (или ещё где), отрываете шаблон, и поиском заменяете строку {{My_string_1}} на нужный текст.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Большое спасибо! Это кажется то, что нужно!

1
Автор поста оценил этот комментарий
но и тем, что на машине, обрабатывающей этот шаблон, не нужен купленный ворд.

Если ты собрался пользоваться вордовыми документами, то тебе один хуй нужна лицензия.

И гораздо проще тупо купить лицуху на машину, где вот это вот всё будет происходить, чем платить 50 раз за поддержку велосипеда с костылями. А ты платить будешь, хотя бы в виде зряплаты горе-разработчика.

Сколько времени ты проебёшься с этой задачей? Сколько времени у тебя уйдёт на переделку, когда MS в очередной раз формат хранения сменит, или перестанет условный rtf поддерживать? Я сильно сомневаюсь что цена этих человеко-часов будет меньше, чем купить ещё одну лицензию.

Такие вот дела.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

А мне как раз и нужно, чтобы вордовый документ создавался на машине (большом колличестве машин), на кртрых офис не уставнолен...

Но это уже тема для разговора не здесь. Это как раз в теме проблемы "XY" - вы же всей моей ситуации не знаете, но не на Пикабу же весь мой проект расписывать =)

показать ответы
0
Автор поста оценил этот комментарий

По теме могу предложить только поучительную притчу:

https://www.gunsmoker.ru/2008/10/x-y-z.html

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Прекрасно.

Автор поста оценил этот комментарий
А мне нужен вариант, когда при смене форматирования не нужно было бы переписывать всю функцию заново.

На условном sql.ru я бы тебе ответил.

А тут могу мемасиков, котегов и сисег накидать, надо?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Давай, но только по теме сообщества.

показать ответы
0
Автор поста оценил этот комментарий

Это ещё не самый пиздец.

пиздец - вот это:

Большое спасибо! Это кажется то, что нужно!
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Не, показалось мне. Такой алгоритм можно было бы и без вопросов к сообществу "придумать" и реализовать, причём реально на любом языке. А мне нужен вариант, когда при смене форматирования не нужно было бы переписывать всю функцию заново.

А что скажете про TemplateEngine.Docx ?

показать ответы
1
Автор поста оценил этот комментарий

Я бы посоветовал не создавать весь документ (хотя это тоже возможно, но неудобно), а брать шаблон и запонлять в нём поля.


Сам пользовался вот этим:

https://www.nuget.org/packages/TemplateEngine.Docx/

- вполне удобно. Выглядит примерно так:


var valuesToFill = new Content(


new FieldContent("DateDD", letter.Date.ToString("dd")),

new FieldContent("DateMonth", TextHelper.MonthToOrdinalLowercase(letter.Date.Month)),


new FieldContent("DateMM", letter.Date.ToString("MM")),


new FieldContent("DateYYYY", letter.Date.ToString("yyyy")),


new FieldContent("TitleFirstLower", title.ToFirstLower()),


new FieldContent("TotalSum", totalSum),

);

using (var outputDocument = new TemplateProcessor(file) .SetRemoveContentControls(true) .SetNoticeAboutErrors(false))


{


outputDocument.FillContent(valuesToFill);


outputDocument.SaveChanges();


}

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Вау, это же вообще гениальная штука! Конечно не так профессионально как DocumentFormat.OpenXml, предложенное @GreatWizard , но в моей ситуации будет идеально!

Автор поста оценил этот комментарий
В своё время пост, висевший в абсолютном топе на Баше, действительно имел тонкий смысл. Ну это где в канале аниме вопрос как KDE пропатчить. Потому как в те врмена интернет ещё не вошёл в массы, и ответ на поофессиональный вопрос действительно можно было найти на развлекательном ресурсе. Но уже тогда это было анекдотом.
Сейчас же нцжно быть ну совсем упоротым, чтобы на развлекательном ресурсе искать ответы. Есть масса профессиональных пабликов для этого. Ну а так - круче реально тоьько на порнхабе искать. Кстати, там пользователей на порядок больше. Если не нм два.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Понял вас.

Но для чего тогда тут сообщество программистов?

Правила я не нарушал, вопрос задал в тематическом сообществе, ответ тоже получил (ещё раз всем спасибо).

Т.е. моя идея в том, что зачем бегать по разным ресурсам, если это можно сделать здесь?

показать ответы
0
Автор поста оценил этот комментарий

DocumentFormat.OpenXml ищи в NuGet репозитории, это библиотека от MS, может немного сложнее, чем то говнище, что тебе предложили выше, но это самый правильный путь

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нашёл, установил, буду разбираться. Спасибо!

Автор поста оценил этот комментарий

Это не комплимент, это шкала оценки умственных способностей.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Экспресс тест на ICQ?

показать ответы
0
Автор поста оценил этот комментарий

Ну пиздец щкольники уже охуели, на пикабу проф.советы спрашивают.

С ужасом жду, когда они по порнхаба доберутся

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Школьники? Где? А... Спасибо за комплимент ;)

показать ответы
1
Автор поста оценил этот комментарий

так разве не так решаются проблемы? это просто обязан быть первый шаг - самостоятельная работа, как мозгами, так и ручками по поиску в гугле. ну и на крайний случай - всякие stackoverflow. а пикабу (развлекательный ресурс) - ну такое себе, честно.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Всё верно.

Но иногда нужна маленькая подсказака - в какую сторону гуглить и какую именно информацию искать. И тут пикабу в самый раз - несколько человек между чтением ленты дали пару дельных советов - то что мне нужно.

1
Автор поста оценил этот комментарий

Варианты:

1. Создать ручками через https://www.loc.gov/preservation/digital/formats/fdd/fdd0003... стандарт, там достаточно и в открытом написано, docx простой формат - основной недоxml внутри зипа, и там же аттачи картинок итд.

2. То же самое, но через вспомогательный либ

3. Взять какой-либо либ или сконвертировать готовым либом типа опенофисного из принятого и простого типа html в docx.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Благодарю!

0
Автор поста оценил этот комментарий

Тебе ещё про словообразование и суффиксы рассказать?!

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Всё что пожелаете ;)

1
Автор поста оценил этот комментарий

Я бы посоветовал не создавать весь документ (хотя это тоже возможно, но неудобно), а брать шаблон и запонлять в нём поля.


Сам пользовался вот этим:

https://www.nuget.org/packages/TemplateEngine.Docx/

- вполне удобно. Выглядит примерно так:


var valuesToFill = new Content(


new FieldContent("DateDD", letter.Date.ToString("dd")),

new FieldContent("DateMonth", TextHelper.MonthToOrdinalLowercase(letter.Date.Month)),


new FieldContent("DateMM", letter.Date.ToString("MM")),


new FieldContent("DateYYYY", letter.Date.ToString("yyyy")),


new FieldContent("TitleFirstLower", title.ToFirstLower()),


new FieldContent("TotalSum", totalSum),

);

using (var outputDocument = new TemplateProcessor(file) .SetRemoveContentControls(true) .SetNoticeAboutErrors(false))


{


outputDocument.FillContent(valuesToFill);


outputDocument.SaveChanges();


}

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо! Это тоже попробую!

1
Автор поста оценил этот комментарий

Ты хочешь ручками делать или как?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я уже делал это в Autoit "по тупому" - сохранил Word.docx в XML, сделал функцию которая создаёт такой же файл, только на нужных местак стояли переменные. Тупо но работает 100%. Но менять форматирование - это кошмар. Поэтому хочу узнать какие ещё есть варианты

показать ответы
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

"Иди гугли" Понял, спасибо :)

показать ответы
Автор поста оценил этот комментарий

Тогда ещё один тупой вопрос - что такое "ликбезник"?

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества