Экспорт данных из базы данных в Excel - важнейшая задача для многих организаций, позволяющая пользователям легко анализировать, визуализировать и обмениваться информацией. Этот процесс обеспечивает беспрепятственный перенос данных, сохраняя целостность и структуру исходного набора данных и предоставляя удобный для пользователя формат.
В этой статье я расскажу о пяти уникальных подходах к экспорту данных из базы данных MySQL в файл Excel, используя различные библиотеки C# Excel. Я также приведу краткое сравнение этих библиотек, подчеркнув их особенности, производительность, цену и другие важные моменты.
Шаги по экспорту данных из базы данных в Excel с помощью библиотеки C#
Экспорт данных в Excel с помощью Microsoft.Office.Interop.Excel
Экспорт данных в Excel с помощью EPPlus
Экспорт данных в Excel с помощью NPOI
Экспорт данных в Excel с помощью ClosedXML
Экспорт данных в Excel с помощью Free Spire.XLS for .NET
Сравнение библиотек C# Excel
Шаги по экспорту данных из базы данных в Excel с помощью библиотеки C#
Создайте проект на C# и импортируйте необходимые библиотеки.
Установите соединение с базой данных.
Выполните SQL-запрос для получения экспортируемых данных и сохраните их в DataTable или аналогичной структуре данных.
С помощью библиотеки Excel создайте новую рабочую книгу и добавьте рабочий лист.
Вставьте данные из DataTable в соответствующие ячейки рабочего листа.
Сохраните рабочую книгу по указанному пути к файлу.
Экспорт данных в Excel с помощью Microsoft.Office Interop.Excel
Microsoft.Office.Interop.Excel - это проприетарная библиотека, предоставляемая компанией Microsoft в составе пакета Microsoft Office. Она позволяет разработчикам автоматизировать и взаимодействовать с Excel, но требует установки Microsoft Excel на машине, где выполняется код.
Сама библиотека Microsoft.Office.Interop.Excel бесплатна, так как поставляется вместе с Microsoft Office. Однако для его использования на машине должна быть установлена лицензионная копия Microsoft Office. Кроме того, убедитесь, что версия библиотеки Office Interop соответствует версии установленного Office, поскольку несоответствие может привести к ошибкам типа «System.IO.FileNotFoundException: Не удалось загрузить файл или сборку».
Установите необходимые библиотеки:
Install-Package MySql.Data
Install-Package Microsoft.Office.Interop.Excel
Напишите код:
using System.Data;
using MySql.Data.MySqlClient;
using Excel = Microsoft.Office.Interop.Excel;
namespace ExportDataToExcelUsingInterop
{
class Program
{
static void Main(string[] args)
{
// Строка подключения к базе данных MySQL
string connectionString = "Server=localhost;Database=exceldata;User ID=root;Password=admin;";
// SQL-запрос для получения данных
string query = "SELECT * FROM excel_table";
// Создайте соединение с базой данных MySQL
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
// Заполните DataTable данными из базы данных
adapter.Fill(dataTable);
// Создайте экземпляр Excel
Excel.Application excelApp = new Excel.Application();
excelApp.Visible = false;
// Создайте новую книгу
Excel.Workbook workbook = excelApp.Workbooks.Add();
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];
// Добавьте заголовки столбцов в рабочий лист
for (int i = 0; i < dataTable.Columns.Count; i++)
{
worksheet.Cells[1, i + 1] = dataTable.Columns[i].ColumnName;
}
// Добавьте данные в рабочий лист
for (int i = 0; i < dataTable.Rows.Count; i++)
{
for (int j = 0; j < dataTable.Columns.Count; j++)
{
worksheet.Cells[i + 2, j + 1] = dataTable.Rows[i][j];
}
}
// Сохраните файл Excel
workbook.SaveAs("ExportedData.xlsx");
workbook.Close();
excelApp.Quit();
// Освободите объекты COM
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
}
}
}
}
Экспорт данных в Excel с помощью EPPlus
EPPlus - это библиотека Excel для C# .NET Core и Framework с открытым исходным кодом. Она основана на формате OpenXML и использует пространство имен OfficeOpenXml. Она предоставляет простой и удобный API для создания, чтения и работы с файлами Excel в формате .xlsx, не требуя установки Microsoft Excel.
Примечание: Начиная с версии 5, EPPlus перешел на модель двойного лицензирования. Она допускает бесплатное использование в проектах с открытым исходным кодом, но требует коммерческой лицензии для использования в коммерческой деятельности.
Установите необходимые библиотеки:
Install-Package EPPlus
Install-Package MySql.Data
Напишите код:
using System;
using System.Data;
using MySql.Data.MySqlClient;
using OfficeOpenXml;
namespace ExportDataToExcelUsingEPPlus
{
class Program
{
static void Main(string[] args)
{
// Строка подключения к базе данных MySQL
string connectionString = "Server=localhost;Database=exceldata;User ID=root;Password=admin;";
// SQL-запрос для получения данных
string query = "SELECT * FROM excel_table";
// Создайте соединение с базой данных MySQL
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
// Заполните DataTable результатами запроса
adapter.Fill(dataTable);
// Укажите тип лицензии как Некоммерческая
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// Создайте новый пакет Excel для работы с файлами Excel
using (ExcelPackage excelPackage = new ExcelPackage())
{
// Добавьте новый рабочий лист в пакет Excel
var worksheet = excelPackage.Workbook.Worksheets.Add("Sheet1");
// Загрузите DataTable в рабочий лист Excel
worksheet.Cells["A1"].LoadFromDataTable(dataTable, true);
// Сохраните файл Excel
excelPackage.SaveAs(new FileInfo("ExportedData.xlsx"));
}
}
}
}
}
Экспорт данных в Excel с помощью NPOI
NPOI - это библиотека .NET с открытым исходным кодом для чтения и записи документов Microsoft Office, включая файлы Excel, Word и PowerPoint. Библиотека поддерживает широкий спектр функций, включая импорт и экспорт данных, форматирование ячеек, формулы, диаграммы и поворотные таблицы, что делает ее подходящей как для простых, так и для сложных операций с Excel.
Установите необходимые библиотеки:
Install-Package NPOI
Install-Package MySql.Data
Напишите код:
using MySql.Data.MySqlClient;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
namespace ExportDataToExcelUsingNPOI
{
class Program
{
static void Main(string[] args)
{
// Строка подключения к базе данных MySQL
string connectionString = "Server=localhost;Database=exceldata;User ID=root;Password=admin;";
// SQL-запрос для получения данных
string query = "SELECT * FROM excel_table";
// Создайте соединение с базой данных MySQL
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
// Заполните DataTable данными из базы данных
adapter.Fill(dataTable);
// Создайте новую книгу Excel
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Sheet1");
// Создайте строку заголовка
IRow headerRow = sheet.CreateRow(0);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
// Установите имена столбцов
headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);
}
// Заполните лист данными из DataTable
for (int i = 0; i < dataTable.Rows.Count; i++)
{
// Создайте новую строку
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dataTable.Columns.Count; j++)
{
// Установите значение ячейки
row.CreateCell(j).SetCellValue(dataTable.Rows[i][j].ToString());
}
}
// Сохраните файл Excel
using (var fileData = new FileStream("ExportedData.xlsx", FileMode.Create))
{
// Запишите книгу в файл
workbook.Write(fileData);
}
}
}
}
}
Экспорт данных в Excel с помощью ClosedXML
ClosedXML - это библиотека .NET, которая упрощает создание и работу с файлами Excel в формате OpenXML (.xlsx). Это библиотека с открытым исходным кодом и свободна для использования в соответствии с лицензией MIT. Это означает, что вы можете использовать ее как в личных, так и в коммерческих проектах без каких-либо лицензионных отчислений или ограничений.
Установите необходимые библиотеки:
Install-Package ClosedXML
Install-Package MySql.Data
Напишите код:
using System;
using System.Data;
using MySql.Data.MySqlClient;
using ClosedXML.Excel;
namespace ExportDataToExcelUsingClosedXML
{
class Program
{
static void Main(string[] args)
{
// Строка подключения к базе данных MySQL
string connectionString = "Server=localhost;Database=exceldata;User ID=root;Password=admin;";
// SQL-запрос для получения данных
string query = "SELECT * FROM excel_table";
// Создайте соединение с базой данных MySQL
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
// Заполните DataTable данными из базы данных
adapter.Fill(dataTable);
// Создайте новую книгу Excel
using (var workbook = new XLWorkbook())
{
// Добавьте новый рабочий лист в книгу
var worksheet = workbook.Worksheets.Add("Sheet1");
// Вставьте DataTable в рабочий лист, начиная с ячейки A1
worksheet.Cell(1, 1).InsertTable(dataTable, false);
// Сохраните файл Excel
workbook.SaveAs("ExportedData.xlsx");
}
}
}
}
}
Экспорт данных в Excel с помощью Free Spire.XLS for .NET
Free Spire.XLS for .NET - это универсальная библиотека, позволяющая разработчикам создавать, читать и изменять файлы Excel в форматах .xlsx и .xls. Благодаря простому API она поддерживает такие функции, как форматирование данных, вычисление формул и создание диаграмм.
Эта библиотека идеально подходит для автоматизации операций с Excel в приложениях .NET без необходимости использования Microsoft Office, предлагая бесплатную версию с необходимыми возможностями для различных задач разработки.
Установите необходимые библиотеки:
Install-Package FreeSpire.XLS
Install-Package MySql.Data
Напишите код:
using Spire.Xls;
using System.Data;
using MySql.Data.MySqlClient;
namespace ExportDataToExcelUsingSpireXLS
{
class Program
{
static void Main(string[] args)
{
// Строка подключения к базе данных MySQL
string connectionString = "Server=localhost;Database=exceldata;User ID=root;Password=admin;";
// SQL-запрос для получения данных
string query = "SELECT * FROM excel_table";
// Создайте новую книгу Excel
Workbook workbook = new Workbook();
// Получите первый рабочий лист
Worksheet worksheet = workbook.Worksheets[0];
// Создайте соединение с базой данных MySQL
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
// Заполните DataTable результатами запроса
adapter.Fill(dataTable);
// Вставьте DataTable в рабочий лист
worksheet.InsertDataTable(dataTable, true, 1, 1);
}
// Сохраните книгу в файл
workbook.SaveToFile("ImportedData.xlsx", ExcelVersion.Version2010);
}
}
}
Сравнение библиотек C# Excel
Эта статья посвящена базовой функциональности библиотеки C# Excel, а именно записи данных на рабочий лист. В ней не рассматриваются более продвинутые возможности, такие как применение условного форматирования, фильтрация данных или создание поворотных таблиц для анализа данных. Я широко использовал эти библиотеки и привожу следующие сравнения, основанные на моем опыте.
Вот сравнение Microsoft.Office.Interop.Excel, EPPlus, NPOI, ClosedXML и Free Spire.XLS для .NET по цене, производительности, простоте использования, возможностям и наилучшим вариантам применения:
Заключение
В этой статье блога рассмотрены пять различных методов экспорта данных из базы данных в Excel с помощью различных библиотек C# Excel. У каждой библиотеки есть свои сильные стороны и возможности. Вы можете выбрать ту, которая соответствует конкретным требованиям вашего проекта.
Комментарии (4)
VasiliyLiGHT
14.10.2024 10:12О, таких статей я прочитал достаточно, об этом пишут многие)) Но практически никто не заходит дальше. Например, как работать с OLE объектами? В случае с Interop.Excel всё просто (но для работы нужен офисный пакет на машине):
Application excel = new() { Visible = false }; Workbook book = excel.Workbooks.Open(fileName); Worksheet sheet = book.Worksheets[1]; OLEObjects objects = sheet.OLEObjects(); objects.Delete(); book.SaveAs(fileName2); book.Close(); excel.Quit(); Marshal.ReleaseComObject(sheet); Marshal.ReleaseComObject(book); Marshal.ReleaseComObject(excel);
В NPOI (она же Apache POI) вроде что-то есть, но документация какая-то дурацкая. В остальных библиотеках нагуглить не получилось.
Пользуясь случаем, задам вопрос: как в NPOI корректно удалить "встроенные объекты"? Например, юзеры вставляют pdfки в файлы экселя, и перед копированием на сервер эти файлы нужно почистить. Набросал код:
using FileStream file = new(fileName, FileMode.Open, FileAccess.Read); POIFSFileSystem fs = new(file); DirectoryNode root = fs.Root; var mbds = root.Where(r => r.Name.StartsWith("MBD")).ToList(); List<DocumentEntry> docs = []; foreach (var mbd in mbds.Cast<DirectoryEntry>()) { var entries = mbd.Entries; while (entries.MoveNext()) { var entry = (DocumentEntry)entries.Current; docs.Add(entry); } } docs.ForEach(doc => doc.Delete()); mbds.ForEach(mbd => mbd.Delete()); using FileStream _out = new(fileName2, FileMode.Create, FileAccess.Write); fs.WriteFileSystem(_out); fs.Close();
При вызове метода
Delete()
изменения вroot
происходят, но в конечном файле ничего не меняется. Как всё-таки нужно фиксировать эти изменения?Документация: https://poi.apache.org/components/poifs/how-to.html
ALexKud
14.10.2024 10:12Самый простой способ импорта из БД в Excell это в самом Excell использовать вкладку Данные, создать подключение к БД и его настроить, создав SQL запрос. Без всяких языков прораммирования, только через SQL. А в общем я использую Excell в своих системах через OLE Automation вместо генератора отчетов. Это в общем несложно (если знаешь как рулить командами Excell ) и дает большую свободу для работы с шаблонами отчетов, к тому же отчет получается редактируемым и пользователи могут сохранять его куда им надо.
gyzl
Подскажите, какая из них может писать генерируемый Excel файл в однонаправленный write-only поток, который, например, предоставляет ASP.NET в Request.Body? Ну то есть чтобы можно было начать отдавать файл в процессе генерации.
vabka
Из-за того как устроен сам формат xlsx - такие вряд-ли существуют.
Возможно вам стоит посмотреть в сторону других форматов