Полезные макросы Excel для автоматизации рутинной работы с примерами применения для разных задач.
Примеры макросов для автоматизации работы
Макросы для фильтра сводной таблицы в Excel.
Как автоматизировать фильтр в сводных таблицах с помощью макроса? Исходные коды макросов для фильтрации и скрытия столбцов в сводной таблице.
Макрос для создания сводной таблицы в Excel.
Как автоматически сгенерировать сводную таблицу с помощью макроса? Исходный код VBA для создания и настройки сводных таблиц на основе исходных данных.
Макросы для изменения формата ячеек в таблице Excel.
Как форматировать ячейки таблицы макросом? Изменение цвета шрифта, заливки и линий границ, выравнивание. Автоматическая настройка ширины столбцов и высоты строк по содержимому с помощью VBA-макроса.
Макрос для копирования и переименования листов Excel.
Как одновременно копировать и переименовывать большое количество листов одним кликом мышкой? Исходный код макроса, который умеет одновременно скопировать и переименовать любое количество листов.
Время на прочтение
5 мин
Количество просмотров 63K
Excel — это чрезвычайно распространённый инструмент для анализа данных. С ним легко научиться работать, есть он практически на каждом компьютере, а тот, кто его освоил, может с его помощью решать довольно сложные задачи. Python часто считают инструментом, возможности которого практически безграничны, но который освоить сложнее, чем Excel. Автор материала, перевод которого мы сегодня публикуем, хочет рассказать о решении с помощью Python трёх задач, которые обычно решают в Excel. Эта статья представляет собой нечто вроде введения в Python для тех, кто хорошо знает Excel.
Загрузка данных
Начнём с импорта Python-библиотеки pandas
и с загрузки в датафреймы данных, которые хранятся на листах sales
и states
книги Excel. Такие же имена мы дадим и соответствующим датафреймам.
import pandas as pd
sales = pd.read_excel('https://github.com/datagy/mediumdata/raw/master/pythonexcel.xlsx', sheet_name = 'sales')
states = pd.read_excel('https://github.com/datagy/mediumdata/raw/master/pythonexcel.xlsx', sheet_name = 'states')
Теперь воспользуемся методом .head()
датафрейма sales
для того чтобы вывести элементы, находящиеся в начале датафрейма:
print(sales.head())
Сравним то, что будет выведено, с тем, что можно видеть в Excel.
Сравнение внешнего вида данных, выводимых в Excel, с внешним видом данных, выводимых из датафрейма pandas
Тут можно видеть, что результаты визуализации данных из датафрейма очень похожи на то, что можно видеть в Excel. Но тут имеются и некоторые очень важные различия:
- Нумерация строк в Excel начинается с 1, а в pandas номер (индекс) первой строки равняется 0.
- В Excel столбцы имеют буквенные обозначения, начинающиеся с буквы
A
, а в pandas названия столбцов соответствуют именам соответствующих переменных.
Продолжим исследование возможностей pandas, позволяющих решать задачи, которые обычно решают в Excel.
Реализация возможностей Excel-функции IF в Python
В Excel существует очень удобная функция IF
, которая позволяет, например, записать что-либо в ячейку, основываясь на проверке того, что находится в другой ячейке. Предположим, нужно создать в Excel новый столбец, ячейки которого будут сообщать нам о том, превышают ли 500 значения, записанные в соответствующие ячейки столбца B
. В Excel такому столбцу (в нашем случае это столбец E
) можно назначить заголовок MoreThan500
, записав соответствующий текст в ячейку E1
. После этого, в ячейке E2
, можно ввести следующее:
=IF([@Sales]>500, "Yes", "No")
Использование функции IF в Excel
Для того чтобы сделать то же самое с использованием pandas, можно воспользоваться списковым включением (list comprehension):
sales['MoreThan500'] = ['Yes' if x > 500 else 'No' for x in sales['Sales']]
Списковые включения в Python: если текущее значение больше 500 — в список попадает Yes, в противном случае — No
Списковые включения — это отличное средство для решения подобных задач, позволяющее упростить код за счёт уменьшения потребности в сложных конструкциях вида if/else. Ту же задачу можно решить и с помощью if/else, но предложенный подход экономит время и делает код немного чище. Подробности о списковых включениях можно найти здесь.
Реализация возможностей Excel-функции VLOOKUP в Python
В нашем наборе данных, на одном из листов Excel, есть названия городов, а на другом — названия штатов и провинций. Как узнать о том, где именно находится каждый город? Для этого подходит Excel-функция VLOOKUP
, с помощью которой можно связать данные двух таблиц. Эта функция работает по принципу левого соединения, когда сохраняется каждая запись из набора данных, находящегося в левой части выражения. Применяя функцию VLOOKUP
, мы предлагаем системе выполнить поиск определённого значения в заданном столбце указанного листа, а затем — вернуть значение, которое находится на заданное число столбцов правее найденного значения. Вот как это выглядит:
=VLOOKUP([@City],states,2,false)
Зададим на листе sales
заголовок столбца F
как State
и воспользуемся функцией VLOOKUP
для того чтобы заполнить ячейки этого столбца названиями штатов и провинций, в которых расположены города.
Использование функции VLOOKUP в Excel
В Python сделать то же самое можно, воспользовавшись методом merge
из pandas. Он принимает два датафрейма и объединяет их. Для решения этой задачи нам понадобится следующий код:
sales = pd.merge(sales, states, how='left', on='City')
Разберём его:
- Первый аргумент метода
merge
— это исходный датафрейм. - Второй аргумент — это датафрейм, в котором мы ищем значения.
- Аргумент
how
указывает на то, как именно мы хотим соединить данные. - Аргумент
on
указывает на переменную, по которой нужно выполнить соединение (тут ещё можно использовать аргументыleft_on
иright_on
, нужные в том случае, если интересующие нас данные в разных датафреймах названы по-разному).
Сводные таблицы
Сводные таблицы (Pivot Tables) — это одна из самых мощных возможностей Excel. Такие таблицы позволяют очень быстро извлекать ценные сведения из больших наборов данных. Создадим в Excel сводную таблицу, выводящую сведения о суммарных продажах по каждому городу.
Создание сводной таблицы в Excel
Как видите, для создания подобной таблицы достаточно перетащить поле City
в раздел Rows
, а поле Sales
— в раздел Values
. После этого Excel автоматически выведет суммарные продажи для каждого города.
Для того чтобы создать такую же сводную таблицу в pandas, нужно будет написать следующий код:
sales.pivot_table(index = 'City', values = 'Sales', aggfunc = 'sum')
Разберём его:
- Здесь мы используем метод
sales.pivot_table
, сообщая pandas о том, что мы хотим создать сводную таблицу, основанную на датафреймеsales
. - Аргумент
index
указывает на столбец, по которому мы хотим агрегировать данные. - Аргумент
values
указывает на то, какие значения мы собираемся агрегировать. - Аргумент
aggfunc
задаёт функцию, которую мы хотим использовать при обработке значений (тут ещё можно воспользоваться функциямиmean
,max
,min
и так далее).
Итоги
Из этого материала вы узнали о том, как импортировать Excel-данные в pandas, о том, как реализовать средствами Python и pandas возможности Excel-функций IF
и VLOOKUP
, а также о том, как воспроизвести средствами pandas функционал сводных таблиц Excel. Возможно, сейчас вы задаётесь вопросом о том, зачем вам пользоваться pandas, если то же самое можно сделать и в Excel. На этот вопрос нет однозначного ответа. Python позволяет создавать код, который поддаётся тонкой настройке и глубокому исследованию. Такой код можно использовать многократно. Средствами Python можно описывать очень сложные схемы анализа данных. А возможностей Excel, вероятно, достаточно лишь для менее масштабных исследований данных. Если вы до этого момента пользовались только Excel — рекомендую испытать Python и pandas, и узнать о том, что у вас из этого получится.
А какие инструменты вы используете для анализа данных?
Напоминаем, что у нас продолжается конкурс прогнозов, в котором можно выиграть новенький iPhone. Еще есть время ворваться в него, и сделать максимально точный прогноз по злободневным величинам.
Библиотека функций в Excel
Смотрите также потомственный программист по выборе способа реализацииC_sanches на лыжах мечтает…2. TMS FlexCel запаковать не получилось. в указанном вами его в dataset. мало где используется. решить вашу «проблему».: Здравствуйте, не могуВ меню Вы увидите результат. увидите, как вставитьсодержит функции для результаты для наиболееВ этом уроке мы C# функции отпал. Нужна
: а каким образомНу а по — из всех Походу руки кривые компоненте не нашелНасчет картинок не Так что остановлюсьРекомендую не использовать объявить Excel вСервис Результат показывает, что функцию из библиотеки
Как получить доступ к библиотеке
работы с датами распространенных функций Excel, познакомимся с самым, думаю на указанно именно библиотека. Желательно его встроить в поводу «будет использовать 3 испытанных на у меня.)))
функции открытия готового знаю не пробовал… на «родном» варианте
Вставить функцию
для обработки документов коде c#, таквыберите пункт доставка заказа заняла Excel, позволяющую вычислить и временем в таких как СУММ, объемным и часто
Автосумма
ресурсе и здесь, на C#. файл Excel? на разных ПК данный момент большеqwertehok шаблона.umatkot
Последние
serg4242 сам офис (эта как нужен дальнейшийСсылки 4 рабочих дня. количество рабочих дней,
Финансовые
формулах. Например, функция СРЗНАЧ, СЧЕТ, МАКС посещаемым разделом Microsoft на планете, естьbedvit, подскажите, пожалуйста,The_Prist в разных книгах» всего понравилась. Не: работаетqwertehok
Логические
:: Подскажите компонент для библиотека — «мостик» экспорт данных из.Так же, как и в течение которыхСЕГОДНЯ и МИН. Excel – специалисты по С# какие нибудь статьи: Смотря какие вычисления — неясно, в нашел косяков +да нет же,
Текстовые
: откройте примеры -yagami2 работы с Excel. между вашим приложением датагрид в эксель.В разделе формулы, функции в должна быть произведенавозвращает текущую дату,КомандаБиблиотекой функций намного прокаченней меня. о создании библиотеки должны производиться. Если чем проблема для работа с файлами
Дата и время
работает она с там есть чтение, кажется, это делается Надо: читать .xls и офисом). Для Референсы на офисДоступные ссылки Excel могут быть доставка товара. В а функцияПоследние. Мы рассмотрим структуру
Ссылки и массивы
Из литературы я на C# для громоздкие, то смотреть макросов. У меня формата xml, Xls, xlsx xls стандартным ODBC драйвером и .xlsx, в таких целей можно добавил все. Подскажите,установите флажок для скопированы в смежные нашем случае мыТДАТА
Математические
дает доступ к библиотеки, из каких пользовался гуглом - подключения ее потом стоит в сторону много таких и Xls.ну посмотри тыплохо и, кстати, делает идеале с возможностью использовать сторонние библиотечки, с какого боку библиотеки объектов, которую ячейки. Наведите курсор будем использовать данныедополнительно к дате функциям Excel, с
Другие функции
категорий и команд тем, библиотек, примеров в Excel’е. Или C++ и создания проблем нет. Может3. zexmlss простенькая примеры — ониSetix это рекордно быстро, чтения картинок из которые позволяют работать
Как вставить функцию из библиотеки
зайти. требуется задействовать в на ячейку, которая в столбцах B еще и время. которыми Вы работали она состоит. К на С# - примеры такой реализации, XLL. Вычисления по тут стоит пояснить библиотека с исходным идут вместе
- : В общем формируется как вставка данных ячеек; создавать документы. с документами напрямую,
- P.S. В Visual вашем проекте Visual содержит функцию. Затем и C дляВ категории недавно.
- каждой категории приведено множество. буду очень благодарен! скорости тогда дадут точнее проблему следует? кодом, доступно описанPS я писал
- временная таблица с в DataSet, так Сейчас использую Microsoft без необходимости иметь studio 2012 я Basic. нажмите левую кнопку расчета времени доставки.
- Ссылки и массивыКатегория небольшое описание, котороеК Примеру:Андрей VG фору всем остальнымЦитатаC_sanches написал: на класс. От остальных в xlsxlsx точно, помощью SQL запроса и загрузка в Office, но он на машине установленный
- совсем чайник.Примечание: мыши и, неВыделите ячейку, которая будет
- содержатся функции, которыеФинансовые даст Вам общеена Хабрахабре.: Доброе время суток.
вариантам.ЦитатаC_sanches написал: каком языке лучше отстает тем что читал из экселя в БД. В Excel из DataSet. не на всех офис.MansMI Чтобы ускорить компиляцию, снимите отпуская ее, перетащите содержать формулу. В предназначены для просмотрасодержит функции для представление о предназначенииСразу вам скажу,C_sanches, есть такой
Макросы в их
office-guru.ru
Добавление библиотек объектов в проект Visual Basic
писатькакой лучше знаете нет возможности работать точно шаблоне Excel указываетсяSetix машинах стоит. ТакжеПогуглите OpenXML SDK: C# using System.Runtime.InteropServices; флажки для библиотек маркер автозаполнения по нашем примере это и поиска информации. финансовых расчетов, например, функций, входящих в если вы хорошо проект , там файлах не используютсяИЦитатаC_sanches написал: будет с диаграммами иkrapotkin место вывода таблицы: Кто может посоветовать
работал с NPOI, или ClosedXML. using Excel = объектов, которые не ячейкам, которые необходимо
Добавление объекта
ячейка D3. Например, Вы можете сумма периодического платежа библиотеку. В конце знаете VBA, но достаточно много и
-
что? Нельзя использовать? ли приводить вызов комментарием, Они хоть: для работы с с помощью спец.
-
библиотеку или компоненты но он неMsGuns Microsoft.Office.Interop.Excel; ……………… //Проект/Добавить будут использоваться в заполнить. Функция будетВыберите вкладку
добавить гиперссылку (ПЛТ урока мы на не знаете C#, примеров, есть и Т.к.ЦитатаC_sanches написал:
-
функции в этой и описаны в файлами Excel довольно меток (а также для работы с поддерживает .xlsx. Желательно: Спасибо за ответ. ссылку/NET/Microsoft.Office.Interop.Excel //http://www.sql.ru/forum/620401/funkcii-dlya-raboty-s-excel-iz-c try проекте. скопирована, а значения
-
ФормулыГИПЕРССЫЛКАили процентная ставка примере разберем, как написать надстройку .xlam группа, обсуждающая вопросыим нужна некая
-
Отображение вкладки «Разработчик»
-
библиотеке к зависанию классе, но сохраняются неплохо подходит Libre нужные колонки (тоже файлами (Xls и простой, быстрый иСсылка на библиотеку
-
{ app =Чтобы задать порядок доступа вычислены в зависимостина Ленте, чтобы) в ячейку или по кредиту вставить функцию из
-
вам будет значительно использования. В частности функция, которой нет или крашу Excel’я?зависит только в формате
support.office.com
Как подключить библиотеки для работы с Excel
Office, который тоже спец метки)). Суть: Xlsx). Желательно чтобы с нормальным описанием. добавляется (Core),но interopt new Excel.Application(); app.Workbooks.Open(tbFile.Text, к библиотекам объектов, от строк или открыть вернуть значение, котороеСТАВКА
библиотеки. проще и быстрее. bedvit создал свою
в Excelто её от того, как Xml, Xslx формат поддается автоматизации прочитать шаблон, найти работать можно былоlexus-tikhvin не появляется. Поставил obj, obj, obj, в разделе столбцов.Библиотеку функций
CyberForum.ru
Библиотека для работы с Excel в Windows Form
расположено на пересечении.
В Microsoft Excel имеются Но если уж библиотеку с использованием и можно написать напишите код библиотеки.
их вырезает.еще есть TMS метки, вывести между без установки Excel.: OfficeOpenXml. вместо 2003-го 2007-й obj, obj, obj,Доступные ссылкиАвтор: Антон Андронов. заданных строки и
Функции из категории сотни самых различных вы решили… дерзайте
этого проекта. как раз на
Напишите правильно -C_sanches
FlexCell метками информацию. ВqwertehokНе уверен насчет офис и все obj, obj, obj,
выберите любую библиотекуПримечание:В группе команд столбца (Логические функций, которые делятсяbedvitУспехов. VBA и использовать не будет приводить.:Setix связи с этим
: платный или бесплатный? чтения, использую для
заработало. obj, obj, obj,
и переместите ееМы стараемся какБиблиотека функцийИНДЕКСиспользуются для проверки по категориям. Все
: Причем для увеличенияbedvit на листе:C_sanchesВсем привет!
: И так опробовал формирование шаблона наSetix быстрого создания иxxxxXML установить не obj, obj); } вверх или вниз
можно оперативнее обеспечивать, выберите нужную категорию.). аргументов на соответствие эти функции составляют быстродействия, в моем: C_sanches, почитайте, то
bedvit: Пользователи уже имеютНужно написать функцию со 3 библиотеки: уровне кода не: В идеале бесплатный. форматирования excel-файла. могу, т.к. поMsGuns с помощью кнопок вас актуальными справочными В нашем случаеКатегория определенному значению или общую библиотеку. Вам
CyberForum.ru
Независимая библиотека для работы с Excel
случае, использовались библиотеки что советует Андрей: C_sanches, все зависит Excel-файлы со всеми сложными вычислениями. И1. XLSReadWriteII 5.2, приемлемо так как Просто пока ничегоRius требованию заказчика, проект: Здравствуйте !приоритета материалами на вашем мы выберемМатематические условию. Например, если нет необходимости досконально
написанные на С VG, ExcelDNA -
от ваших знаний, вычислениями, которые доступны возникло несколько вопросов:TMS FlexCell,
шаблон доступен для найти не могу: Если пойдёт только должен быть вНеобходимо в проекте.
языке. Эта страницаДата и времявключает в себя сумма заказа меньше изучать каждую функцию,
с ассемблерными вставками
в некоторых случаях вот использования библиотеки, Excel без сторонних1. Что лучше, сохранитьzexmlss правки пользователю (форматирование путного. Требуется на xlsx, то упомянутый
«чистой» VS-2012
работать с книгами
Чтобы добавить в раздел переведена автоматически, поэтому. функции для обработки
$50, то добавляется
но познакомиться с (сторонние), здесь я очень полезная разработка,
написанной на C# библиотек и надстроек.
код как надстройкаНе много о строк, столбцов). Нужен основе шаблона сделать выше способ. КакUsaga Excel. Для этого,Доступные ссылки ее текст можетВыберите нужную функцию из числовых аргументов, выполняющие
CyberForum.ru
Xls и Xlsx библиотеки и компоненты для работы с файлами
цена доставки $4.99, несколькими основными из пасс… Поэтому прирост особенно если вы для Excel (VBA) Но им нужна (*.xla) или в каждой:
компонент или библиотека отчет без использования
начать: Генерируем OfficeOpenXML-документы: как я узнал,другую библиотеку, нажмите содержать неточности и выпадающего меню. Мы различные математические и а если больше,
каждой категории будет производительности от обычного
планируете писать на (автором этих строк).
некая функция, которой отдельную библиотеку (макрос1. Начну с чтобы прочитать файл Excel.
за 5 минут.MsGuns
используется библиотека Microsoft.Office.Interop.Excel. кнопку грамматические ошибки. Для выберем функцию тригонометрические вычисления. Например, то стоимость доставки весьма полезно. кода на С# C# для Excel Используется для расчета нет в Excel, не подойдет, т.к. платной XLSReadWriteII 5.2 заполнить данными иqwertehokNewOrdered, установка библиотеки «чистоту»
Но если ееОбзор нас важно, чтобыЧИСТРАБДНИ
вы можете округлить
не взимается. ВЧтобы получить доступ к в dll/xll и (VBA). Скачайте и больших чисел (длинная поэтому и встал функция будет использоваться — обладает почти сохранить.: на форуме обсуждался: проекта не портит. добавить явно ви укажите путь эта статья была, чтобы вычислить количество значение ( данном примере целесообразно библиотеке функций Excel, VBA в xlam установите Microsoft Visual арифметика). вопрос о написании в нескольких Excel-книгах полным функционалом для
qwertehokПриёмы работы сserg4242 К тому же, Using, то компилятор
к необходимому файлу. вам полезна. Просим рабочих дней междуОКРУГЛ
использовать функцию выберите вкладку Формулы. возможно будет не
Studio 2015 (бесплатнаяНо это когда библиотеки. Пользователь только на разных ПК) работы с файлами: я тебе написал zexmlss, взгляните на этуMicrosoft.Office.Interop.Excel ругается на отсутствиеНа верхней панели выберите вас уделить пару датами заказа и
), найти значение ПиЕСЛИ
Все возможные категории столь высок, что версия, с незначительными
критически важно считать подключит ее и2. Если это библиотека,
xlsx и xls. уже — этаотличный компонент, на библиотеку
- тоже сторонняя ‘Office’ в пространствеExcel секунд и сообщить, получения товара. (
. и команды вы
бы компенсировать быстроту для ваших целей быстро и наиболее
сможет использовать. Макросы
то на каком
Много различных классов
библиотека позволяет читать сайте есть все
http://epplus.codeplex.com/ библиотека, её в имен. Попытка добавить> помогла ли онаПоявится диалоговое окноПИВ категории можете увидеть в разработки в VBA, ограничениями). эффективно использовать ресурсы в их файлах языке лучше писать и описаний, и экселевские файлы примеры и почтаumatkot .NET нету, тащится ссылку через обозревательнастройки вам, с помощьюАргументы функции), произведение (Текстовые
группе и преодоления порогаПоделайте простые задания, ПК. не используются.ЦитатаThe_Prist написал: (подойдет ли C#)? прочего. На версииSetix автора — связаться
: Странно, заметил, за с офисным пакетом. решений (раздел COM,> кнопок внизу страницы.. Здесь вы можетеПРОИЗВЕДсодержатся функции, которыеБиблиотека функций вхождения в новый к примеру, .В вашем случае, какой лучше знаетет.е.
CyberForum.ru
Написание библиотеки для Excel
3. Вычисления будут сложными 5,2 нашел 1
: Поставил библиотеку посмотрел
можно собой черту, что Так, что условие
библиотека Microsoft Excelпанель инструментов и ленты Для удобства также ввести или выбрать), промежуточные итоги ( работают с текстом. язык.
Там же можно возможно, можно просто нет принципиальной разницы, и их будет
косяк при попытке с чем работаетиз платных - всегда при ответе, «чистоты» вы уже 12.0 Object Library). приводим ссылку на
ячейки, которые будут
ПРОМЕЖУТОЧНЫЕ.ИТОГИ в качестве значенийРазберем, какую задачу выполняетC_sanches создать тему, если обойтись надстройкой (*.xla) на чем будет очень много. Используя
записать ячейку с она. XLSReadWriteII получается, что с нарушили. проблему не решила.В разделе оригинал (на английском составлять аргументы. Мы) и многое другое. аргументов. С помощью
каждая из команд: Андрей VG, bedvit, вам потребуется помощь
или (*.xlam) написана библиотека? В библиотеку, будет ли данными в формате1. Работу сSetix кем-то спорю. ТакMsGunsСтудия 2012, на
Настройка ленты языке) . введем B3 вРаздел них можно решать группы: спасибо за ссылки (это не реклама),bedvit плане скорости работы приводить вызов функции «{}» вместо фигурной файлами Xls совсем: zexmlss: там идет вот же: закон: ПК установлен ExcelвыберитеВ своем коде можно полеДругие функции такие задачи, какЕсли у Вас возникли и пояснения. может и я
: Это проще и и возможности добавить в этой библиотеке скобки «}» выводит не обнаружил. создание самого шаблона подлости.
Usaga 2003Основные вкладки задействовать другие объекты
Нач_датасодержит дополнительные категории преобразование текста в проблемы с поискомC# выбран, т.к. чем-то смогу помочь нужно только знания функцию, которая будет к зависанию или — «/» на
2. Там представленна с помощью кода.Используйте ClosedXml))), Спасибо еще раз,
Подскажите, пожалуйста, чтои установите флажок приложения, задав ссылкии С3 в библиотеки функций, такие нижний регистр ( необходимой функции в
его знаю (что (когда будет время). VBA. доступна потом в крашу Excel’я? более поздних версиях работа с xml У меня неhttps://github.com/ClosedXML но, судя по
делать.Разработчик на библиотеку объектов поле как Статистические, Инженерные,
СТРОЧН Excel, команда не сказать о Потом, если вы
C_sanches ячейках Excel’яСпасибо! не могу сказать
и много другая задача.yagami2 количеству материала вСпасибо за любую. этого приложения.
Кон_дата Аналитические, Проверка свойств) или замена частиВставить функцию VBA).
поймете, что это: именно это иПытливыйThe_Prist не тестировал. СохраняетРАСПАКОВАННЫМ Шаблон условно создает: Меня в своем
Сети, interop, пожалуй, помощь
Нажмите кнопкуНа вкладке «Разработчик» откройте. и значений, а текста на другоепозволяет найти ееБуду пробовать реализовывать для вас интересно важно в моей
: Если встроить код
: вопрос из разряда все стандартные форматыxlsx файлом. При пользователь. Моя цель время вот эта самый популярный вариантUsagaСохранить окно проекта VisualЕсли аргументы введены правильно, также функции, оставленные значение ( при помощи ключевых то, что задумал. и вы готовы
задаче. Только будут функции в файл, «как провести лето». (xml,xls,xlsx). Есть возможность этом не приведены открыть этот шаблон библиотека очень выручила работы из шарпа:и закройте Basic. Увидеть вкладки нажмите для поддержки совместимостиЗАМЕНИТЬ слов. Еще раз всем писать на C#, использоваться не большие то эта функция Кому-то нравится дикарем перевода в другие примеры, чем запаковывать взять данные чтоhttps://exceldatareader.codeplex.com/ с Экселем. ПоменялMsGunsПараметров Excel «разработчик» отображается ниже,ОК
с предыдущими версиями
).
Команда спасибо. Если будут далее почитайте по числа, а большое будет доступна в на море, кому-то форматы Html и файл потом. Попробовал есть в шаблоне
Берет excel файл офис, все равно, добавление ссылки на. если она еще. Excel.КатегорияАвтосумма вопросы, обязательно сюда COM, XLL, DLL. количество небольших чисел. файле, в чем All-inclusive подавай, а прочие. Подробнее на поработать с распакованным и по ним и целиком пихает старый 2003 сейчас
эту библиотеку должноLoathem не открыта.Функция будет вычислена, и
В следующем примере ВыДата и времяпозволяет автоматически вычислять обращусь.
Признаться я неUPD: Вопрос о проблема? Пользовательская функция. кто-то в Альпы сайте у производителя. файлом, а потом
planetaexcel.ru
заполнить отчет. Просто
30 / 21 / 9 Регистрация: 22.11.2014 Сообщений: 111 |
|
1 |
|
08.11.2017, 20:44. Показов 5643. Ответов 6
Подскажите компонент для работы с Excel. Надо: читать .xls и .xlsx, в идеале с возможностью чтения картинок из ячеек; создавать документы. Сейчас использую Microsoft Office, но он не на всех машинах стоит. Также работал с NPOI, но он не поддерживает .xlsx. Желательно простой, быстрый и с нормальным описанием.
0 |
21 / 21 / 9 Регистрация: 11.09.2013 Сообщений: 72 |
|
13.11.2017, 09:53 |
2 |
OfficeOpenXml.
1 |
467 / 231 / 72 Регистрация: 25.05.2012 Сообщений: 1,013 Записей в блоге: 1 |
|
16.11.2017, 13:22 |
4 |
serg4242, взгляните на эту библиотеку
0 |
187 / 100 / 19 Регистрация: 15.09.2011 Сообщений: 801 |
|
21.11.2017, 10:40 |
5 |
Странно, заметил, за собой черту, что всегда при ответе, получается, что с кем-то спорю. Так вот же: закон подлости.
1 |
21 / 19 / 4 Регистрация: 15.01.2015 Сообщений: 202 |
|
21.11.2017, 12:01 |
6 |
Меня в своем время вот эта библиотека очень выручила
0 |
187 / 100 / 19 Регистрация: 15.09.2011 Сообщений: 801 |
|
22.11.2017, 13:23 |
7 |
yagami2, кажется, это делается стандартным ODBC драйвером и, кстати, делает это рекордно быстро, как вставка данных в DataSet, так и загрузка в Excel из DataSet.
0 |
Все привет, в этой статье опишу исчерпывающие примеры работы с 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; } |
Содержание
- Введение
- Добавление необходимых ссылок в решение
- Работа с объектом Application (Excel)
- Запуск и остановка Microsoft Excel в C#
- Создание рабочей книги Excel в C#
- Работа с листами Excel в C#. Hello Excel
- Итого
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
При разработки различных программ для анализа данных нередко требуется не только обрабатывать большие массивы данных, но и предоставить конечному пользователю удобно оформленный отчёт о работе программного обеспечения. В сегодняшних реалиях экономия килобайт оперативной памяти при разработке программного обеспечения уже не так важна по сравнению с удобством работы программного продукта. Не секрет, что при работе в Windows для наиболее удобного представления табличных данных является Microsoft Excel. В этой и других статьях, посвященных работе с Excel в .NET Core и C# я постараюсь рассмотреть наиболее частые задачи по импорту и экспорту данных между приложением и Microsoft Excel. Сегодня мы рассмотрим как использовать MS Excel в .NET Core, используя технологию COM.
Введение
Разработка программ, взаимодействующих с пакетом Microsoft Office, вне зависимости от среды разработки, будь то Visual Studio С# или Delphi, основана на применении так называемой объектной модели Microsoft Office. Взаимодействие с объектами такой модели базируется на технологии OLE (Object Linking and Embedding, связывание и внедрение объектов), которая, в свою очередь, использует технологический стандарт COM (Component Object Model — модель компонентного объекта).
Существует достаточно много решений, позволяющих работать с Microsoft Excel в Visual Studio .NET о которых мы, вполне возможно, поговорим позднее. Сейчас же мы будем учиться использовать возможности Microsoft Excel, опираясь исключительно на объектную модель Microsoft Office и те возможности, которые она предоставляет разработчикам, так сказать, «из коробки».
Добавление необходимых ссылок в решение
Для подключения в решение библиотек для взаимодействия с Microsoft Excel необходимо добавить добавьте следующие ссылки:
- Microsoft Excel 16.0 Object Library
- Microsoft Office 16.0 Object Library
В Visual Studio это делается следующим образом:
1. В «Обозревателе решений» кликаем правой кнопкой мыши по строке «Зависимости» и выбираем пункт «Добавить ссылку на модель COM»
2. В открывшемся окне в строке поиска набираем «Microsoft», выбираем необходимые ссылки, то есть Microsoft Excel 16.0 Object Library и Microsoft Office 16.0 Object Library и жмем «Ok»:
После этого, в обозревателе решений для нашего проекта в зависимостях появятся следующие ссылки:
Зависимости
COM
Interop.Microsoft.Office.Core
Interop.Microsoft.Office.Interop.Excel
Платформы
Microsoft.NetCore.App
Теперь, чтобы наше решение для .NET Core могло полноценно использовать возможности Microsoft Excel необходимо указать в решении, что все типы, используемые в объектной модели Microsoft Office будут использоваться в нашей сборке. Чтобы это сделать выбираем в зависимостях нашего решения каждую ссылку из раздела COM и в разделе «Свойства» указываем напротив пункта «Внедрить типы взаимодействия» значение «Да». На рисунке ниже представлен пример для ссылки Interop.Microsoft.Office.Core
Если не выполнить эти действия, то при разработки приложения .NET Core при попытке работы с Excel вы получите следующую ошибку:
System.IO.FileNotFoundException HResult=0x80070002
Сообщение = Could not load file or assembly ‘office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c’. Не удается найти указанный файл.
Источник = <Не удается определить источник исключения>
Трассировка стека: <Не удается определить трассировку стека исключения>
Работа с объектом Application (Excel)
Объект Application
представляет всё приложение Microsoft Excel. С помощью этого объекта в C# мы можем запускать и останавливать работу Excel, получать доступ к рабочим книгам Excel и так далее. Посмотрим, как можно взаимодействовать с Excel в C#, используя объект Application
.
Запуск и остановка Microsoft Excel в C#
Чтобы продемонстрировать запуск и остановку Excel в C# подключим в наше решение пространство имен Microsoft.Office.Interop.Excel
, используя псевдоним:
using Excel = Microsoft.Office.Interop.Excel;
Теперь напишем следующий код для метода Main()
:
using System; using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; namespace ExcelApp { class Program { static void Main(string[] args) { Excel.Application application = new Excel.Application(); Console.WriteLine("Объект Excel.Application создан"); Console.ReadKey(); application.Visible = true; Console.WriteLine("Окно Excel видно пользователю"); Console.ReadKey(); Console.WriteLine("Закрываем Excel"); application.Quit(); Marshal.ReleaseComObject(application); } } }
Разберемся с тем, что происходит в нашем приложении при запуске. Вначале мы создаем объект application
типа Excel.Application
(Excel
— псевдоним пространства имен Microsoft.Office.Interop.Excel
). После выполнения этой строки кода происходит запуск процесса Microsoft Excel. Убедиться в этом можно, открыв диспетчер задач Windows и заглянув в раздел «Фоновые процессы»:
Чтобы показать главное окно Excel пользователю, мы устанавливаем значение true
свойству Visible
:
application.Visible = true;
И, наконец, для того, чтобы закрыть Excel и освободить память, занятую процессом Excel мы вызываем метод Quit()
.
application.Quit()
Таким образом, всё, что пока делает наше приложение .NET Core — это запускает процесс Microsoft Excel, показывает окно Excel и закрывает приложение. При этом, стоит обратить внимание на следующий момент: так как чаще всего мы будем взаимодействовать с Excel в C# в фоновом режиме без показа главного окна, то по окончанию взаимодействия необходимо обязательно вызывать метод Quit()
объекта Application
и вызвать метод объекта Marshal.ReleaseComObject(application)
из пространства имен System.Runtime.InteropServices
. Если этого не сделать, то после N
запусков нашего приложения мы рискуем «забить» оперативную память компьютера неиспользуемыми процессами Excel, так как после остановки нашего приложения и вызова Quit()
внешний процесс (Excel) автоматически не завершается. Продемонстрировать это можно, написав всего две строки кода:
static void Main(string[] args) { Excel.Application application = new Excel.Application(); application.Quit(); }
и запустить приложение несколько раз. Например, на рисунке ниже показан диспетчер задач после трех запусков нашего приложения:
Создание рабочей книги Excel в C#
Следующий пример демонстрирует создание новой рабочей книги Excel в C#:
using System; using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; namespace ExcelApp { class Program { static void Main(string[] args) { //Объявляем переменную приложения Excel Excel.Application application = null; //объявляем переменные для коллекции рабочих книг //и одной рабочей книги Excel.Workbooks workbooks = null; Excel.Workbook workbook = null; try { //создаем объект Application application = new Excel.Application(); Console.WriteLine("Объект Excel.Application создан"); Console.ReadKey(); //показываем окно Excel пользователю application.Visible = true; Console.WriteLine("Окно Excel видно пользователю"); //получаем ссылку на коллекцию рабочих книг workbooks = application.Workbooks; //добавляем новую рабочую книгу в коллекцию workbook = workbooks.Add(); Console.ReadKey(); Console.WriteLine("Закрываем Excel"); application.Quit(); } finally { //освобождаем память, занятую объектами Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(workbooks); Marshal.ReleaseComObject(application); } } } }
На первый взгляд, может показаться, что этот код вполне можно упростить, например, избавившись от «лишних» переменной workbooks
, например так:
workbook = application.Workbooks.Add();
Такой код, безусловно, будет короче и рабочая книга также будет создана, НО при этом, память выделенная для процесса Excel не будет освобождена по причине того, что в приведенной выше строке кода мы на самом деле создаем не один, а два объекта: объект типа Excel.Workbooks
и объект типа Excel.Workbook
и, соответственно, оба эти объекта нам необходимо освободить после работы с ними.
Исходя из вышеизложенного, можно определить для себя два следующих правила работы с COM в C#:
Никогда не использовать две и более точек при работе с COM
О том, из-за чего процесс Excel может зависать — смотрите в этой статье.
Работа с листами Excel в C#. Hello Excel
В следующем примере демонстрируется то, как получить доступ к первому листу рабочей книги и записи в ячейку A1
строки «Hello Excel
«:
using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; namespace ExcelApp { class Program { static void Main(string[] args) { Excel.Application application = null; Excel.Workbooks workbooks = null; Excel.Workbook workbook = null; Excel.Sheets worksheets = null; Excel.Worksheet worksheet = null; //переменная для хранения диапазона ячеек //в нашем случае - это будет одна ячейка Excel.Range cell = null; try { application = new Excel.Application { Visible = true }; workbooks = application.Workbooks; workbook = workbooks.Add(); worksheets = workbook.Worksheets; //получаем доступ к коллекции рабочих листов worksheet = worksheets.Item[1];//получаем доступ к первому листу cell = worksheet.Cells[1, 1];//получаем доступ к ячейке cell.Value = "Hello Excel";//пишем строку в ячейку A1 application.Quit(); } finally { //освобождаем память, занятую объектами Marshal.ReleaseComObject(cell); Marshal.ReleaseComObject(worksheet); Marshal.ReleaseComObject(worksheets); Marshal.ReleaseComObject(workbook); Marshal.ReleaseComObject(workbooks); Marshal.ReleaseComObject(application); } } } }
После запуска этого приложения откроется Excel, создастся рабочая книга, на первом листе рабочей книги в ячейке А1
появится строка «Hello Excel» после чего Excel попросит сохранить книгу. После отказа сохранения Excel закроется и память процесса Microsoft Excel будет освобождена.
Итого
Итак, сегодня мы рассмотрели основные моменты по работе с Microsoft Excel в C# и .NET Core: научились создавать процесс Microsoft Excel, создавать рабочую книгу, записывать текст в ячейки листа Excel и корректно освобождать память после работы с Excel в C#. В следующий раз мы продолжим разбираться с темой использования возможностей Excel в .NET Core и более детально познакомимся с объектной моделью Microsoft Office.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
- Download source files — 17.1 Kb
- Download demo project — 55.8 Kb
Introduction
After the arrival of VSTO, VBA development is almost outdated. However, to support Office 2000, developers still need a library to easily code a VBA based solution. Excel VBA Library could be used in order to use Excel as database tables to INSERT
, UPDATE
and SELECT
. There are also other libraries to simplify Excel VBA developer life a bit. I hope it will be of some help.
List of libraries
ACell
: Use this library to obtain row, column or cell address for current row.AComboBox
: Use this library to simplify loading ofComboBox
andListBox
.AConst
: Defining your constants at one place could be handy, no matter how small your project is.ALog
: Use this library to write a log of a Excel sheet by the name of «Log». For background processes, this log could be very helpful.AMsgForm
: Use this library instead ofMsgBox
to provide consistent application name and message formatting in your VBA solutions.AOptions
: Use this library toget
/set
end user preferences to an Excel sheet named «Option
«.ARange
: Use this library to obtain valid range string or range object from a given row, column.ASQL
: Use this library to use the Excel sheet as a database table. This library could simplifyINSERT
,UPDATE
,SELECT
in an Excel sheet.AStr
: Use this library for string manipulation and formatting.ATable
: Use this library to make use of an Excel worksheet as a database table. Make sure that the first row of the sheet contains column names. This library simplifies table based worksheet tasks.
How To Use Code
- Create an Excel sheet.
- Open VBA editor by pressing Alt+F11.
- Drag Drop to include all the VBA library module files in workbook.
- Place buttons on sheet and assign the following macros to each button.
Sub Button1_Click() AMsgForm.Show "Use ALog library to write information in Log. _ A info Log is written." ALog.WriteErr "Use ALog library to write information in Log" AMsgForm.Show "Use ALog library to write errors in Log. _ An error Log is written." ALog.WriteInfo "Use ALog library to write errors in Log" End Sub Sub Button3_Click() AMsgForm.Show "You could have consistent messages with _ AMsgForm library" AMsgForm.ShowErr "& Errors. This is an error message" End Sub Sub Button5_Click() AMsgForm.Show "Use AOption library to get/set user preferences." AMsgForm.Show AOptions.StrGet(OptionE.Option1, "Not found") End Sub Sub Button7_Click() Dim rs AMsgForm.Show "Use ASQL library to SELECT, INSERT, UPDATE Excel sheet. _ Now count of cities will be selected in City sheet." Set rs = ASQL.Run("City") AMsgForm.Show rs.RecordCount End Sub Sub Button8_Click() AMsgForm.Show "Use AStr for string manipulation and formatting." AMsgForm.Show AStr.Quote("Quote a string in VBA always ends up _ in dirty and less maintainable code. But its easy with AStr.Quote") AMsgForm.Show AStr.Bracket("To bracket use AStr.Bracket") End Sub
Software engineer developing solutions using Microsoft technologies.
Библиотеки для работы с excel с
А чем именно интероп тот же не устраивает? Боитесь, что рванет на несоответствии версий библиотек типов? Сделайте свой враппер на late binding, и будет вам счастье. Я лично сам самописную либу под это дело давно и вполне комфортно использую. А 100% managed вы все равно не получите, т.к. все эти библиотеки есть обертки над вызовами методов com-объектов библиотеки типов экселя, которая сама по себе не managed.
P.S. http://sql.ru/forum/actualthread.aspx?tid=620401 — вот тут люди как раз и обмениваются опытом по написанию врапперов на late binding для экселя.
цитата: sla3:
mystery
Какие проблемы видите из-за Interop?
сразу признаюсь, в своё время на .net я не перешёл, остался, так сказать, в том поезде.
А люди жалуются — вот, например, http://blog.byndyu.ru/2009/05/excelexe-interopexcel.html
Оно конечно, если всё «правильно» делать, то и проблем не будет. Так что, это технология для избранных?
Тогда мне остаётся использовать к.-н. обёртку, скрывающую проблемы; или использовать другие технологии.. Проблема описанная по ссылке довольно известная. Поскольку работа идет с неуправляемым кодом, освобождать объекты нужно ручками (сборщик мусора и using/dispose с ними не работают). Но ведь это не не проблема Interop-а, а проблема «кривых рук».
А вообще на какой библиотеке остановились? И кстати, встроенный JET драйвер не понравился?
В общую копилку
http://myxls.in2bits.org/
http://www.codeplex.com/ExcelPackage/
Последний — плохо открывает сложные xlsx документы.
PHP библиотека PHPExcel для работы с Excel
Для работы с Excel использовал библиотеку PHPExcel. Установка простейшая – кладем папку Classes в нужную папку на сервере, указываем корректные пути в include/require.
Примеры кода по чтению/генерации файлов Excel можно посмотреть на github странице библиотеки.
Красивости
и этим не ограничивается функционал, это лишь то, что использовал:
- mergeCells(“cell_range”) – Объединение указанных ячеек в одну. Данные должны лежать в первой ячейке, иначе они теряются.
- setSize(16) – Делаем размер шрифта 16 для указанных ячеек.
- setBold(true) – Делаем текст “жирным”
- setWrapText(true) – Делаем перенос слов по умолчанию для всех ячеек
- setAutoFilter – Включить фильтр по умолчанию
- freezePane – Закрепить какие либо строки, например первую
- borders – делается через создание стиля, а потом его применение на указанный диапазон ячеек
- color – Аналогично с помощью стилей меняем цвет шрифта (Font)
- setARGB – Изменить цвет ячейки, например
- всей первой строки
- конкретной ячейки (делал так цвет был переменным и задавался на основе данных – формировался разноцветный показательный Excel)
- диапазона ячеек по диагонали
Код для чтения (два столбца):
Редактирование
Открываем файл test.xlsx, на его основе создаем новый new.xlsx с измененными парой ячеек.
Пример генерации на основе результата MySQL (не тестил, использовал универсальную функцию ниже).
Если нужно протестить базовую работу генерации на основе двумерного массива
Пример генерации xls из двумерного массива с настройками
- имени (определяется на основе значения в переменной $_POST[‘filename’]),
- ширины столбца (на основе $_POST[‘excelSettings’]),
- bold первой строки (setBold),
- переноса слов (setWrapText).
Пример вызова и код по генерации кнопки, добавлению к названию файла даты/времени (формат 20170123_003800_Название.xlsx) и переходу на страницу генерации xls.
Вызов функции (про функцию iconv_for_xls ниже):
Особенности
Мусор
Нужно очень внимательно смотреть, чтобы php не генерировал никакого вывода, в противном случае возможны разные ошибки и искажения файла.
Например, возможны кракозябры при генерации файла больше 20-40 строк, если оставить включенным debug типа print_r($_POST); (почему не воспроизводиться при генерации мелких файлов – это вопрос :)).
Аналогично, будет выдавать ошибку:
- Если в конце кода php нет “exit;”
- Если перед генерацией файла нет очистки буфера вывода через “ob_end_clean();”
- Если используется генерация xlsx (Excel2007), но не установлены xml и xmlwriter модули PHP. Так же может выдаваться ошибка “Fatal error: Class ‘XMLWriter’ not found in /
/XMLWriter.php on line 37” т.к. библиотека PHPExcel использует наследование класса от XMLWriter (“class PHPExcel_Shared_XMLWriter extends XMLWriter”), т.е. требует установленного модуля xmlwriter. Для “нормальных” дистрибутивов это делается простым sudo apt-get/yum install php-xmlwriter (или php5-xml) и перезагрузкой apache, для gentoo это делается через пересборку всего php с новым модулем.
Отправка array на другую страницу
Чтобы функция по генерации xlsx была универсальной, сделал отдельную страницу по генерации, но на эту страницу потребовалось передать двумерный массив. В интернете гуляет два варианта решения: сохранить массив в сессии/куках, передать его через json (лучше) или serialize (хуже).
Через сессии все передавалось, только значение почему то не апдейтилось корректно. Сходу не разобрался в причинах, использовал сначала serialize (полный пример см. в function create_xls), но потом мигрировал на json из-за периодических проблем со спец. символами serialize.
Кодировка
Если на сайте кодировка cp-1251, то при генерации обязательно нужно использовать iconv в utf-8. В противном случае вместо русских символов в ячейке будет бред (например, “ИСТИНА”).
Работа с Excel с помощью C# (Microsoft.Office.Interop.Excel)
Оставляю заметку по работе с Excel с помощью C#.
Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.
Наработки очень пригодились в работе для формирования отчетности.
Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.
Visual Studio здесь довольно старой версии. Если у вас версия новая, отличаться будет только вид окна.
Далее создаем псевдоним для работы с Excel:
using Excel = Microsoft.Office.Interop.Excel;
Расстановка рамок.
Расставляем рамки со всех сторон:
Цвет рамки можно установить так:
Выравнивания в диапазоне задаются так:
Определим задачу: получить сумму диапазона ячеек A4:A10.
Для начала снова получим диапазон ячеек:
Excel.Range formulaRange = sheet.get_Range(sheet.Cells[4, 1], sheet.Cells[9, 1]);
Далее получим диапазон вида A4:A10 по адресу ячейки ( [4,1]; [9;1] ) описанному выше:
string adder = formulaRange.get_Address(1, 1, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);
Теперь в переменной adder у нас хранится строковое значение диапазона ( [4,1]; [9;1] ), то есть A4:A10.
Выделение ячейки или диапазона ячеек
Так же можно выделить ячейку или диапазон, как если бы мы выделили их мышкой:
Авто ширина и авто высота
Чтобы настроить авто ширину и высоту для диапазона, используем такие команды:
Получаем значения из ячеек
Чтобы получить значение из ячейки, используем такой код:
Добавляем лист в рабочую книгу
Чтобы добавить лист и дать ему заголовок, используем следующее:
Добавление разрыва страницы
Сохраняем документ
Как открыть существующий документ Excel
Комментарии
При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.
Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.
Далее заходим в редактор Visual Basic и смотрим код, который туда записался:
В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.
Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:
Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.
Сравнение библиотек для работы с файлами Misrosoft Excel
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Сравнение библиотек для работы с файлами Misrosoft Excel
Самым удобным, полным и хорошо документированным способом работы с файлами MS Excel является использование OLE Automation с Microsoft Excel. Единственный его недостаток — низкая скорость, поэтому данный способ неприемлем для больших объемов данных. Возникает необходимость использовать библиотеки, работающие с файлами напрямую, и скорость является основной характеристикой для данного класса продуктов.
В данной статье мы рассмотрим и сравним несколько библиотек для Borland Delphi, предоставляющих разработчикам возможность работать с файлами Microsoft Excel напрямую, без использования OLE Automation и самого Microsoft Excel.
Перечислим библиотеки, которые мы будем рассматривать, и приведем их краткое описание.
Мы рассмотрим эти библиотеки как с точки зрения производительности, так и с точки зрения удобства использования для разработчика.
Удобство использования для разработчика
Для того чтобы оценить удобство использования продуктов для разработчика, мы рассмотрим следующие их параметры:
- Архитектура
- Наличие и качество документации
Архитектура
Наличие и качество документации
Производительность
Для сравнения производительности мы проведем несколько тестов записи файлов MS Excel.
Сначала приведем некоторые сведения о внутреннем формате файла MS Excel, которые понадобятся нам при анализе результатов тестов. В файле MS Excel все строковые значения ячеек хранятся в таблице строк, при этом ячейки содержат только указатели на элементы таблицы строк. В таблице строк собраны уникальные строковые значения ячеек (например, если все текстовые ячейки в рабочей книге содержат одно и то же значение, в таблице строк будет один элемент). Одна из важных задач при записи файла MS Excel — быстро построить таблицу строк.
При записи файла MS Excel библиотеки выполняют два вида действий — анализ и подготовка данных к записи и непосредственно запись в файл. Анализ данных, в частности, включает в себя создание таблицы строк.
Платформа для тестирования
Тест 1 — большое число ячеек с одинаковым строковым значением
Заполним 50000 ячеек одинаковым строковым значением. Этот тест, показывает скорость записи данных в файл. Так как все ячейки содержат строковое одинаковое значение, то таблица строк здесь строится быстро. Время анализа и подготовки данных в данном случае не существенно влияет на результат.
Тест 2 — большое число ячеек с различными случайными строковыми значениями
Заполним 50000 ячеек различными строками, состоящими из набора случайных символов, и имеющими длину от 10 до 60 символов. Этот тест показывает скорость построения таблицы строк. Чем больше различных текстовых значений в файле MS Excel, который нужно создать, тем важнее этот показатель.
Тест 3 — большое число ячеек с различными случайными числами
Заполним 50000 ячеек различными случайными числами. Этот тест, как и Тест 1, показывает скорость записи данных в файл. Так как ячейки не содержат строковых значений, то таблица строк здесь будет пустая. Время анализа и подготовки данных в данном случае не существенно влияет на результат.
Тест 4 — большое число ячеек с разнородными данными
Этот тест моделирует запись типичного файла MS Excel, содержащего и строковые значения, и числа. Возьмем задачу, которую выполняет демо-приложение StressTest из библиотеки FlexCel. Требуется провести экспорт 6000 строк, каждая из которых содержит 30 столбцов — итого 180000 ячеек. При этом в 2 столбцах будут содержаться различные строки, состоящие из набора случайных символов, и имеющие длину от 10 до 60 символов. В черырех других столбцах будут содержаться постоянные строковые значения. Остальные столбцы заполним случайными целыми числами.
Желающие могут скачать исходные тексты тестовых приложений (8.59K). Для того, чтобы их скомпилировать и запустить, Вам дополнительно потребуется получить и установить демо-версии рассматриваемых библиотек на сайтах их производителей.
Copyright © 2004 Ольга Сосонных Специально для Delphi Plus
Библиотеки для работы с excel с
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Некоторое время назад задался целью найти готовую библиотеку для чтения/записи файлов .xls и .xlsx без установленного приложения Excel
Если Excel установлен, то кажется, что всё просто. Однако: 1) он должен быть установлен 2) есть разница работы с разными версиями офиса — зависим от версии 3) запись больших таблиц работает очень медленно. и т.д., на этом проблемы не заканчиваются.
После серьёзного изучения вопроса, понял, что действительно стоящего варианта — не найдено. Существует несколько библиотек, как свободных, так и платных. Но ни те, ни другие — не удовлетворяют. С чтением таблиц — проблем нет, это делается, например, через MS Jet. А вот запись, тем более — с форматированием, вызывает вопросы.
Задача «минимум» для такой библиотеки:
1) запись файла (например, .xlsx) из dataset — одним вызовом.
2) автоматический подбор ширины столбцов по содержимому (AutoFit)
3) выбор шрифта (хотя бы одного на весь файл) и его размера
4) установка автофильтра на всё содержимое
т.е. получаем файл, готовый к просмотру и к обработке данных без лишних телодвижений вручную. Желательно, чтобы использование библотеки выглядело как можно более лаконично в коде.
Предлагаю обсудить, кто чем пользуется, какие библиотеки рекомендует.
Пробовал EPPlus 2.9, GemBox.Spreadsheet. На крайний случай сгодится, но не очень.
Во многих библиотеках присутствует один и тот же глюк: формат «# ##0,##» до Excel доходит как «# ##0,##».
Generates Excel files from WinForms, WebForms ASP.NET, PocketPC applications, webservices on the fly and fast with FlexCel Studio for .NET
Native .NET components (no additional OLE/dlls required) allowing to read, create and modify native Excel .XLS and .XLSX files without needing to have Excel installed.
Supported Excel 97 .XLS file format and Excel 2007/2010 .XLSX format
Native PDF file export
Exceptionally fast and solid hand tuned .XLS & .XLSX engine capable of generating thousands files per minute.
Able to modify .XLS files and keep almost everything existing on the original file, from macros to activex objects.
Recalculation of more than 200 Excel functions.
Ability to read and write encrypted .XLS files.
Completely written in C# 100% managed code, with NO interop and NO p/invokes!
Runs on .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, Mono and the .NET Compact Framework (xlsx support requires .NET 3.5).
Templates can be stored inside your executable file, in a database or in any place from where you can access it as a stream.
Extensive API is available with which you can programmatically write and read files, with formatting info, images comments, etc.
Export to HTML in HTML 4.01 strict or XTHML 1.1 and fully standards compliant
Report Engine that allows to create complex reports using Excel as your report designer, so your final users can modify them. You can use images/comments/conditional formats/merged cells/pivot tables/charts and almost anything you can think of on those reports.
using System.IO;
using System.Globalization;
using System.Drawing;
using FlexCel.Core;
using FlexCel.XlsAdapter;
public void CreateAndSaveFile()
<
XlsFile xls = new XlsFile(true);
CreateFile(xls);
//Save the file as XLS
xls.Save(openFileDialog1.FileName);
>
public void CreateFile(ExcelFile xls)
<
xls.NewFile(1); //Create a new Excel file with 1 sheet.
xls.ActiveSheet = 1; //Set the sheet we are working in.
>
Все имеется. Куча примеров.Могу кинуть на обменник FS. правда немного староват дистр.
Вообще-то не помешает, по крайней мере поизучать. Я сам кое-что попробовал, но форматирование — не прошло, вообще. Не понял пока что не так.
Кстати, YuriyRR, может ты заодно знаешь почему все библиотеки (может не все, но всё что я пробовал — это много) корёжат формат, заданный строкой, я тут уже выше писал:
Вероятно ожидают увидеть формат в английской локали, где в качестве десятичного разделителя используется тчк, а не зпт. Соответственно эскейпят все прочие символы. Или, как вариант, у тебя на машине локаль неправильная стоит.
Добавлено:
Когда-то давно делал репорты в excel на asp.net вообще без библиотек:
— сохраняешь готовый отформатированный пример репорта с одной строчкой в xml
— копи-пастишь как есть в aspx
— находишь строчку с данными и делаешь итерацию по датасету
— бинго! — красивый репорт за 15 мин
Зпт. у них активно используется, как разделитель групп разрядов
Правильная, хотя может быть и нестандартная (что тут вообще стандарт?):
Десятичный разделитель — зпт.
Разделитель групп разрядов — пробел
Возможно англоязычные разработчики не догадываются, что русские могут использовать запятую таким странным образом
Имеет смысл проверить на машине с en-US и с английским же форматом, а потом уже смотреть где валится на русской, да еще и с хитрой локалью.
В этой статье мы рассмотрим способы для выгрузки данных в xls/xlsx файл. Для примера был создан небольшой тестовый проект для демонстрации возможностей библиотек. Допустим у нас есть класс студент
public class Student { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public bool Gender { get; set; } public string phone { get; set; } public int Eng { get; set; } public int Math { get; set; } } |
Создадим функцию которая будет создавать фейковые данные студентов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/// <summary> /// Generate Random Student Data /// </summary> /// <param name=»count»>count</param> /// <returns>List<Student></returns> private List<Student> GenerateRandomData(int count) { Random rnd = new Random(); List<Student> students = new List<Student>(); for (int i = 0; i < count; i++) { students.Add(new Student() { Name = «name» + i.ToString(), Age = rnd.Next(10, 60), Gender = rnd.NextDouble() >= 0.5, ID = i, phone = «8987654321», Eng = rnd.Next(0, 100), Math = rnd.Next(0, 100) }); } return students; } |
Теперь рассмотрим способы выгрузить эти данные в excel.
Содержание
- NPOI
- Общие характеристики NPOI:
- Как использовать
- EPPlus
- Общие характеристики
- Как использовать
- ClosedXML
- Как использовать
- ClosedXML.Report
- Функции
- Как использовать
- OleDB
- Провайдеры данных
- Extended Properties
- Как использовать
NPOI
Этот проект является .NET версией проекта POI Java. С помощью NPOI вы можете легко читать/записывать файлы Office 2003/2007.
Общие характеристики NPOI:
a. Это абсолютно бесплатно для использования
b. Охват большинства функций Excel (стиль ячеек, формат данных, формула и т. д.)
c. Поддерживаемые форматы: xls, xlsx, docx.
d. Разработан для ориентации на интерфейс (взгляните на NPOI. Пространство имен SS)
e. Поддержка не только экспорта, но и импорта
f. Реальные успешные кейсы по всему миру
г. огромное количество базовых примеров
h. Работает как на Windows, так и на Linux
Подробно узнать о проекте можно по ссылке
Ниже указан способ выполнить экспорт с помощью NPOI
Как использовать
Установим библиотеку через NuGet
Подключим в код
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
List<Student> students = GenerateRandomData(100); XSSFWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(«Primer_NPOI»); //create the header row IRow headerRow = sheet.CreateRow(0); int count = 0; foreach (var item in typeof(Student).GetProperties()) { headerRow.CreateCell(count++).SetCellValue(item.Name); } //set the value for (int i = 1; i < students.Count() + 1; i++) { IRow row = sheet.CreateRow(i); count = 0; row.CreateCell(count++).SetCellValue(students[i — 1].ID); row.CreateCell(count++).SetCellValue(students[i — 1].Name); row.CreateCell(count++).SetCellValue(students[i — 1].Age); row.CreateCell(count++).SetCellValue(students[i — 1].Gender ? «М» : «Ж»); row.CreateCell(count++).SetCellValue(students[i — 1].phone); row.CreateCell(count++).SetCellValue(students[i — 1].Eng); row.CreateCell(count).SetCellValue(students[i — 1].Math); } try { //save file SaveFileDialog saveDialog = new SaveFileDialog() { DefaultExt = «.xlsx», FileName = «Primer_NPOI», Filter = «Excel |*.xlsx» }; if (saveDialog.ShowDialog() == true) { using (FileStream MS = new FileStream(saveDialog.FileName,FileMode.Create)) { workbook.Write(MS); } } } catch (Exception ex) { StatusText.Text = ex.Message; } |
- Создание, чтение и изменение книг Office Open XML (xslx и xlsm)
- Поддерживает как .NET Framework, так и .NET Core. Нет различий в наборе функций между фреймворками.
- Предоставляет простой в использовании, строго типизированный программный интерфейс, который тесно связан с хорошо известным API Excel VBA.
- Только управляемый код, без зависимостей от Microsoft Excel
- Закаленная в боях кодовая база после многих лет работы в качестве самой скачиваемой в мире библиотеки .NET для управления электронными таблицами. Качество, обеспечиваемое тысячами юнит-тестов.
- Исходный код EPPlus в открытом доступе на Github , распространяется под некоммерческой лицензией Polyform
Как использовать
Установка
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
List<Student> students = GenerateRandomData(100); using (ExcelPackage p = new ExcelPackage()) { ExcelWorksheet sheet = p.Workbook.Worksheets.Add(«EPPlus_Test»); //create the header row int count = 1; foreach (var item in typeof(Student).GetProperties()) { sheet.Cells[1, count].Style.Fill.PatternType = ExcelFillStyle.Solid; sheet.Cells[1, count].Style.Fill.BackgroundColor.SetColor(Color.Yellow); sheet.Cells[1, count++].Value = item.Name; } //set the value for (int i = 2; i < students.Count() + 2; i++) { count = 1; sheet.Cells[i, count++].Value = students[i — 2].ID; sheet.Cells[i, count++].Value = students[i — 2].Name; sheet.Cells[i, count++].Value = students[i — 2].Age; sheet.Cells[i, count++].Value = students[i — 2].Gender ? «М» : «Ж»; sheet.Cells[i, count++].Value = students[i — 2].phone; sheet.Cells[i, count++].Value = students[i — 2].Eng; sheet.Cells[i, count].Value = students[i — 2].Math; sheet.Cells[i, count].Style.Fill.PatternType = ExcelFillStyle.Solid; sheet.Cells[i, count].Style.Fill.BackgroundColor.SetColor(students[i — 2].Math < 60 ? Color.Red : Color.Transparent); } sheet.Column(4).AutoFit(); //condition format var ruleIcon = sheet.ConditionalFormatting.AddThreeIconSet(new ExcelAddress(2, 5, 10, 5), eExcelconditionalFormatting3IconsSetType.Signs); var colorformat = sheet.ConditionalFormatting.AddDatabar(new ExcelAddress(2, 6, 10, 6), Color.Blue); //add chart ExcelWorksheet sheet2 = p.Workbook.Worksheets.Add(«chart»); ExcelChart chart = sheet2.Drawings.AddChart(«NewChart», eChartType.Area3D); chart.Title.Text = «Title»; chart.Series.Add(sheet.Cells[2, 6, 6, 6], sheet.Cells[2, 1, 6, 1]); chart.SetPosition(4, 1, 1, 0); chart.SetSize(800, 400); chart.View3D.DepthPercent = 60; chart.View3D.Perspective = 15; chart.View3D.RotX = 20; chart.View3D.RotY = 15; try { //save file SaveFileDialog saveDialog = new SaveFileDialog() { DefaultExt = «.xlsx», FileName = «EPPlus_Test», Filter = «Excel |*.xlsx» }; if (saveDialog.ShowDialog() == true) { File.WriteAllBytes(saveDialog.FileName, p.GetAsByteArray()); //p.SaveAs(new FileInfo(saveDialog.FileName)); } } catch (Exception ex) { StatusText.Text = ex.Message; } } } |
ClosedXML
ClosedXML — это библиотека .NET для чтения, обработки и записи файлов Excel 2007+ (.xlsx, XLSM). Он направлен на предоставление интуитивно понятного и удобного интерфейса для работы с базовым OpenXML API.
Ссылка на проект
Для получения дополнительной информации см. вики
Как использовать
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
List<Student> students = GenerateRandomData(100); XLWorkbook workbook = new XLWorkbook(); var sheet = workbook.Worksheets.Add(«ClosedXML_Test»); int count = 1; foreach (var item in typeof(Student).GetProperties()) { sheet.Cell(1, count).Style.Fill.PatternType = XLFillPatternValues.Solid; sheet.Cell(1, count).Style.Fill.BackgroundColor = XLColor.Yellow; sheet.Cell(1, count++).Value = item.Name; } for (int i = 2; i < students.Count() + 2; i++) { count = 1; sheet.Cell(i, count++).Value = students[i — 2].ID; sheet.Cell(i, count++).Value = students[i — 2].Name; sheet.Cell(i, count++).Value = students[i — 2].Age; sheet.Cell(i, count++).Value = students[i — 2].Gender ? «М» : «Ж»; sheet.Cell(i, count++).Value = students[i — 2].phone; sheet.Cell(i, count++).Value = students[i — 2].Eng; sheet.Cell(i, count).Value = students[i — 2].Math; sheet.Cell(i, count).Style.Fill.PatternType = XLFillPatternValues.None; sheet.Cell(i, count).Style.Fill.BackgroundColor = students[i — 2].Math < 60 ? XLColor.Red : XLColor.Transparent; } sheet.Column(4).AdjustToContents(); //condition format sheet.Range(2, 6, 10, 6).AddConditionalFormat().DataBar(XLColor.Orange).LowestValue().HighestValue(); sheet.Range(2, 3, 10, 3).AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2) .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, 45, XLCFContentType.Number) .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, 20, XLCFContentType.Number) .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, 10, XLCFContentType.Number); try { //save file SaveFileDialog saveDialog = new SaveFileDialog() { DefaultExt = «.xlsx», FileName = «ClosedXML», Filter = «Excel |*.xlsx» }; if (saveDialog.ShowDialog() == true) { workbook.SaveAs(saveDialog.FileName); } } catch (Exception ex) { StatusText.Text = ex.Message; } |
ClosedXML.Report
ClosedXML.Report — это инструмент для создания отчетов и анализа данных в приложениях .NET с помощью Microsoft Excel. Это . NET-библиотека для создания отчетов Microsoft Excel без необходимости установки Excel на компьютере, на котором выполняется код. С помощью ClosedXML.Report можно легко экспортировать любые данные из классов .NET в Excel с помощью XLSX-шаблона.
Функции
- Копирование форматирования ячеек
- Условное форматирование
- Вертикальные и горизонтальные таблицы и поддиапазоны
- Возможность реализации формул Excel
- Использование динамически вычисляемых формул с синтаксисом C # и Linq
- Операции с табличными данными: сортировка, группировка, суммарные функции.
- Сводные таблицы
- Поддиапазоны
Как использовать
ClosedXML/ClosedXML.Report: ClosedXML.Report is a tool for report generation with which you can easily export any data from your .NET classes to Excel using a XLSX-template. (github.com)
OleDB
Провайдеры данных
Для работы с Excel 2003 (.Xls) можно использовать провайдер Microsoft Jet OLE DB 4.0.
SELECT * FROM OPENROWSET( ‘Microsoft.Jet.OLEDB.4.0’, ‘Excel 12.0;Database=d:tmpTimeSheets.xlsx;HDR=YES;IMEX=1’, ‘SELECT * FROM [Sheet1$]’); |
Для работы с Excel 2007 (.Xlsx) — Microsoft ACE OLEDB 12.0.
SELECT * FROM OPENROWSET ( ‘Microsoft.ACE.OLEDB.12.0’, ‘Excel 12.0;Database=d:tmpTimeSheets.xlsx;HDR=YES;IMEX=1’, ‘SELECT * FROM [Sheet1$]’); |
В Windows 10 открыть настройки источников данных ODBC можно написав «Источники данных ODBC» или через Панель управления Администрирование.
Extended Properties
HDR=YES|NO
. HDR=YES означает, что первую строку листа, следует рассматривать как заголовки колонок. Т.о. значение из первой строки можно использовать как имена полей в sql запросах (любых: select, insert, update, delete).IMEX=1|3
. 1 — открыть соединение для чтения. 3 — для записи.
Как использовать
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
List<Student> students = GenerateRandomData(100); try { SaveFileDialog saveDialog = new SaveFileDialog() { DefaultExt = «.xlsx», FileName = «Sample», Filter = «Excel |*.xlsx» }; if (saveDialog.ShowDialog() == true) { string Connstring = $«Provider=Microsoft.ACE.OLEDB.12.0;Data Source={saveDialog.FileName};Extended Properties=’Excel 12.0 Xml;HDR=YES;'»; using (OleDbConnection Conn = new OleDbConnection(Connstring)) { await Conn.OpenAsync(); //create sheet string sql = «CREATE TABLE Test (ID int,Name VarChar,Age int,Gender VarChar,phone VarChar,Eng int,Math int)»; using (OleDbCommand cmd = new OleDbCommand(sql, Conn)) { await cmd.ExecuteNonQueryAsync(); //insert data cmd.CommandText = «Insert into Test values (@ID,@Name,@Age,@Gender,@phone,@Eng,@Math)»; for (int i = 0; i < students.Count; i++) { cmd.Parameters.Clear(); cmd.Parameters.Add(«@ID», OleDbType.Integer).Value = students[i].ID; cmd.Parameters.Add(«@Name», OleDbType.VarChar).Value = students[i].Name; cmd.Parameters.Add(«@Age», OleDbType.Integer).Value = students[i].Age; cmd.Parameters.Add(«@Gender», OleDbType.VarChar).Value = students[i].Gender ? «М» : «Ж»; cmd.Parameters.Add(«@phone», OleDbType.VarChar).Value = students[i].phone; cmd.Parameters.Add(«@Eng», OleDbType.Integer).Value = students[i].Eng; cmd.Parameters.Add(«@Math», OleDbType.Integer).Value = students[i].Math; await cmd.ExecuteNonQueryAsync(); } } } } } catch (Exception ex) { StatusText.Text = ex.Message; } |
Скачать проект