Комментарии 17
Спасибо с любом случае, много библиотек хороших и разных полезно! Но всё-таки - а чем NPOI такой уж низкоуровневый? Пример из Вашего readme на Гитхабе на NPOI реализуется плюс-минус в то же количество очень похожих строк. Про Open XML SDK молчу, там правда сурово.
Спасибо за отзыв! А я, если честно, уже не помню. Но тогда ничего сопоставимого по простоте входа с оригинальной DocX и Aspose.Words точно не было. Я очень, очень искал %)
многие вещи не реализованы в NPOI, например нормальная работа с колонтитулами, нумерация страниц и т.п
Хм... я пока что только самые базовые штуки делал, но вроде и колонтитулы поддерживает, и поля (а нумерация страниц - по сути, поля в колонтитулах):
XWPFFooter footer = document.CreateFooter(HeaderFooterType.Default);
XWPFParagraph footerPara = footer.CreateParagraph();
XWPFRun footerRun = footerPara.CreateRun();
footerRun.SetText("Page ");
footerRun.AddField("PAGE");
(это, если что, ChatGPT написала, так что все претензии к ней :)
Я не утверждаю ничего, опыта пока мало, но просто для себя хочется понять, на какие грабли придётся наступить, когда потребуется делать что-то посложнее.
а попробуйте разную нумерацию первой и второй странице или начать с нового раздела. это то на что я напоролся и то, что пришлось пилить
Насколько я понимаю, HeaderFooterType.First как раз позволяет создать отдельный колонтитул для первой страницы (на второй и последующих останется дефолтный).
А вот как Word делает нумерацию с начала новой секции - тут я, честно говоря, независимо от библиотеки не понял сходу. Поле остаётся то же самое, "PAGE"... Я, конечно, вместо "PAGE" могу вставить "LISTNUM", у которого в параметрах можно настроить сброс нумерации, но это не то, что делает сам Word, и может конфликтовать с аналогичными полями в тексте. В общем, надо до Visual Studio добраться, поэкспериментировать... спасибо за направление для экспериментов!
Колонтитулов есть аж три вида: First - только для первой страницы секции, Even только для четных страниц, и Odd - должен быть обязательно, он для всех, кроме первой и четных, если они отдельно заданы.
А для нумерации страниц во всем документе и в секции просто есть разные поля. Как раз в Wordroller можно посмотреть, какие — мне пришлось добавить оба вида.
А для нумерации страниц во всем документе и в секции просто есть разные поля. Как раз в Wordroller можно посмотреть, какие — мне пришлось добавить оба вида.
А какие? Я сходу не нашёл. В самом Word есть разные поля для количества страниц в документе и в секции соответственно, а номер - только PAGE...
Сам Word, если создать документ вручную и глянуть внутрь, делает по-другому - если я выбираю в Page Numbering Options рестартовать нумерацию с 1, то он создаёт два отдельных, но совершенно одинаковых footer1.xml и footer2.xml, внутри каждого поле PAGE. А вот потом где-то ещё (пока не глядел детально) сопоставляет одной секции один футер, а другой - другой. И вот это сопоставление в библиотеках явным образом не делается, надо копаться на низком уровне (нашёл такой вопрос для POI на java)
Word так и делает: создает новую секцию (это виртуальный объект, конструируемый по section breaks в теле документа) с независимым набором колонтитулов и нумерацией страниц.
В Wordroller секции специально вынесены как верхнеуровневые объекты в теле документа, чтобы было интуитивно более понятнее :)
Посмотрел сейчас и вспомнил, что одной из проблемных вещей была работа с секциями и колонтитулами. С секциями в NPOI, судя по всему, не суперинтуитивно до сих пор. А с колнотитулами наоборот, в DocX была беда изначатльно.
OpenXML под MIT лицензией зато, где то это может оказаться важным.
Для ODT/ODS (LibreOffice) бы такое, чтобы можно было работать с документами, без необходимости иметь "либру" на сервере/раб.станции для формирования доков. Имхо в гос.секторе актуально.
К сожалению, ODT — все таки слишком маргинальный формат, если брать глобально. Лучше генерировать DOCX, но добиваться корректного отображения в LibreOffice. Мы в HARDROLLER так и делаем: генерируем DOCX, с которыми пользователи работают и в Word (причем от 2007 до 365), и в Libre, а сами мы генерируем PDF в LibreOffice под Linux.
Открытая библиотека для работы с документами Microsoft Word формата .docx в мире .Net в 2023 году: Wordroller