Насколько сложно работать с Office Open XML?

Я подумываю о замене (очень) большого объема кода автоматизации делопроизводства чем-то, что напрямую работает с форматом Office XML. Я только начинаю, но уже переживаю, что это слишком большая задача.

Я буду иметь дело с Word, Excel и PowerPoint. Пока я смотрел только Word и Excel. Похоже, документами Word должно быть достаточно легко манипулировать, но книги Excel выглядят как кошмар. Например...

В Word похоже, что вы можете удалить абзац, просто удалив соответствующий тег «w: p». Однако предоставленный фрагмент кода для удаления строки в Excel занимает около 150 строк кода (!).

Причина, по которой код Excel такой большой, заключается в том, что удаление строки означает обновление индексов строк всех последующих строк, исправление таблицы «общих строк» ​​и т. Д. Согласно комментарию вверху, фрагмент кода даже не завершен. , в том смысле, что он не будет иметь дело с книгой, в которой есть таблицы (я могу с этим жить).

Я не совсем понимаю, является ли это единственным ограничением в образце кода. Например, возникнет ли проблема, если книга будет содержать сводную таблицу? Или диаграмма, которая ссылается на данные с того же листа? Или несколько именованных диапазонов? Разве вам не пришлось бы также обновлять формулы для любых ячеек (и т. Д.), Которые ссылаются на строку, индекс которой изменился?

[Это не говоря уже о «цепочке вычислений», которую (к счастью), я думаю, вы можете просто удалить, так как это всего лишь цепочка, которую можно восстановить.]

И это мой вопрос, хотя он и невнятный. Насколько усердно вам нужно работать, чтобы сделать такое простое, как правильное удаление строки? Это непреодолимая задача?

Кроме того, если есть другие похожие проблемы либо с Excel, либо с Word или PowerPoint, я хотел бы услышать о них сейчас, прежде чем я буду тратить слишком много времени на тупик. Спасибо.


person Gary McGill    schedule 25.01.2012    source источник


Ответы (4)


Проработав почти два года с Open XML SDK 2.0, я могу сказать, что выполнение, казалось бы, тривиальных задач может занять много часов, а иногда и дней, чтобы понять, как это делать правильно. Например, удаление строки Excel должно быть довольно простым и легким делом, верно? Нет, потому что вам не только нужен код для удаления вашей строки, но и вам нужно обновить все индексы строк, обновить все ссылки на объединенные ячейки, обновить ссылки гиперссылок и т. Д. Наш внутренний метод удаления близок к 500 строкам кода, чтобы просто удалить ряд, и я уверен, что мы не все случаи учтены.

Самая большая жалоба, которую я испытываю, - это отсутствие документации о том, как выполнять наиболее распространенные задачи. Раздел MSDN в Open XML SDK очень ограничен, и когда вам нужно делать что-либо сложное вы действительно сами по себе. Мне пришлось много читать стандарт Open XML, чтобы выяснить, что означают определенные элементы и как они должны быть реализованы, поскольку я смог найти очень мало в Интернете.

Другая сложная часть заключается в том, что если вы вставляете элемент в место, которому он не принадлежит, или помещаете недопустимый атрибут в элемент, вы получите поврежденный файл, когда попытаетесь его открыть. В большинстве случаев вы не получите никакой информации о том, что вызвало ошибку, и вам придется взглянуть на стандартную спецификацию Open XML, чтобы увидеть, что вы сделали не так.

Если вам нужно быстро выполнить преобразование этого кода автоматизации Office в Open XML, и то, что вы делаете, на самом деле не является базовым, я бы сказал, прошло. Если у вас есть время и терпение, чтобы прочитать XML-структуры Word, Excel и PowerPoint и понять, как они соотносятся, то я советую действовать. На мой взгляд, это действительно единственный способ получить очень точный контроль над этими офисными документами, но когда вы начнете, вам придется потратить много времени на обучение.

Да, и просто для удовольствия, вот сколько кода требуется для добавления комментария в Excel ячейка.

person amurra    schedule 25.01.2012
comment
Спасибо. Я нашел несколько библиотек для работы с Excel и для решения некоторых проблем, которые я упомянул в своем вопросе (и вы повторили его в своем ответе) - см. Мой ответ. - person Gary McGill; 29.01.2012
comment
Г-н @amurra, сейчас 2014 год, Open XML v2.5 (выпущенный в конце 2012 года) очень многообещающий, поскольку я читал об этом, мой руководитель группы настаивает на использовании только тех библиотек, которые поддерживаются Microsoft. , что вы предлагаете? - person Mahdi Alkhatib; 07.08.2014
comment
Я бы процитировал ссылку с веб-сайта Microsoft, которая в последний раз обновлялась < b> 25 июля 2014 г.: Open XML SDK 2.5 упрощает задачу управления пакетами Open XML и базовыми элементами схемы Open XML внутри пакета. Пакет Open XML SDK 2.5 инкапсулирует множество общих задач, которые разработчики выполняют с пакетами Open XML, так что вы можете выполнять сложные операции с помощью всего нескольких строк кода. - person Mahdi Alkhatib; 07.08.2014
comment
Я согласен с вашим тимлидом. Все, что вам нужно для работы с офисным документом, можно сделать с помощью открытого xml. Этого нельзя сказать о стороннем инструменте. Если вы столкнулись с ошибкой или проблемой, вам нужно полагаться на третью сторону, чтобы исправить ее. MS довольно хорошо исправляет ошибки при подключении, и вы можете быть уверены, что их библиотеки были тщательно протестированы. Кроме того, если вы переключите версию в той ссылке, которую вы опубликовали в Office 2010, вы увидите то же описание, которое вы указали для v2.0. Я не думаю, что в 2.5 сильно изменилось, но я бы лично доверял библиотекам MS, а не сторонним библиотекам. - person amurra; 07.08.2014

Для полноты картины я нашел несколько библиотек для работы с Excel XML:

www.extremexml.com - слой поверх классов Open XML SDK; фокусируется на введении данных в существующую электронную таблицу; обрабатывает многие проблемы с перекрестными ссылками, которые я указал в своем вопросе. Открытый исходный код, но GPL2, а не LGPL. Код выглядит красиво, а документация отличная. Однако не выглядит ужасно активным на codeplex.

Closed XML - еще один уровень поверх Open XML SDK - снова с открытым исходным кодом, но с менее жесткой лицензией ( Массачусетский технологический институт). Выглядит красиво и выглядит более «активным», чем приведенный выше.

SpreadsheetLight - насколько я могу судить, библиотека с закрытым исходным кодом, расположенная поверх классов SDK Open XML. Больше ориентировано на тех, кто хочет создать электронную таблицу с нуля, а не вносить изменения в существующие электронные таблицы.

person Gary McGill    schedule 28.01.2012
comment
Если у вас проблемы с производительностью библиотек на основе Open XML, теперь вы можете также рассмотреть возможность использования EPPlus (LGPL). - person Frédéric; 18.04.2016

Вот еще одна сторонняя библиотека, предназначенная для работы с OpenXML:

http://www.officewriter.com

В приведенном выше примере amurra удаления строк электронной таблицы Excel это единственный вызов метода с помощью этого инструмента. Он обновляет формулы и все другие ссылки, для которых, по-видимому, в противном случае потребовалось бы 500 строк кода.

Сам OpenXML SDK - отличный инструмент для очень простых вещей, но вам все равно придется позаботиться о многих внутренних особенностях формата файла и структуры упаковки, чтобы все было действительно правильно.

person Eisbaer    schedule 02.02.2012

Вот несколько дополнительных библиотек, которые могут работать с форматами OOXML:
- GemBox.Spreadsheet (XLSX )
- GemBox.Document (DOCX)

Также GemBox опубликовал несколько статей, демонстрирующих, как работать с форматом файлов OOXML с помощью чистого .NET (без использования какой-либо библиотеки), я думаю, вам это будет интересно:

www.codeproject.com/Articles/15593 / Read-and-write-Open-XML-files-MS-Office
(Введение в формат SpreadsheetML и объяснение того, как мы можем читать и записывать содержимое ячеек рабочего листа)

www.codeproject.com/Articles/649064/Show-Word-File -in-WPF
(Введение в формат WordprocessingML и демонстрация того, как мы можем читать текст документа)

person WrelleDube    schedule 15.04.2016
comment
Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это такое и почему. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен. - person Tom Sabel; 15.04.2016