Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Эффективные способы работы с Excel

#c_sharp #excel


Работаю в консольных приложениях. у меня стоит Windows 10 и VS последняя актуальная
версия. Кое как,  методом тыка и вдумчивого поиска, разобрался с элементарными задачами:
прочитать данные в такой-то ячейке, записать данные в такую-то ячейку, и создать новую
книгу.
Использовал при этом:

using Excel = Microsoft.Office.Interop.Excel;


Для меня большая проблема состоит в том, что я не вижу документации для работы с
этой библиотекой. Если вы считаете, что есть более эффективные способы работы с Excel
через C#, то просветите меня. Буду рад, если вы понятно для меня изложите. 
    


Ответы

Ответ 1



Во-первых вам следует определиться, какой вам формат нужен: .xls или .xlsx. Они совершенно разные: xls — бинарный, а xlsx — это zip-архив XML файлов. Также, возможно, вам может подойти ods файл, который тоже представляет собой zip-архив XML файлов, но об этом ниже. Office COM Interop То о чём вы ведёте речь называется Office Interop. Иногда ещё к этому названию добавляют COM. Я сильно рекомендую его не использовать. Разве что только вы генерируете небольшие файлы на компьютере для себя. Почему? Очень медленный. Много утечек памяти. Ни в коем случае не используйте эту библиотеку для веб-сайтов или приложений, где на сервере генерируются файлы Office-форматов. У вас кончится оперативная память довольно быстро и сайт или приложение упадёт. Чтобы не быть голословным, могу сказать, что Microsoft сама не рекомедует использовать свою же Office COM Interop для автоматизации: Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment. Что в вольном переводе значит: Корпорация Майкрософт не рекомендует и не поддерживает, автоматизации приложений Microsoft Office с помощью автоматических, не-интерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и службы NT), потому что офис может показывать нестабильное поведение и/или взаимоблокировку (deadlock), когда офис работает в этой среде. Требует наличия офиса определённой версии. На каждую машину, где будет работать ваше приложение. Рассмотрю xlsx файлы. Вроде уже прошло время, когда ещё надо поддерживать Office 2003 и ниже. Путаница с названием форматов Некорректно называть этот формат Excel. Excel — это одна из программ пакета Microsoft Office. (Также некорректно называть docx-файл Word). Называть формат xlsx Excel — приблизительно то же самое, что называть формат HTML — Internet Explorer. Office Open XML Что следует из того, что это zip-архив XML файлов? Что это значит? Это значит, что вы можете взять любой Open XML формат (все которые оканчиваются на x: docx, xlsx, pptx и т.д.), переименовать расширение на zip, открыть его. Затем можно посмотреть все нужные XML-файлы и можно даже попробовать их редактировать. (То же самое справедливо и для ods, но это OpenDocument-формат, а не Open XML!). Стандарт Open XML xlsx-файлы безусловно связаны с реализацией Microsoft. OpenXML форматы (все которые оканчиваются на x: docx, xlsx, pptx и т.д.) стали выходить после пакета офиса 2007 года. Microsoft опубликовало спецификацию в 2006 году, затем выпустило офис. А зачем Microsoft выпустило спецификацию? Для того, чтобы её реализовать мог кто угодно. Трудности в работе с Open XML Важное обновление. Все нижеописанные трудности крайне успешно решаются с помощью бесплатного инструмента от Microsoft под названием OpenXML SDK Productivity Tool. Он позволяет генерировать код для создания документа, генерировать код превращения одного документа в другой, валидировать документы с ошибками и показывать какие именно ошибки он содержит. Дело в том, что стандарт Open XML мягко говоря, громоздкий (занимает 6546 страниц), поэтому его просто не осилишь просто чтением стандарта. И с ним работать довольно тяжело. У вас есть объектная обёртка над различными тэгами XML. НО: При разработке ничто не подсказывает что и куда должно быть вложено. Вам приходится находить рабочие примеры и делать из них "винигрет" того, что работает. Основная трудность помимо того, что нет никакой подсказки до компиляции что с ним делать, что нет и никаких исключений и ошибок, если вы сгенерировали невалидную XML-структуру. Всё сильно усугляется тем, что офис просто не откроет ваш документ. Точнее откроет и выдаст "The file is corrupt and cannot be opened". То есть одна ошибка (вложили не тот элемент или чего-то не вложили) и даже гигантский документ не открывается. Вам приходится вникать в низкоуровневые детали того, как устроено хранение данных. То есть сама разработка сильно усложняется тем, что вам приходится писать код для казалось бы простых вещей. К примеру: Здесь вы узнаете, что строковые значения ради производительности хранятся в специальной таблице (SharedStringTable) и при добавлении и новой строки добавляется всего лишь порядкой номер в этой таблице (к примеру в ячейке будет хранится 1). То есть если вам надо добавить строковое значение в ячейку вам надо будет посмотреть в таблицу SharedStringTable есть ли там такая строка, и если нет — то создать запись в этой таблице, и вернуть новое число, если да — то взять порядковый номер. Для того, чтобы даты просто добавить ячейку как дату, надо помнить что они хранятся как числа (OLE Date), но весь курьёз заключается в том, что есть тип CellValues.Date, который не работает. Далее надо будет добавить несколько секций стилей и тогда всё заработает. Пример. Если вам ещё важен формат дат, то это тоже потребует времени разобраться, как именно хранятся форматы данных. Если вам надо будет просто удалить строку (row) или столбец (column), то придётся все значения (ниже или правее) переносить вручную. Библиотеки, основанные на Open XML В общем, если обернуть всё методами и потратить где-то 1-3 рабочих дня, то в целом можно и так работать. Чтобы избежать этих сложный вещей используйте уже готовые библиотеки, основанные на Open XML: ClosedXML EPPlus Open Document Format Помимо xls и xlsx существует также формат ods, который первоначально поддерживался в OpenOffice и затем LibreOffice. Cейчас форматы Open Document уже поддерживаются и Microsoft Office. Для этого работы с форматами Open Document существует библиотека AODL, для которой есть Nuget-пакет и примеры.

Ответ 2



Для этих целей лучше использовать OpenXML так как interop штука тормозная+ требует наличия office (Правда, можно поставить халявный office SDK). Голый OpenXML не очень приятный в использовании, поэтому для него существует удобная обертка EPPlus Примеры и документация тут. Правда, есть ограничение: Либа не поддерживает EXCEL формата 2003 года. Вроде, формат 2003 года сохранялся в бинарном виде, а не в структуре XML.

Ответ 3



Если работа с ексель файлами требует всего лишь работу с данными и в частности с данными на одной таблице/странице, я советовал бы не заморачиватся и просто вот этот скриптик использовать: Как просто работать с / открыть / изменить / сохранить Excel / CSV файлы В нем ты сразу работаешь с ексель файлом как с 2хмерным массивом ячеек. Минимум функционала. Если хочется больше -- советую ClosedXML как обертка к OpenXML. Так же по ссылке найдешь ответ на свой вопрос. В принципе, там написано то же, что написал Vadim Ovchinnikov. Просто другими словами + пример использования.

Комментариев нет:

Отправить комментарий