C# работа с Excel
работаю в консольных приложениях. у меня стоит виндовс 10 и VS последняя актуальная версия. кое-как я методом тыка и вдумчивого гугления разобрался с элементарными задачами: прочитать данные в такой-то ячейке, записать данные в такую-то ячеку, и создать новую книгу. использовал при этом using Excel = Microsoft.Office.Interop.Excel;
для меня большая проблема состоит в том, что я не вижу документации для работы с этой библиотекой. если вы считаете, что есть более эффективные способы работы с Excel через шарп, то просветите меня, буду рад любой помощи, если вы понятно для меня изложите. спасибо.
Во-первых вам следует определиться какой вам формат нужен: .xls или .xlsx. Они совершенно разные: xls — бинарный, а xlsx — это zip-архив XML файлов. Также, возможно, вам может подойти ods файл, который тоже представляет собой zip-архив XML файлов, но об этом ниже.
То о чём вы ведёте речь называется Office Interop. Иногда ещё к этому названию добавляют COM. Я сильно рекомендую его не использовать. Разве что только вы генерируете небольшие файлы на компьютере для себя. Почему?
Рассмотрю xlsx файлы. Вроде уже прошло время, когда ещё надо поддерживать Office 2003 и ниже.
Некорректно называть этот формат Excel. Excel — это одна из программ пакета Microsoft Office. (Также некорректно называть docx-файл Word). Называть формат xlsx Excel — приблизительно то же самое, что называть формат HTML — Internet Explorer.
Что следует из того, что это zip-архив XML файлов? Что это значит?
Это значит, что вы можете взять любой Open XML формат (все которые оканчиваются на x: docx, xlsx, pptx и т.д.), переименовать расширение на zip, открыть его. Затем можно посмотреть все нужные XML-файлы и можно даже попробовать их редактировать. (То же самое справедливо и для ods, но это OpenDocument-формат, а не Open XML!).
xlsx-файлы безусловно связаны с реализацией Microsoft. OpenXML форматы (все которые оканчиваются на x: docx, xlsx, pptx и т.д.) стали выходить после пакета офиса 2007 года. Microsoft опубликовало спецификацию в 2006 году, затем выпустило офис. А зачем Microsoft выпустило спецификацию? Для того, чтобы её реализовать мог кто угодно.
Дело в том, что стандарт Open XML мягко говоря, громоздкий (занимает 6546 страниц), поэтому его просто не осилишь просто чтением стандарта.
И с ним работать довольно тяжело. У вас есть объектная обёртка над различными тэгами XML. НО:
При разработке ничто не подсказывает что и куда должно быть вложено. Вам приходится находить рабочие примеры и делать из них "винигрет" того, что работает.
Основная трудность помимо того, что нет никакой подсказки до компиляции что с ним делать, что нет и никаких исключений и ошибок, если вы сгенерировали невалидную XML-структуру.
Всё сильно усугляется тем, что офис просто не откроет ваш документ. Точнее откроет и выдаст "The file is corrupt and cannot be opened". То есть одна ошибка (вложили не тот элемент или чего-то не вложили) и даже гигантский документ из-за одной ошибки не открывается.
Вам приходится вникать в низкоуровневые детали того, как устроено хранение данных. То есть сама разработка сильно усложняется тем, что вам приходится писать код для казалось бы простых вещей. К примеру:
Здесь вы узнаете, что строковые значения ради производительности хранятся в специальной таблице (SharedStringTable) и при добавлении и новой строки добавляется всего лишь порядкой номер в этой таблице (к примеру в ячейке будет хранится 1). То есть если вам надо добавить строковое значение в ячейку вам надо будет посмотреть в таблицу SharedStringTable есть ли там такая строка, и если нет — то создать запись в этой таблице, и вернуть новое число, если да — то взять порядковый номер.
Для того, чтобы даты просто добавить ячейку как дату, надо помнить что они хранятся как числа (OLE Date), но весь курьёз заключается в том, что есть тип CellValues.Date, который не работает. Далее надо будет добавить несколько секций стилей и тогда всё заработает. Пример. Если вам ещё важен формат дат, то это тоже потребует времени разобраться, как именно хранятся форматы данных.
Если вам надо будет просто удалить строку (row) или столбец (column), то придётся все значения (ниже или правее) переносить вручную.
В общем, если обернуть всё методами и потратить где-то 1-3 рабочих дня, то в целом можно и так работать. Чтобы избежать этих сложный вещей используйте уже готовые библиотеки, основанные на Open XML:
ClosedXML
EPPlus
Помимо xls и xlsx существует также формат ods, который первоначально поддерживался в OpenOffice и затем LibreOffice. Cейчас форматы Open Document уже поддерживаются и Microsoft Office. Для этого работы с форматами Open Document существует библиотека AODL, для которой есть Nuget-пакет и примеры.
Для этих целей лучше использовать OpenXML так как interop штука тормозная+ требует наличия office (Правда, можно поставить халявный office SDK).
Голый OpenXML не очень приятный в использовании, поэтому для него существует удобная обертка EPPlus
Примеры и документация тут.
Правда, есть ограничение:
Либа не поддерживает EXCEL формата 2003 года.
Вроде, формат 2003 года сохранялся в бинарном виде, а не в структуре XML.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости