Содержание
- Workbooks. Open Метод
- Определение
- Параметры
- Возвращаемое значение
- Комментарии
- Старт работы с Excel на C#
- Историческая справка
- Задача
- Первый запуск
- Вывод данных
- Стилизация
- Размер ячеек
- Формат данных
- Выравнивание
- Стиль текста
- Границы
- График
- Заключение
- Загрузка данных из Microsoft Excel в DataGridView: Справочник по C#
Workbooks. Open Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Параметры
Обязательный атрибут типа String. Имя файла открываемой книги.
Необязательный объект. Указывает способ обновления ссылок в файле. Если этот аргумент опущен, пользователю будет предложено указать, как будут обновляться ссылки. В противном случае этот аргумент является одним из значений, перечисленных в следующей таблице. Если Microsoft Excel открывает файл в формате WKS, WK1 или WK3 и UpdateLinks аргумент имеет значение 2, Microsoft Excel создает диаграммы из диаграмм, присоединенных к файлу. Если аргумент равен 0, диаграммы не создаются.
Необязательный объект. Значение true, чтобы открыть книгу в режиме только для чтения.
Необязательный объект. Если Microsoft Excel открывает текстовый файл, этот аргумент задает символ разделителя, как показано в следующей таблице. Если этот аргумент опущен, используется текущий разделитель.
Необязательный объект. Строка, содержащая пароль, необходимый для открытия защищенной книги. Если этот аргумент опущен, а для книги требуется пароль, пользователю будет предложено ввести пароль.
Необязательный объект. Строка, содержащая пароль, необходимый для записи в книгу, зарезервированную для записи. Если этот аргумент опущен, а книге требуется пароль, пользователю будет предложено ввести пароль.
Необязательный объект. Значение true , чтобы Microsoft Excel не отображал рекомендуемое сообщение только для чтения (если книга была сохранена с параметром «Только для чтения рекомендуется «).
Необязательный объект. Если файл является текстовым файлом, этот аргумент указывает, где он возник (чтобы кодовые страницы и возврат/строка каретки (CR/LF) можно было правильно сопоставить). Может быть одной из следующих XlPlatform констант: xlMacintosh, xlWindows или xlMSDOS. Если этот аргумент опущен, используется текущая операционная система.
Необязательный объект. Если файл является текстовым файлом, а аргумент Format равен 6, этот аргумент представляет собой строку, указывающую символ, который будет использоваться в качестве разделителя. Например, используйте Chr(9) для вкладок, «,» для запятых, «;» для точки с запятой или используйте пользовательский символ. Используется только первый символ строки.
Необязательный объект. Если файл является надстройкой Microsoft Excel 4.0, этот аргумент имеет значение True , чтобы открыть надстройку, чтобы она была видимым окном. Если этот аргумент имеет значение False или опущен, надстройка открывается как скрытая и не может быть раскрыта. Этот параметр не применяется к надстройкам, созданным в Microsoft Excel 5.0 или более поздней версии. Если файл является шаблоном Excel, используйте значение True , чтобы открыть указанный шаблон для редактирования, или False , чтобы открыть новую книгу на основе указанного шаблона. Значение по умолчанию — False.
Необязательный объект. Если файл не удается открыть в режиме чтения и записи, этот аргумент имеет значение True , чтобы добавить файл в список уведомлений о файлах. Microsoft Excel откроет файл как доступный только для чтения, опрашивает список уведомлений о файлах, а затем уведомляет пользователя, когда файл станет доступен. Если этот аргумент имеет значение False или опущен, уведомление не запрашивается, и любые попытки открыть недоступный файл завершатся ошибкой.
Необязательный объект. Индекс первого преобразователя файлов, который следует попробовать при открытии файла. Сначала выполняется попытка указанного преобразователя файлов; Если этот преобразователь не распознает файл, пробуются все остальные преобразователи. Индекс преобразователя состоит из номеров строк преобразователей, возвращаемых свойством FileConverters[Object, Object] .
Необязательный объект. Значение true , чтобы добавить эту книгу в список недавно использовавшихся файлов. Значение по умолчанию — False.
Необязательный объект. Значение True сохраняет файлы на языке Microsoft Excel (включая параметры панели управления). Значение False (по умолчанию) сохраняет файлы на языке Visual Basic для приложений (VBA) (обычно это английский язык США, если только проект VBA, из которого выполняется Workbooks.Open, не является старым проектом VBA с интернационализацией XL5/95).
Необязательный объект. Может быть одной из следующих констант: xlNormalLoad, xlRepairFile и xlExtractData. Поведение по умолчанию, если значение не указано, обычное, но может быть безопасной загрузкой или восстановлением данных, если Excel уже пытался открыть файл. Первая попытка является нормальной. Если Excel перестает работать при открытии файла, вторая попытка является безопасной загрузкой. Если Excel снова перестает работать, следующая попытка — восстановление данных.
Возвращаемое значение
Комментарии
По умолчанию макросы включены при открытии файлов программным способом. Используйте свойство , AutomationSecurity чтобы задать режим безопасности макросов, используемый при программном открытии файлов.
Источник
Старт работы с Excel на C#
В современном мире разработки приложений нередко встает необходимость работы с Excel документами. Чаще всего это разного рода отчеты, но иногда xls/x файлы используются в качестве хранилища данных. Например, если пользователь должен иметь возможность загрузить данные в приложение или выгрузить, в человеко-читаемом виде, Excel де-факто является стандартом. Относительно дружелюбный интерфейс, прозрачная структура, в купе с его распространенностью. трудно навскидку назвать решение лучше.
Однако, у многих Excel до сих пор ассоциируется с чем-то тяжелым, неповоротливым и сложным. Давайте посмотрим, как мы — обычные C# разработчики, можем легко сформировать простой Excel документ, на примере табличного отчета.
Историческая справка
Времена, когда доминировал проприетарный формат .xls(Excel Binary File Format) давно прошли и сейчас мы имеем только .xlsx(Excel Workbook), в рамках Office Open XML. Последний представляет собой обычный .zip архив с XML файлами. Не будем углубляться в его структуру, я искренне надеюсь что вам это никогда не понадобится.
На github, и не только, можно найти ряд библиотек, бесплатных и не только. Пожалуй самой популярной является EPPlus. До определенной степени, она довольно хорошо отражает концепцию Excel, именно по этому я всегда использую EPPlus. Версия 4 полностью бесплатна, начиная с 5‐й версии вам потребуется приобрести лицензию для коммерческого использования.
Задача
Итак, предположим, продукт-мэнеджеру ударила в голову идея того, что возможность выгружать некий отчет в формате Excel увеличит кол-во пользователей на 100500%. Проджет-менеджер решает выкатить эту киллер-фичу как хотфикс прямо сегодня — ведь работы всего на пару часов.
Сам по себе, отчет содержит краткое описание компании и историю изменения некоторых экономических показателей. Для простоты все свойства компании — строки. Экономические показатели — большие целые числа и числа с плавающей точкой, а также даты. Предположим, что где-то в недрах микросервисного backend-да есть сервис-генератор подобных отчетов, например по id компании. Однако, поскольку id нет смысла выводить пользователю, идентификатор отсутствует в самой модели отчета.
Аналитик, в свою очередь, выдает задачу с феноменально точным описанием — «Сгенерировать excel отчет на базе данных MarketReport». Что ж, для нашего примера, создадим заглушку — генератор фейковых данных:
Первый запуск
Подключим EPPlus версии 4.5.3.3 и создадим базовую обвязку для будущего генератора.
Сердцем генератора будет метод Generate. ExcelPackage это модель документа, через которую мы и будем осуществлять все взаимодействия с ним. Также имеется конструктор для передачи пути к файлу или потока.
В методе main создается генератор отчетов, а также генератор Excel файлов. Далее полученный файл просто записывается на диск.
При попытке запустить приложение, получаем exception: InvalidOperationException: The workbook must contain at least one worksheet
Все правильно, Excel документ не может существовать без страниц, должна быть хотя бы одна. Добавляем ее, все интуитивно понятно:
Запускаем снова и. вот оно! Теперь наше приложение генерирует документ и, хотя там еще ничего нет, он уже весит 2,5KB — значит мы работаем с Excel правильно и все идет как надо.
Вывод данных
Давайте выведем основную информацию по компании в шапку. Для доступа к конкретной ячейки объект Cells на странице пакета снабжен удобным индексатором. При этом, до конкретной ячейки можно достучаться как через номер строки и столбца, так и по привычному всем буквенно-числовому коду:
Полный код вывода шапки.
Для вывода исторических данных понадобится как минимум шапка таблицы и цикл по массиву History:
Предлагаю обратить внимание на метод LoadFromArrays, который заполняет диапазон ячеек рваным(зубчатым) массивом. Здесь мы можем видеть, что типизация теряется и передавая массив object мы ожидаем что EPPlus в конечном итоге использует ToString, чтобы записать переданное в ячейки.
Стилизация
Если вы прямо сейчас откроете документ, то вы возможно увидите не то, что хотелось бы отдать в продакшн в пятницу вечером.
Как это выглядит
Во-первых, шапка никак не выделяется, во-вторых таблица не имеет границ. выравнивание пляшет, даты отображаются магическими числами, а капитализация «уходит в какую-то математику» — как это прокомментировал аналитик.
Да, на все эти красивости у нас уйдет больше года кода, чем на сам вывод данных, и, в конечном тоге, получившаяся каша из логики вывода данных и разметки заставит некоторых усомниться в их компетентности. но, мы же backend разработчики, так давайте сверстаем Excel Sheet!
Размер ячеек
Из коробки у нас есть возможность сделать автофит а так же вручную выставить ширину в соответствии с нашей ситуацией. А ситуация у нас не самая хорошая — по задумке аналитика в шапке у ячеек должен быть автофит, а у ячеек таблицы — тоже автофит. Так в чем же подвох?
Если вы когда-нибудь до этого открывали Excel, то возможно знаете, что ширина ячеек не может отличаться в рамках столбца и автофит будет по самому широкому контенту ячейки. Однако, простые вещи бывает нетак то просто объяснить. Но если вы справитесь, то вот как это будет выглядеть в коде:
Формат данных
Как и большая часть стиля ячейки, он задается через одноименное свойство Style. Обратите внимание на вычисление 3-го аргумента индексатора. Это звоночек некачественного кода, но к этому мы вернемся в позже.
Выравнивание
Его можно задать как на ячейке, так и на диапазоне. На самом деле, для EPPlus, это одна и та же сущность — некий ExcelRange, описывающий диапазон ячеек, в том числе и со всего 1 ячейкой.
Стиль текста
Также легко задается, используя Style.Font, кстати, здесь, на 2-й строчке, мы впервые указываем диапазон так, как привыкли его видеть пользователи Excel:
Границы
Задаем стиль линии, а также ее толщину. К этому моменту от кол-ва магических чисел-параметров индексатора уже рябит в глазах, но мы уже на финишной прямой. не так ли?
График
«Ну что за отчет без графиков, верно, Карл?» — ловко подметит специалист по тестированию, и не важно, что этого не было в ТЗ а на часах уже половина 9-го.
Хотя график как сущность сам по себе сложнее таблиц и с графиками мы не работаем каждый день, EPPlus предоставляет довольно понятный API. Давайте добавим простейший график, отражающий рост капитализации:
Еще, может понадобиться защитить страницу от редактирования:
На этом все, репозиторий с рабочим приложением находится здесь.
Заключение
Во-первых, прежде всего, о том, что мы успешно справились с задачей, а именно, сгенерировали свой первый Excel отчет, поработали со стилями и даже решили пару попутных проблем.
Во-вторых, возможно имеет смысл искать новою работу, но, забегая вперед, я бы с этим не спешил. Если данная публикация наберет 1+ просмотров, то во второй части мы поговорим о том, как можно отделить стилизацию от логики заполнения данными, упростить манипуляции над ячейками и в целом сделаем код боле поддерживаемым.
Источник
Загрузка данных из Microsoft Excel в DataGridView: Справочник по C#
- Пример №1 – получение данных с использованием библиотеки объектов «Microsoft Excel 14.0»;
- Пример №2 – получение данных с использованием класса «OleDbConnection»;
- Пример №3 – получение данных с использованием библиотеки «Excel Data Reader – Read Excel files in .Net»;
- Пример №4 – получение данных из буфера обмена используется класс «Clipboard»;
- Пример №5 – ручной ввод;
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на форму три компонента:
- textBox1 — в данном компоненте будет выводится путь, имя и расширение выбранного файла;
Выберете компонент «dataGridView1» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».
- Dock – None – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления. http://msdn.microsoft.com
- Anchor — Top, Bottom, Left, Right — свойство задает границы контейнера, с которым связан элемент управления, и определяет способ изменения его при изменении размеров его родительского элемента. http://msdn.microsoft.com
Пример №1
В данном примере рассмотрено использование функций приложения Microsoft Office Excel из пакета Microsoft Office, c использованием библиотеки объектов Microsoft Excel 14. Данная библиотека позволяет управляемому коду взаимодействовать с объектной моделью приложения Microsoft Office, основанной на модели COM. Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click».
Перейдите в «Обозреватель решений» и найдите группу «References» которая содержит все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
- Сборки — список всех компонентов платформы .NET Framework, ссылки на которые можно добавить.
- Решение — список всех повторно используемых компонентов, созданных в локальных проектах.
- COM — список всех COM-компонентов, ссылки на которые можно добавить.
- Обзор — позволяет осуществлять поиск компонента в файловой системе.
Выберете группу «COM» и ее подгруппу «Библиотеки типов». В центральной части окна вам будет предложен список доступных библиотек для подключения к вашему проекту. Найдите в списке библиотеку «Microsoft Excel 14.0 Object Library» и поставьте галочку рядом с именем данной библиотеки. В нижней части окна нажмите кнопку «ОК».
После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:
- Microsoft.Office.Core;
- Microsoft.Office.Interop.Excel;
- VBIDE.
Для работы с добавленными ссылками необходимо добавить следующие пространства имен с использованием директивы «using»:
- using System.Reflection; — указывается ссылка на использование типов в пространстве имен «System.Reflection», при этом уточнение использования типа в этом пространстве имен не требуется;
- using ExcelObj = Microsoft.Office.Interop.Excel; — создается псевдоним пространства имен «Microsoft.Office.Interop.Excel».
В данном примере для открытия файла используется класс «OpenFileDialog», реализующий открытие окна для выбора файла по заданному фильтру «Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx». Данный фильтр так же реализует защиту от выбора файла не относящегося к Excel.
После выбора файла создается новый объект «Application» или приложение «Excel», которое может содержать одну или более книг, ссылки на которые содержит свойство «Workbooks». Книги — объекты «Workbook», могут содержать одну или более страниц, ссылки на которые содержит свойство «Worksheets». Страницы – «Worksheet», могут содержать объекты ячейки или группы ячеек, ссылки на которые становятся доступными через объект «Range». Полученные данные из файла будут заноситься в таблицу «dt», созданную с использованием класса «DataTable».
В коде присутствует проверка, что пользователь действительно выбрал файл, если данное условие выполнено, в текстовое поле с помощью свойства «FileName», класса «OpenFileDialog» помещается путь, имя и расширение выбранного файла в элемент управления «textBox1».
Для открытия существующего документа используется метод «Open» из набора «Excel.Workbooks», в качестве основного параметра указывается путь к файлу, остальные параметры остаются пустыми.
Полный список параметров метода «Open» приведен в таблице ниже.
Имя параметра | Описание |
---|---|
FileNamee | Имя открываемого файла |
UpdateLinks | Способ обновления ссылок в файле |
ReadOnly | При значении true открытие только для чтения |
Format | Определение формата символа разделителя |
Password | Пароль доступа к файлу (до 15 символов) |
WriteResPassword | Пароль на сохранение файла |
IgnoreReadOnlyRecommended | При значении true отключается вывод запроса на работу без внесения изменений |
Origin | Тип текстового файла |
Delimiter | Разделитель при Format = 6 |
Editable | Используется только для надстроек Excel 4.0 |
Notify | При значении true имя файла добавляется в список нотификации файлов |
Converter | Используется для передачи индекса конвертера файла используемого для открытия файла |
AddToMRU | При true имя файла добавляется в список открытых файлов |
Local | — |
CorruptLoad | — |
Для доступа к листу из книги «Workbook», используется метод «Sheets.get_Item» с указанием номера листа. Нумерация листов начинается с 1.
Чтобы получить объект Microsoft.Office.Interop.Excel.Range, который представляет все ячейки, содержащие значение на данный момент, используется свойство станицы «Worksheet.UsedRange».
После получения объекта «Range», с помощью цикла «For» загружается первая строка из таблицы и каждое значение устанавливается в качестве имени колонки таблицы.
Далее таким же способом загружаются все оставшиеся строки с добавлением в таблицу.
По завершении загрузки данных с указанного листа, сформированная таблица «dt» подключается к элементу управления «dataGridView1». Так же открытый объект «Application» или приложение «Excel» закрывается.
Полный листинг рассмотренного кода, приведен ниже, добавьте его в метод «button1_Click» компонента «button1».
Пример №2
Данный пример в качестве механизма получения данных использует класс «OleDbConnection», который предоставляет открытое подключение к источнику данных. При подключении необходимо указать строку специальную строку с несколькими параметрами:
- Provider=Microsoft.ACE.OLEDB.12.0 – имя поставщика OLE DB;
- Data Source=ofd.FileName – путь к источнику данных полученный при выборе файла в диалоговом окне;
- Extended Properties=’Excel 12.0 XML’ – параметр расширенного подключения;
- HDR = YES — указывает, что первая строка содержит имена столбцов, а не данные. Значение «NO» свидетельствует, что лист не содержит заголовков столбцов.
Драйвер Excel считывает определенное количество строк (по умолчанию 8 строк) в указанный источник для определения типа данных каждого столбца. Если столбец содержит смешанные типы данных, особенно если числовые данные смешаны с текстовыми данными, драйвер принимает решение в пользу того типа данных, которого больше, и возвращает значения NULL в ячейки, содержащие данные другого типа. (В случае равенства преимущество получает числовой тип.) Большинство параметров форматирования ячеек в листе Excel не затрагивает это определение типа данных. Можно изменить поведение драйвера Excel, указав режим импорта. Чтобы указать режим импорта, необходимо добавить параметр IMEX=1 к значению расширенных свойств в строке соединения. В этом состоянии драйвер принудительно преобразовывает смешанные данные в текст. После составления строки подключения, устанавливается соединение с указанным файлом через класс «OleDbConnection»
При успешном подключении к источнику данных Excel с помощью «Microsoft ADO.NET», создаётся расположенный в памяти кэш данных, с использованием класса «DataSet». Далее извлекается список таблиц метаданных с помощью метода «GetOleDbSchemaTable».
После получения таблицы с листами, получаем название первого листа, для создания sql запроса к файлу. Изменяя значение «Rows», вы изменяете, номер листа в книге, к которому будет выполнен запрос.
Далее при помощи класса «OleDbDataAdapter» и его метода «Fill» данные загружаются в Dataset – «ds».
Полный листинг примера приведен ниже.
Пример №3
Для работы с документами также можно воспользоваться библиотеками сторонних производителей. Для примера рассмотрим библиотеку «Excel Data Reader – Read Excel files in .Net». Данный компонент вы можете скачать как с нашего сайта Rusfolder.net, так и с сайта производителя Codeplex.com.
Скачайте данный компонент и перейдите в обозреватель решений. Найдите группу «References», в которой содержатся все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
Выберете группу «Обзор», данная группа позволяет вам осуществить поиск компонента в файловой системе. Нажмите на кнопку «Обзор…», расположенную в нижней части окна менеджера ссылок.
У вас откроется окно с заголовком «Выберете файлы, на которые нужно установить ссылки», перейдите в директорию со скачанными библиотеками. Данные библиотеки находятся в архиве «WinRar», распакуйте его. В папке с распакованным архивом вы увидите две директории:
- Net20 — директория содержит библиотеки необходимые при работе с .Net Framework версии от 2.0 до 4.0;
- Net45 – директория содержит библиотеки необходимые при работе с .Net Framework версии 4.5.
При создании данного проекта был выбран .Net Framework версии 3.5, поэтому переходим в директорию «Net20» и выбираем две библиотеки расположенные в ней, это «Excel.dll» и «ICSharpCode.SharpZipLib.dll». После выбора данных библиотек, нажмите на кнопку «Добавить» расположенную в нижней части данного окна.
После добавления библиотек, вы увидите их название, и путь к ним в центральной части окна менеджера ссылок. Так же напротив каждой из них будет установлена галочка, это означает, что в проект будут добавлены ссылки на обе библиотеки. В левой части окна будет выведено описание библиотек, это «Имя», «Автор» и «Версия файла». Нажмите на кнопку «ОК», расположенную в нижней части окна менеджера.
После добавления ссылок на библиотеки, у вас появится два новых пункта в обозревателе решений.
Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму элемент управления «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button3_Click», события компонента «Click». Добавьте приведенный ниже листинг в тело данного метода.
В данном примере рассмотрен листинг реализующий вставку данных скопированных в буфер обмена из файла Excel. Для получения данных из буфера обмена используется класс «Clipboard» с использованием его метода «GetDataObject», который извлекает данные находящиеся в данный момент, в системном буфере обмена. Во избежание ошибок с форматом получаемых данных, используется интерфейс «IDataObject», который предоставляет не зависящий от формата, механизм передачи данных.
Более подробно ознакомиться с классом «Clipboard», вы можете на сайте Microsoft MSDN.
Так как в буфере обмена, все данные содержаться в виде одной строки и их необходимо разбить на массив данных.
Данную задачу решает метод «String.Split». Метод возвращает строковый массив, содержащий подстроки разделенные элементами «r» — возврат каретки и «n» — перевод строки.
Полученный массив строк содержит «t» — знак горизонтальной табуляции, который разделят значения ячеек. Для добавления столбцов с заголовками (если такая строка скопирована в буфер обмена), необходимо взять из массива первый элемент и с использованием метода «String.Split» разбить на новый массив, указав в качестве элемента разделения знак горизонтальной табуляции — «t».
Далее необходимо с помощью цикла «foreach» пройти по всему массиву и добавить новые колонки с указанием в качестве имени полученное значение.
После получения всех данных из буфера обмена и заполнения таблицы «dt», она устанавливается в качестве источника данных элементу управления «dataGridView1». Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму компонент «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button4_Click», события компонента «Click». Добавьте приведенный ниже полный листинг в тело данного метода.
Пример №5
Добавление данных вручную.
В первых трех примерах присутствует строка закрытия подключения к выбранному файлу. Например:
Данные строки кода необходимы для завершения процесса «EXCEL.EXE», каждый раз запускающегося при подключении к выбранному файлу. При отсутствии данного кода, количество процессов с каждым открытым файлом будет возрастать, что может привести к сбоям в работе операционной системы.
Вы так же можете самостоятельно рассмотреть и другие компоненты по работе с файлами Microsoft Excel, например библиотеки от «GemBoxSoftware».
Ссылка для скачивания примера: Яндекс.Диск
Ссылка для скачивания библиотеки Excel Data Reader: Яндекс.Диск
Источник
I am trying to convert some VBA code to C#. I am new to C#. Currently I am trying to open an Excel file from a folder and if it does not exist then create it. I am trying something like the following. How can I make it work?
Excel.Application objexcel;
Excel.Workbook wbexcel;
bool wbexists;
Excel.Worksheet objsht;
Excel.Range objrange;
objexcel = new Excel.Application();
if (Directory("C:\csharp\error report1.xls") = "")
{
wbexcel.NewSheet();
}
else
{
wbexcel.Open("C:\csharp\error report1.xls");
objsht = ("sheet1");
}
objsht.Activate();
abatishchev
97.3k85 gold badges297 silver badges432 bronze badges
asked Jan 21, 2009 at 11:25
4
You need to have installed Microsoft Visual Studio Tools for Office (VSTO).
VSTO can be selected in the Visual Studio installer under Workloads > Web & Cloud > Office/SharePoint Development.
After that create a generic .NET project and add a reference to Microsoft.Office.Interop.Excel
via ‘Add Reference… > Assemblies’ dialog.
Application excel = new Application();
Workbook wb = excel.Workbooks.Open(path);
Missing.Value
is a special reflection struct for unnecessary parameters replacement
In newer versions, the assembly reference required is called Microsoft Excel 16.0 Object Library
. If you do not have the latest version installed you might have Microsoft Excel 15.0 Object Library
, or an older version, but it is the same process to include.
answered Jan 21, 2009 at 15:07
abatishchevabatishchev
97.3k85 gold badges297 silver badges432 bronze badges
13
FileInfo fi = new FileInfo("C:\test\report.xlsx");
if(fi.Exists)
{
System.Diagnostics.Process.Start(@"C:testreport.xlsx");
}
else
{
//file doesn't exist
}
answered Oct 18, 2011 at 21:49
MennanMennan
4,42112 gold badges53 silver badges86 bronze badges
4
private void btnChoose2_Click(object sender, EventArgs e)
{
OpenFileDialog openfileDialog1 = new OpenFileDialog();
if (openfileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
this.btnChoose2.Text = openfileDialog1.FileName;
String filename = DialogResult.ToString();
var excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.Workbooks.Open(btnChoose2.Text);
}
}
LarsTech
80.3k14 gold badges151 silver badges222 bronze badges
answered Jan 28, 2014 at 17:45
FlaneFlane
1111 silver badge3 bronze badges
1
Imports
using Excel= Microsoft.Office.Interop.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
Here is the code to open an excel sheet using C#.
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wbv = excel.Workbooks.Open("C:\YourExcelSheet.xlsx");
Microsoft.Office.Interop.Excel.Worksheet wx = excel.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;
wbv.Close(true, Type.Missing, Type.Missing);
excel.Quit();
Here is a video mate on how to open an excel worksheet using C# https://www.youtube.com/watch?v=O5Dnv0tfGv4
answered Aug 20, 2016 at 0:39
0
For opening a file, try this:
objexcel.Workbooks.Open(@"C:YourPathYourExcelFile.xls",
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing,missing, missing);
You must supply those stupid looking ‘missing’ arguments. If you were writing the same code in VB.Net you wouldn’t have needed them, but you can’t avoid them in C#.
answered Jan 21, 2009 at 11:39
2
you should open like this
Excel.Application xlApp ;
Excel.Workbook xlWorkBook ;
Excel.Worksheet xlWorkSheet ;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Open("csharp.net-informations.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
source : http://csharp.net-informations.com/excel/csharp-open-excel.htm
ruden
answered Apr 17, 2013 at 6:23
0
It’s easier to help you if you say what’s wrong as well, or what fails when you run it.
But from a quick glance you’ve confused a few things.
The following doesn’t work because of a couple of issues.
if (Directory("C:\csharp\error report1.xls") = "")
What you are trying to do is creating a new Directory object that should point to a file and then check if there was any errors.
What you are actually doing is trying to call a function named Directory() and then assign a string to the result. This won’t work since 1/ you don’t have a function named Directory(string str) and you cannot assign to the result from a function (you can only assign a value to a variable).
What you should do (for this line at least) is the following
FileInfo fi = new FileInfo("C:\csharp\error report1.xls");
if(!fi.Exists)
{
// Create the xl file here
}
else
{
// Open file here
}
As to why the Excel code doesn’t work, you have to check the documentation for the Excel library which google should be able to provide for you.
answered Jan 21, 2009 at 14:57
Mats FredrikssonMats Fredriksson
19.6k6 gold badges36 silver badges57 bronze badges
Microsoft.Office.Interop.Excel.Application excapp;
excapp = new Microsoft.Office.Interop.Excel.Application();
object misval=System.Reflection.Missing.Value;
Workbook wrkbuk = new Workbook();
Worksheet wrksht = new Worksheet();
wrkbuk = excapp.Workbooks._Open(@"C:Users......_template_v1.0.xlsx", misval, misval,
misval, misval, misval, misval, misval, misval, misval, misval, misval, misval);
wrksht = (Microsoft.Office.Interop.Excel.Worksheet)wrkbuk.Worksheets.get_Item(2);
RememberME
2,0823 gold badges37 silver badges62 bronze badges
answered Jul 15, 2011 at 10:50
Is this a commercial application or some hobbyist / open source software?
I’m asking this because in my experience, all free .NET Excel handling alternatives have serious problems, for different reasons. For hobbyist things, I usually end up porting jExcelApi from Java to C# and using it.
But if this is a commercial application, you would be better off by purchasing a third party library, like Aspose.Cells. Believe me, it totally worths it as it saves a lot of time and time ain’t free.
answered Jan 21, 2009 at 15:29
Tamas CzinegeTamas Czinege
118k40 gold badges148 silver badges175 bronze badges
Code :
private void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled=false;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excell File |*.xlsx;*,xlsx";
if (ofd.ShowDialog() == DialogResult.OK)
{
string extn = Path.GetExtension(ofd.FileName);
if (extn.Equals(".xls") || extn.Equals(".xlsx"))
{
filename = ofd.FileName;
if (filename != "")
{
try
{
string excelfilename = Path.GetFileName(filename);
}
catch (Exception ew)
{
MessageBox.Show("Errror:" + ew.ToString());
}
}
}
}
answered Jan 12, 2015 at 6:54
For editing Excel files from within a C# application, I recently started using NPOI.
I’m very satisfied with it.
answered Apr 4, 2012 at 15:06
bvgheluwebvgheluwe
8537 silver badges25 bronze badges
Все привет, в этой статье опишу исчерпывающие примеры работы с excel на языке C#.
Для начала работы нам необходимо подключить библиотеку COM как на рисунке ниже:
Для этого добавляем ссылку в проект, надеюсь вы знаете как это делается) Выбираем пункт COM ищем библиотеку Microsoft Excel 16.0 Object Library ставим галочку и жмем Ок.
Далее нам не обходимо для сокращения записи и удобства создать алиас.
using Excel = Microsoft.Office.Interop.Excel; |
Теперь нам нужно объявить объект Excel задать параметры и приступать к работе.
//Объявляем приложение Excel.Application app = new Excel.Application { //Отобразить Excel Visible = true, //Количество листов в рабочей книге SheetsInNewWorkbook = 2 }; //Добавить рабочую книгу Excel.Workbook workBook = app.Workbooks.Add(Type.Missing); //Отключить отображение окон с сообщениями app.DisplayAlerts = false; //Получаем первый лист документа (счет начинается с 1) Excel.Worksheet sheet = (Excel.Worksheet)app.Worksheets.get_Item(1); //Название листа (вкладки снизу) sheet.Name = «Имя должно быть не больше 32сим»; |
Пример заполнения ячейки:
//Пример заполнения ячеек №1 for (int i = 1; i <= 9; i++) { for (int j = 1; j < 9; j++) sheet.Cells[i, j] = String.Format(«nookery {0} {1}», i, j); } //Пример №2 sheet.Range[«A1»].Value = «Пример №2»; //Пример №3 sheet.get_Range(«A2»).Value2 = «Пример №3»; |
Захват диапазона ячеек:
//Захватываем диапазон ячеек Вариант №1 Excel.Range r1 = sheet.Cells[1, 1]; Excel.Range r2 = sheet.Cells[9, 9]; Excel.Range range1 = sheet.get_Range(r1, r2); //Захватываем диапазон ячеек Вариант №2 Excel.Range range2 = sheet.get_Range(«A1»,«H9» ); |
Оформление, шрифт, размер, цвет, толщина.
//Шрифт для диапазона range.Cells.Font.Name = «Tahoma»; range2.Cells.Font.Name = «Times New Roman»; //Размер шрифта для диапазона range.Cells.Font.Size = 10; //Жирный текст range.Font.Bold = true; //Цвет текста range.Font.Color = ColorTranslator.ToOle(Color.Blue); |
Объединение ячеек в одну
//Объединение ячеек с F2 по K2 Excel.Range range3 = sheet.get_Range(«F2», «K2»); range3.Merge(Type.Missing); |
Изменяем размеры ячеек по ширине и высоте
//увеличиваем размер по ширине диапазон ячеек Excel.Range range2 = sheet.get_Range(«D1», «S1»); range2.EntireColumn.ColumnWidth = 10; //увеличиваем размер по высоте диапазон ячеек Excel.Range rowHeight = sheet.get_Range(«A4», «S4»); rowHeight.EntireRow.RowHeight = 50;range.EntireColumn.AutoFit();range.EntireColumn.AutoFit(); //авторазмер |
Создаем обводку диапазона ячеек
Excel.Range r1 = sheet.Cells[countRow, 2]; Excel.Range r2 = sheet.Cells[countRow, 19]; Excel.Range rangeColor = sheet.get_Range(r1, r2); rangeColor.Borders.Color = ColorTranslator.ToOle(Color.Black); |
Производим выравнивания содержимого диапазона ячеек.
Excel.Range r = sheet.get_Range(«A1», «S40»); //Оформления r.Font.Name = «Calibri»; r.Cells.Font.Size = 10; r.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; r.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; |
Примеры вычисления формул, все вставки формул были скопированы из самой Excel без изменений. Позиция ячейки взята из счетчика переменно и подставлен к букве ячейки
sheet.Cells[countRow, countColumn] = $«=G{countRow}-F{countRow}»; sheet.Cells[countRow, countColumn].FormulaLocal = $«=ЕСЛИ((H{countRow}*O{countRow})+(I{countRow}*P{countRow})/100<=0;J{countRow}*O{countRow}/100;((H{countRow}*O{countRow})+(I{countRow}*P{countRow}))/100)»; sheet.Cells[countRow, countColumn] = $«=K{countRow}+N{countRow}-R{countRow}»; sheet.Cells[33, 22].FormulaLocal = «=СУММ(V3:V32)»; |
Добавляем разрыв страницы.
//Ячейка, с которой будет разрыв Excel.Range razr = sheet.Cells[n, m] as Excel.Range; //Добавить горизонтальный разрыв (sheet — текущий лист) sheet.HPageBreaks.Add(razr); //VPageBreaks — Добавить вертикальный разрыв |
Как открыть фаил Excel
app.Workbooks.Open(@»C:UsersUserDocumentsExcel.xlsx», Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); |
Сохраняем документ Excel
app.Application.ActiveWorkbook.SaveAs(«MyFile.xlsx», Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); |
Завершение работы с объектом Excel.Application
app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); |
Пример как выбрать фаил и загрузив его и узнать количество заполненных строк и колонок в одном конкретном листе по имени.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//поиск файла Excel OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect =false; ofd.DefaultExt = «*.xls;*.xlsx»; ofd.Filter = «Microsoft Excel (*.xls*)|*.xls*»; ofd.Title = «Выберите документ Excel»; if (ofd.ShowDialog() != DialogResult.OK) { MessageBox.Show(«Вы не выбрали файл для открытия», «Внимание», MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string xlFileName = ofd.FileName; //имя нашего Excel файла //рабоата с Excel Excel.Range Rng; Excel.Workbook xlWB; Excel.Worksheet xlSht; int iLastRow, iLastCol; Excel.Application xlApp = new Excel.Application(); //создаём приложение Excel xlWB = xlApp.Workbooks.Open(xlFileName); //открываем наш файл xlSht = xlWB.Worksheets[«Лист1»]; //или так xlSht = xlWB.ActiveSheet //активный лист iLastRow = xlSht.Cells[xlSht.Rows.Count, «A»].End[Excel.XlDirection.xlUp].Row; //последняя заполненная строка в столбце А iLastCol = xlSht.Cells[1, xlSht.Columns.Count].End[Excel.XlDirection.xlToLeft].Column; //последний заполненный столбец в 1-й строке |
Получаем список всех загруженных книг «листов» из файла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//поиск файла Excel OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = false; ofd.DefaultExt = «*.xls;*.xlsx»; ofd.Filter = «Microsoft Excel (*.xls*)|*.xls*»; ofd.Title = «Выберите документ Excel»; if (ofd.ShowDialog() != DialogResult.OK) { MessageBox.Show(«Вы не выбрали файл для открытия», «Внимание», MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string xlFileName = ofd.FileName; //имя нашего Excel файла Excel.Workbook xlWB = ex.Workbooks.Open(xlFileName); ///загружаем список всех книг foreach (object item in xlWB.Sheets) { Excel.Worksheet sheet = (Excel.Worksheet)item; } |
В данной инструкции рассмотрены 5ть примеров реализации получения данных из файла Microsoft Excel 2003-2007.
- Пример №1 – получение данных с использованием библиотеки объектов «Microsoft Excel 14.0»;
- Пример №2 – получение данных с использованием класса «OleDbConnection»;
- Пример №3 – получение данных с использованием библиотеки «Excel Data Reader – Read Excel files in .Net»;
- Пример №4 – получение данных из буфера обмена используется класс «Clipboard»;
- Пример №5 – ручной ввод;
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на форму три компонента:
- textBox1 — в данном компоненте будет выводится путь, имя и расширение выбранного файла;
- button1 – кнопка для запуска процесса получения данных из выбранного файла;
- dataGridView1 – элемент управления необходимый для отображения полученных данных.
Выберете компонент «dataGridView1» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».
Установите следующие параметры в свойствах компонента:
- Dock – None – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления. http://msdn.microsoft.com
- Anchor — Top, Bottom, Left, Right — свойство задает границы контейнера, с которым связан элемент управления, и определяет способ изменения его при изменении размеров его родительского элемента. http://msdn.microsoft.com
Пример №1
В данном примере рассмотрено использование функций приложения Microsoft Office Excel из пакета Microsoft Office, c использованием библиотеки объектов Microsoft Excel 14. Данная библиотека позволяет управляемому коду взаимодействовать с объектной моделью приложения Microsoft Office, основанной на модели COM. Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click».
Перейдите в «Обозреватель решений» и найдите группу «References» которая содержит все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
- Сборки — список всех компонентов платформы .NET Framework, ссылки на которые можно добавить.
- Решение — список всех повторно используемых компонентов, созданных в локальных проектах.
- COM — список всех COM-компонентов, ссылки на которые можно добавить.
- Обзор — позволяет осуществлять поиск компонента в файловой системе.
Выберете группу «COM» и ее подгруппу «Библиотеки типов». В центральной части окна вам будет предложен список доступных библиотек для подключения к вашему проекту. Найдите в списке библиотеку «Microsoft Excel 14.0 Object Library» и поставьте галочку рядом с именем данной библиотеки. В нижней части окна нажмите кнопку «ОК».
После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:
- Microsoft.Office.Core;
- Microsoft.Office.Interop.Excel;
- VBIDE.
Для работы с добавленными ссылками необходимо добавить следующие пространства имен с использованием директивы «using»:
- using System.Reflection; — указывается ссылка на использование типов в пространстве имен «System.Reflection», при этом уточнение использования типа в этом пространстве имен не требуется;
- using ExcelObj = Microsoft.Office.Interop.Excel; — создается псевдоним пространства имен «Microsoft.Office.Interop.Excel».
В данном примере для открытия файла используется класс «OpenFileDialog», реализующий открытие окна для выбора файла по заданному фильтру «Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx». Данный фильтр так же реализует защиту от выбора файла не относящегося к Excel.
OpenFileDialog ofd = new OpenFileDialog(); //Задаем расширение имени файла по умолчанию. ofd.DefaultExt = "*.xls;*.xlsx"; //Задаем строку фильтра имен файлов, которая определяет //варианты, доступные в поле "Файлы типа" диалогового //окна. ofd.Filter = " Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx"; //Задаем заголовок диалогового окна. ofd.Title = "Выберите документ для загрузки данных";
После выбора файла создается новый объект «Application» или приложение «Excel», которое может содержать одну или более книг, ссылки на которые содержит свойство «Workbooks». Книги — объекты «Workbook», могут содержать одну или более страниц, ссылки на которые содержит свойство «Worksheets». Страницы – «Worksheet», могут содержать объекты ячейки или группы ячеек, ссылки на которые становятся доступными через объект «Range». Полученные данные из файла будут заноситься в таблицу «dt», созданную с использованием класса «DataTable».
ExcelObj.Application app = new ExcelObj.Application(); ExcelObj.Workbook workbook; ExcelObj.Worksheet NwSheet; ExcelObj.Range ShtRange; DataTable dt = new DataTable();
В коде присутствует проверка, что пользователь действительно выбрал файл, если данное условие выполнено, в текстовое поле с помощью свойства «FileName», класса «OpenFileDialog» помещается путь, имя и расширение выбранного файла в элемент управления «textBox1».
if (ofd.ShowDialog() == DialogResult.OK) { textBox1.Text = ofd.FileName;
Для открытия существующего документа используется метод «Open» из набора «Excel.Workbooks», в качестве основного параметра указывается путь к файлу, остальные параметры остаются пустыми.
workbook = app.Workbooks.Open(ofd.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Полный список параметров метода «Open» приведен в таблице ниже.
Имя параметра | Описание |
---|---|
FileNamee | Имя открываемого файла |
UpdateLinks | Способ обновления ссылок в файле |
ReadOnly | При значении true открытие только для чтения |
Format | Определение формата символа разделителя |
Password | Пароль доступа к файлу (до 15 символов) |
WriteResPassword | Пароль на сохранение файла |
IgnoreReadOnlyRecommended | При значении true отключается вывод запроса на работу без внесения изменений |
Origin | Тип текстового файла |
Delimiter | Разделитель при Format = 6 |
Editable | Используется только для надстроек Excel 4.0 |
Notify | При значении true имя файла добавляется в список нотификации файлов |
Converter | Используется для передачи индекса конвертера файла используемого для открытия файла |
AddToMRU | При true имя файла добавляется в список открытых файлов |
Local | — |
CorruptLoad | — |
Для доступа к листу из книги «Workbook», используется метод «Sheets.get_Item» с указанием номера листа. Нумерация листов начинается с 1.
NwSheet = (ExcelObj.Worksheet)workbook.Sheets.get_Item(1);
Чтобы получить объект Microsoft.Office.Interop.Excel.Range, который представляет все ячейки, содержащие значение на данный момент, используется свойство станицы «Worksheet.UsedRange».
ShtRange = NwSheet.UsedRange;
После получения объекта «Range», с помощью цикла «For» загружается первая строка из таблицы и каждое значение устанавливается в качестве имени колонки таблицы.
for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { dt.Columns.Add( new DataColumn((ShtRange.Cells[1, Cnum] as ExcelObj.Range).Value2.ToString())); }
Далее таким же способом загружаются все оставшиеся строки с добавлением в таблицу.
for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) { DataRow dr = dt.NewRow(); for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { if ((ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2 != null) { dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2.ToString(); } } dt.Rows.Add(dr); dt.AcceptChanges(); }
По завершении загрузки данных с указанного листа, сформированная таблица «dt» подключается к элементу управления «dataGridView1». Так же открытый объект «Application» или приложение «Excel» закрывается.
dataGridView1.DataSource = dt; app.Quit();
Полный листинг рассмотренного кода, приведен ниже, добавьте его в метод «button1_Click» компонента «button1».
OpenFileDialog ofd = new OpenFileDialog(); //Задаем расширение имени файла по умолчанию. ofd.DefaultExt = "*.xls;*.xlsx"; //Задаем строку фильтра имен файлов, которая определяет //варианты, доступные в поле "Файлы типа" диалогового //окна. ofd.Filter = "Excel Sheet(*.xlsx)|*.xlsx"; //Задаем заголовок диалогового окна. ofd.Title = "Выберите документ для загрузки данных"; ExcelObj.Application app = new ExcelObj.Application(); ExcelObj.Workbook workbook; ExcelObj.Worksheet NwSheet; ExcelObj.Range ShtRange; DataTable dt = new DataTable(); if (ofd.ShowDialog() == DialogResult.OK) { textBox1.Text = ofd.FileName; workbook = app.Workbooks.Open(ofd.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); //Устанавливаем номер листа из котрого будут извлекаться данные //Листы нумеруются от 1 NwSheet = (ExcelObj.Worksheet)workbook.Sheets.get_Item(1); ShtRange = NwSheet.UsedRange; for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { dt.Columns.Add( new DataColumn((ShtRange.Cells[1, Cnum] as ExcelObj.Range).Value2.ToString())); } dt.AcceptChanges(); string[] columnNames = new String[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { columnNames[0] = dt.Columns[i].ColumnName; } for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) { DataRow dr = dt.NewRow(); for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { if ((ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2 != null) { dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as ExcelObj.Range).Value2.ToString(); } } dt.Rows.Add(dr); dt.AcceptChanges(); } dataGridView1.DataSource = dt; app.Quit(); } else Application.Exit();
Пример №2
Данный пример в качестве механизма получения данных использует класс «OleDbConnection», который предоставляет открытое подключение к источнику данных. При подключении необходимо указать строку специальную строку с несколькими параметрами:
- Provider=Microsoft.ACE.OLEDB.12.0 – имя поставщика OLE DB;
- Data Source=ofd.FileName – путь к источнику данных полученный при выборе файла в диалоговом окне;
- Extended Properties=’Excel 12.0 XML’ – параметр расширенного подключения;
- HDR = YES — указывает, что первая строка содержит имена столбцов, а не данные. Значение «NO» свидетельствует, что лист не содержит заголовков столбцов.
Драйвер Excel считывает определенное количество строк (по умолчанию 8 строк) в указанный источник для определения типа данных каждого столбца. Если столбец содержит смешанные типы данных, особенно если числовые данные смешаны с текстовыми данными, драйвер принимает решение в пользу того типа данных, которого больше, и возвращает значения NULL в ячейки, содержащие данные другого типа. (В случае равенства преимущество получает числовой тип.) Большинство параметров форматирования ячеек в листе Excel не затрагивает это определение типа данных. Можно изменить поведение драйвера Excel, указав режим импорта. Чтобы указать режим импорта, необходимо добавить параметр IMEX=1 к значению расширенных свойств в строке соединения. В этом состоянии драйвер принудительно преобразовывает смешанные данные в текст. После составления строки подключения, устанавливается соединение с указанным файлом через класс «OleDbConnection»
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr); con.Open();
При успешном подключении к источнику данных Excel с помощью «Microsoft ADO.NET», создаётся расположенный в памяти кэш данных, с использованием класса «DataSet». Далее извлекается список таблиц метаданных с помощью метода «GetOleDbSchemaTable».
DataSet ds = new DataSet(); DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
После получения таблицы с листами, получаем название первого листа, для создания sql запроса к файлу. Изменяя значение «Rows», вы изменяете, номер листа в книге, к которому будет выполнен запрос.
string sheet1 = (string)schemaTable.Rows[0].ItemArray[2]; string select = String.Format("SELECT * FROM [{0}]", sheet1);
Далее при помощи класса «OleDbDataAdapter» и его метода «Fill» данные загружаются в Dataset – «ds».
System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con); ad.Fill(ds);
Полный листинг примера приведен ниже.
OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.xls;*.xlsx"; ofd.Filter = "Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx"; ofd.Title = "Выберите документ для загрузки данных"; if (ofd.ShowDialog() == DialogResult.OK) { textBox1.Text = ofd.FileName; String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ofd.FileName + ";Extended Properties='Excel 12.0 XML;HDR=YES;';"; System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr); con.Open(); DataSet ds = new DataSet(); DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); string sheet1 = (string)schemaTable.Rows[0].ItemArray[2]; string select = String.Format("SELECT * FROM [{0}]", sheet1); System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con); ad.Fill(ds); DataTable tb = ds.Tables[0]; con.Close(); dataGridView1.DataSource = tb; con.Close(); } else { MessageBox.Show("Вы не выбрали файл для открытия", "Загрузка данных...", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Пример №3
Для работы с документами также можно воспользоваться библиотеками сторонних производителей. Для примера рассмотрим библиотеку «Excel Data Reader – Read Excel files in .Net». Данный компонент вы можете скачать как с нашего сайта Rusfolder.net, так и с сайта производителя Codeplex.com.
Скачайте данный компонент и перейдите в обозреватель решений. Найдите группу «References», в которой содержатся все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
Выберете группу «Обзор», данная группа позволяет вам осуществить поиск компонента в файловой системе. Нажмите на кнопку «Обзор…», расположенную в нижней части окна менеджера ссылок.
У вас откроется окно с заголовком «Выберете файлы, на которые нужно установить ссылки», перейдите в директорию со скачанными библиотеками. Данные библиотеки находятся в архиве «WinRar», распакуйте его. В папке с распакованным архивом вы увидите две директории:
- Net20 — директория содержит библиотеки необходимые при работе с .Net Framework версии от 2.0 до 4.0;
- Net45 – директория содержит библиотеки необходимые при работе с .Net Framework версии 4.5.
При создании данного проекта был выбран .Net Framework версии 3.5, поэтому переходим в директорию «Net20» и выбираем две библиотеки расположенные в ней, это «Excel.dll» и «ICSharpCode.SharpZipLib.dll». После выбора данных библиотек, нажмите на кнопку «Добавить» расположенную в нижней части данного окна.
После добавления библиотек, вы увидите их название, и путь к ним в центральной части окна менеджера ссылок. Так же напротив каждой из них будет установлена галочка, это означает, что в проект будут добавлены ссылки на обе библиотеки. В левой части окна будет выведено описание библиотек, это «Имя», «Автор» и «Версия файла». Нажмите на кнопку «ОК», расположенную в нижней части окна менеджера.
После добавления ссылок на библиотеки, у вас появится два новых пункта в обозревателе решений.
Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму элемент управления «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button3_Click», события компонента «Click». Добавьте приведенный ниже листинг в тело данного метода.
//http://exceldatareader.codeplex.com/ OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.xls;*.xlsx"; ofd.Filter = "Excel 2003(*.xls)|*.xls|Excel 2007(*.xlsx)|*.xlsx"; ofd.Title = "Выберите документ для загрузки данных"; if (ofd.ShowDialog() == DialogResult.OK) { textBox1.Text = ofd.FileName; System.IO.FileStream stream = System.IO.File.Open(ofd.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); Excel.IExcelDataReader IEDR; int fileformat = ofd.SafeFileName.IndexOf(".xlsx"); if (fileformat > -1) { //2007 format *.xlsx IEDR = Excel.ExcelReaderFactory.CreateOpenXmlReader(stream); } else { //97-2003 format *.xls IEDR = Excel.ExcelReaderFactory.CreateBinaryReader(stream); } //Если данное значение установлено в true //то первая строка используется в качестве //заголовков для колонок IEDR.IsFirstRowAsColumnNames = true; DataSet ds = IEDR.AsDataSet(); //Устанавливаем в качестве источника данных dataset //с указанием номера таблицы. Номер таблицы указавает //на соответствующий лист в файле нумерация листов //начинается с нуля. dataGridView1.DataSource = ds.Tables[0]; IEDR.Close(); } else { MessageBox.Show("Вы не выбрали файл для открытия", "Загрузка данных...", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Пример № 4
В данном примере рассмотрен листинг реализующий вставку данных скопированных в буфер обмена из файла Excel. Для получения данных из буфера обмена используется класс «Clipboard» с использованием его метода «GetDataObject», который извлекает данные находящиеся в данный момент, в системном буфере обмена. Во избежание ошибок с форматом получаемых данных, используется интерфейс «IDataObject», который предоставляет не зависящий от формата, механизм передачи данных.
IDataObject dataInClipboard = Clipboard.GetDataObject(); string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);
Более подробно ознакомиться с классом «Clipboard», вы можете на сайте Microsoft MSDN.
Так как в буфере обмена, все данные содержаться в виде одной строки и их необходимо разбить на массив данных.
Данную задачу решает метод «String.Split». Метод возвращает строковый массив, содержащий подстроки разделенные элементами «r» — возврат каретки и «n» — перевод строки.
char[] rowSplitter = { 'r', 'n' }; string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries);
Полученный массив строк содержит «t» — знак горизонтальной табуляции, который разделят значения ячеек. Для добавления столбцов с заголовками (если такая строка скопирована в буфер обмена), необходимо взять из массива первый элемент и с использованием метода «String.Split» разбить на новый массив, указав в качестве элемента разделения знак горизонтальной табуляции — «t».
Далее необходимо с помощью цикла «foreach» пройти по всему массиву и добавить новые колонки с указанием в качестве имени полученное значение.
string[] words = rowsInClipboard[0].Split('t'); foreach (string word in words) { dt.Columns.Add(word); } По такому же принципу происходит добавление строк в таблицу. for (int i = 2; i <= rowsInClipboard.Length; i++) { string[] rows = rowsInClipboard[i - 1].Split('t'); dt.Rows.Add(rows); }
После получения всех данных из буфера обмена и заполнения таблицы «dt», она устанавливается в качестве источника данных элементу управления «dataGridView1». Перейдите в конструктор формы, нажав сочетание клавиш «Shift+F7». Добавьте на форму компонент «Button» из панели элементов и сделайте двойной клик левой клавишей мыши по нему. Вы перейдете в автоматически созданный метод «button4_Click», события компонента «Click». Добавьте приведенный ниже полный листинг в тело данного метода.
//Переменная указывающая, использовать ли //первую строку, в качестве заголовков для //столбцов. bool IsFirstRowAsColumnNames = true; IDataObject dataInClipboard = Clipboard.GetDataObject(); string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text); char[] rowSplitter = { 'r', 'n' }; string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries); DataTable dt = new DataTable(); if (IsFirstRowAsColumnNames) { //В данном случае берется первая строка //и разделятся на отдельные части с помощью //класса Split. Данные помещаются в массив //после чего, циклом forech добавляются //заголовки столбцов string[] words = rowsInClipboard[0].Split('t'); foreach (string word in words) { dt.Columns.Add(word); } for (int i = 2; i <= rowsInClipboard.Length; i++) { string[] rows = rowsInClipboard[i - 1].Split('t'); dt.Rows.Add(rows); } } else { //Если в скопированных данных отсутствуют //заголовки для столбцов, то // автоматически пронумеровать их for (int colc = 1; colc <= rowsInClipboard[0].Split('t').Length; colc++) { dt.Columns.Add("Столбец " + colc); } for (int i = 1; i <= rowsInClipboard.Length; i++) { string[] rows = rowsInClipboard[i - 1].Split('t'); dt.Rows.Add(rows); } } dataGridView1.DataSource = dt;
Пример №5
Добавление данных вручную.
В первых трех примерах присутствует строка закрытия подключения к выбранному файлу. Например:
IEDR.Close(); con.Close(); app.Quit();
Данные строки кода необходимы для завершения процесса «EXCEL.EXE», каждый раз запускающегося при подключении к выбранному файлу. При отсутствии данного кода, количество процессов с каждым открытым файлом будет возрастать, что может привести к сбоям в работе операционной системы.
Вы так же можете самостоятельно рассмотреть и другие компоненты по работе с файлами Microsoft Excel, например библиотеки от «GemBoxSoftware».
Ссылка для скачивания библиотеки Excel Data Reader: Яндекс.Диск
Introduction
This is a test application which tells how to use the Microsoft Excel 10.0 Object Library to load/read Excel content.
Note: Here I have created a test.xls file which will be copied to c: before running the application.
The application is a Console Application developed using VC#.
Steps
- Include the following references to the project:
- Microsoft Excel 10.0 Object Library
- Microsoft Office 10.0 Object Library
- Include the required namespace:
using Excel;
. - Create the objects
ExcelApplicationClass
,WorkBook
, andRange
.
Here is the complete code:
using System; using Excel; namespace TestExcel { class ExcelApplication { [STAThread] static void Main(string[] args) { string Path = @"c:test.xls"; Excel.ApplicationClass app = new ApplicationClass(); Excel.Workbook workBook = app.Workbooks.Open(Path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0); Excel.Worksheet workSheet = (Excel.Worksheet)workBook.ActiveSheet; int index = 0; object rowIndex = 2; object colIndex1 = 1; object colIndex2 = 2; try { while ( ((Excel.Range)workSheet.Cells[rowIndex,colIndex1]).Value2 != null ) { rowIndex = 2+index; string firstName = ((Excel.Range)workSheet.Cells[rowIndex,colIndex1]).Value2.ToString(); string lastName = ((Excel.Range)workSheet.Cells[rowIndex,colIndex2]).Value2.ToString(); Console.WriteLine("Name : {0},{1} ",firstName,lastName); index++; } } catch(Exception ex) { app.Quit(); Console.WriteLine(ex.Message); } } } }
This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.