Самый простой вариант без потусторонних библиотек.
Делаете красивый шаблон, с нужными отступами и рюшечками. Там, где потом программно нужно будет поменять текст, вставляете что-то вроде {{My_string_1}}
Сохраняете как файл rtf.
Потом в C# (или ещё где), отрываете шаблон, и поиском заменяете строку {{My_string_1}} на нужный текст.
но и тем, что на машине, обрабатывающей этот шаблон, не нужен купленный ворд.
Если ты собрался пользоваться вордовыми документами, то тебе один хуй нужна лицензия.
И гораздо проще тупо купить лицуху на машину, где вот это вот всё будет происходить, чем платить 50 раз за поддержку велосипеда с костылями. А ты платить будешь, хотя бы в виде зряплаты горе-разработчика.
Сколько времени ты проебёшься с этой задачей? Сколько времени у тебя уйдёт на переделку, когда MS в очередной раз формат хранения сменит, или перестанет условный rtf поддерживать? Я сильно сомневаюсь что цена этих человеко-часов будет меньше, чем купить ещё одну лицензию.
Такие вот дела.
А мне как раз и нужно, чтобы вордовый документ создавался на машине (большом колличестве машин), на кртрых офис не уставнолен...
Но это уже тема для разговора не здесь. Это как раз в теме проблемы "XY" - вы же всей моей ситуации не знаете, но не на Пикабу же весь мой проект расписывать =)
А мне нужен вариант, когда при смене форматирования не нужно было бы переписывать всю функцию заново.
На условном sql.ru я бы тебе ответил.
А тут могу мемасиков, котегов и сисег накидать, надо?
Не, показалось мне. Такой алгоритм можно было бы и без вопросов к сообществу "придумать" и реализовать, причём реально на любом языке. А мне нужен вариант, когда при смене форматирования не нужно было бы переписывать всю функцию заново.
А что скажете про TemplateEngine.Docx ?
Я бы посоветовал не создавать весь документ (хотя это тоже возможно, но неудобно), а брать шаблон и запонлять в нём поля.
Сам пользовался вот этим:
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();
}
Вау, это же вообще гениальная штука! Конечно не так профессионально как DocumentFormat.OpenXml, предложенное @GreatWizard , но в моей ситуации будет идеально!
Сейчас же нцжно быть ну совсем упоротым, чтобы на развлекательном ресурсе искать ответы. Есть масса профессиональных пабликов для этого. Ну а так - круче реально тоьько на порнхабе искать. Кстати, там пользователей на порядок больше. Если не нм два.
Понял вас.
Но для чего тогда тут сообщество программистов?
Правила я не нарушал, вопрос задал в тематическом сообществе, ответ тоже получил (ещё раз всем спасибо).
Т.е. моя идея в том, что зачем бегать по разным ресурсам, если это можно сделать здесь?
DocumentFormat.OpenXml ищи в NuGet репозитории, это библиотека от MS, может немного сложнее, чем то говнище, что тебе предложили выше, но это самый правильный путь
Ну пиздец щкольники уже охуели, на пикабу проф.советы спрашивают.
С ужасом жду, когда они по порнхаба доберутся
так разве не так решаются проблемы? это просто обязан быть первый шаг - самостоятельная работа, как мозгами, так и ручками по поиску в гугле. ну и на крайний случай - всякие stackoverflow. а пикабу (развлекательный ресурс) - ну такое себе, честно.
Всё верно.
Но иногда нужна маленькая подсказака - в какую сторону гуглить и какую именно информацию искать. И тут пикабу в самый раз - несколько человек между чтением ленты дали пару дельных советов - то что мне нужно.
Варианты:
1. Создать ручками через https://www.loc.gov/preservation/digital/formats/fdd/fdd0003... стандарт, там достаточно и в открытом написано, docx простой формат - основной недоxml внутри зипа, и там же аттачи картинок итд.
2. То же самое, но через вспомогательный либ
3. Взять какой-либо либ или сконвертировать готовым либом типа опенофисного из принятого и простого типа html в docx.
Я бы посоветовал не создавать весь документ (хотя это тоже возможно, но неудобно), а брать шаблон и запонлять в нём поля.
Сам пользовался вот этим:
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();
}
Я уже делал это в Autoit "по тупому" - сохранил Word.docx в XML, сделал функцию которая создаёт такой же файл, только на нужных местак стояли переменные. Тупо но работает 100%. Но менять форматирование - это кошмар. Поэтому хочу узнать какие ещё есть варианты
Лига программистов
2.3K поста12K подписчиков
Правила сообщества
- Будьте взаимовежливы, аргументируйте критику
- Приветствуются любые посты по тематике программирования
- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества