Работа с Office «открытым» XML - насколько это сложно? - PullRequest
5 голосов
/ 25 января 2012

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

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

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

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

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 25 января 2012

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

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

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

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

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

3 голосов
/ 29 января 2012

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

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

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

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

2 голосов
/ 02 февраля 2012

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

http://www.officewriter.com

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

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

0 голосов
/ 15 апреля 2016

Вот некоторые дополнительные библиотеки, которые могут работать с форматами 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-file-in-WPF
(Введение в формат WordprocessingML и демонстрация того, как мы можем читать текст документа)

...