跳至页脚内容
使用 IRONXL

使用IronXL在 C# 中将 SQL 数据导出到 Excel

对于构建报表系统、数据分析工具和业务应用程序的.NET开发人员来说,将数据从 SQL Server 导出到 Microsoft Excel 是一项常见的任务。 本教程将向您展示如何使用IronXL (一个.NET Excel 库,无需安装 Microsoft Office 即可处理整个过程)将 SQL 数据导出到 Excel。

开始免费试用,跟随下面的代码示例学习。

立即开始使用 IronXL。
green arrow pointer

如何安装IronXL进行 SQL 数据导出?

在编写任何代码之前,您需要将IronXL添加到您的项目中。 最快的方法是通过 Visual Studio 中的NuGet包管理器控制台:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

或者,使用.NET CLI:

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

安装完成后,在文件顶部添加所需的命名空间。对于.NET 10 顶级语句,您的设置如下所示:

using IronXL;
using System.Data;
using System.Data.SqlClient;
using IronXL;
using System.Data;
using System.Data.SqlClient;
$vbLabelText   $csharpLabel

IronXL 的目标平台是.NET Standard 2.0 及更高版本,因此无需任何额外配置即可与.NET 10、 .NET Framework、 ASP.NET Core和Blazor项目配合使用。 您可以在NuGet上找到该软件包。

从 SQL Server 数据库导出数据的最佳方法是什么?

将 SQL Server 中的数据导出到 Excel 文件的最有效方法包括三个步骤:建立数据库连接,将数据检索到 DataTable,然后使用IronXL将数据写入 Excel 工作表。 与 Microsoft Interop 解决方案不同, IronXL可以独立运行,并能处理大型数据集,而不会因 COM 互操作开销而导致性能瓶颈。

核心模式很简单。 SqlDataAdapterMicrosoft ADO .NET数据访问框架的一部分,自.NET 1.0 以来一直是使用关系数据库填充 DataTable 对象的标准方法:

  1. 使用您的连接字符串打开一个 SqlConnection
  2. 使用 SqlDataAdapter 填写 DataTableDataSet
  3. 调用IronXL方法创建工作簿并填充工作表单元格
  4. 将工作簿另存为 .xlsx.xls

该方法与 SQL Server 2012 及更高版本、Azure SQL 数据库、Amazon RDS for SQL Server 以及任何 ADO.NET 兼容的数据源兼容。 无论是使用控制台应用程序还是基于 Web 的报表工具,都适用相同的模式。

如何连接到 SQL Server 并检索数据?

在导出 SQL 数据之前,您需要建立连接并执行 SQL 查询来填充 DataTable。 连接字符串包含访问数据所需的 SQL Server 数据库凭证和服务器信息。

以下示例查询 无rthwind Customers 表,并使用IronXL 的单元格写入 API将每一行写入 Excel 工作表:

using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Data Source=localhost;Initial Catalog=无rthwind;Integrated Security=True";
string sql = "SELECT * FROM Customers";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataTable dt = new DataTable();
adapter.Fill(dt);

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Customers");

// Write column headers
for (int col = 0; col < dt.Columns.Count; col++)
{
    workSheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}

// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        workSheet.SetCellValue(row + 1, col, dt.Rows[row][col].ToString());
    }
}

workBook.SaveAs("CustomerExport.xlsx");
using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Data Source=localhost;Initial Catalog=无rthwind;Integrated Security=True";
string sql = "SELECT * FROM Customers";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataTable dt = new DataTable();
adapter.Fill(dt);

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Customers");

// Write column headers
for (int col = 0; col < dt.Columns.Count; col++)
{
    workSheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}

// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        workSheet.SetCellValue(row + 1, col, dt.Rows[row][col].ToString());
    }
}

workBook.SaveAs("CustomerExport.xlsx");
$vbLabelText   $csharpLabel

输出

如何使用IronXL和 C# 将 SQL 数据导出到 Excel:图 1 - 生成的 Excel 文件

该代码将创建一个 Excel 文件,并根据 SQL Server 表结构创建格式正确的列标题。 DataTable dt 存储查询结果,然后使用从零开始的行和列索引系统地将结果写入每个单元格。 IronXL同时支持 .xls.xlsx 格式,以广泛兼容 Microsoft Office 应用程序。

如果您的 SQL 表包含 DateTime 或数值列,请在调用 SetCellValue 之前适当地转换单元格值。 直接传递数值类型可以保留 Excel 数据类型,并允许对导出的列进行排序和公式计算。

如何使用 LoadWorkSheetsFromDataSet 导出多个表格?

当您的报告需要来自多个 SQL 表(例如,产品和类别)的数据时,您可以将它们加载到 DataSet 中,并让IronXL自动为每个表创建一个工作表。 这是将数据集或数据表导出到 Excel 的最简洁方法。

using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Data Source=.;Initial Catalog=Inventory;Integrated Security=True";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlDataAdapter productsAdapter = new SqlDataAdapter("SELECT * FROM Products", connection);
SqlDataAdapter categoriesAdapter = new SqlDataAdapter("SELECT * FROM Categories", connection);

DataSet dataSet = new DataSet();
productsAdapter.Fill(dataSet, "Products");
categoriesAdapter.Fill(dataSet, "Categories");

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook);

workBook.SaveAs("InventoryReport.xlsx");
using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Data Source=.;Initial Catalog=Inventory;Integrated Security=True";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlDataAdapter productsAdapter = new SqlDataAdapter("SELECT * FROM Products", connection);
SqlDataAdapter categoriesAdapter = new SqlDataAdapter("SELECT * FROM Categories", connection);

DataSet dataSet = new DataSet();
productsAdapter.Fill(dataSet, "Products");
categoriesAdapter.Fill(dataSet, "Categories");

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook);

workBook.SaveAs("InventoryReport.xlsx");
$vbLabelText   $csharpLabel

输出

如何使用IronXL和 C# 将 SQL 数据导出到 Excel:图 4 - 带有列标题的生成文件

LoadWorkSheetsFromDataSet 读取 TableName 属性,该属性位于 DataTable 内部,并创建一个匹配的工作表标签。 来自 DataTable 的列名将成为每个工作表中的标题行。 此方法对于返回多个结果集的存储过程特别有用,因为您可以使用多个 DataSet 调用来填充 SqlDataAdapter,然后一步导出所有内容。

对于需要以编程方式创建具有自定义格式的 Excel 文件的应用程序,您仍然可以在调用 LoadWorkSheetsFromDataSet 后访问各个工作表,并在保存之前应用样式、列宽或公式。

如何使用 ASP.NET 导出按钮导出数据?

对于 Web 应用程序,通常在用户单击按钮时触发导出。 以下ASP.NET Web Forms 示例演示了如何处理按钮单击事件、如何从 SQL 查询构建 Excel 工作簿以及如何使用 Response.AddHeader 将文件作为下载推送到浏览器:

using IronXL;
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web.UI;

public partial class ExportPage : Page
{
    private void ExportButton_Click(object sender, EventArgs e)
    {
        string connectionString = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True";

        using SqlConnection connection = new SqlConnection(connectionString);
        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Orders", connection);
        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet);

        WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook);

        byte[] fileBytes = workBook.ToByteArray();
        string filename = "OrdersExport.xlsx";

        Response.Clear();
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment;filename=" + filename);
        Response.BinaryWrite(fileBytes);
        Response.End();
    }
}
using IronXL;
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web.UI;

public partial class ExportPage : Page
{
    private void ExportButton_Click(object sender, EventArgs e)
    {
        string connectionString = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True";

        using SqlConnection connection = new SqlConnection(connectionString);
        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Orders", connection);
        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet);

        WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkBook.LoadWorkSheetsFromDataSet(dataSet, workBook);

        byte[] fileBytes = workBook.ToByteArray();
        string filename = "OrdersExport.xlsx";

        Response.Clear();
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment;filename=" + filename);
        Response.BinaryWrite(fileBytes);
        Response.End();
    }
}
$vbLabelText   $csharpLabel

导出按钮示例

如何使用IronXL和 C# 将 SQL 数据导出到 Excel:图 2 - 导出按钮 UI 示例

输出

如何使用IronXL和 C# 将 SQL 数据导出到 Excel:图 3 - 生成的文件

ToByteArray() 方法将整个工作簿转换为内存中的字节数组,然后您可以将其直接写入 HTTP 响应流。 这样可以避免将临时文件写入磁盘。 与需要 object misValue 占位符和服务器上安装的 Office 许可证的 Microsoft Interop 不同, IronXL完全在托管代码中运行,没有任何外部依赖项。

对于ASP.NET Core和Razor Pages 项目,请将控制器操作中的 Response.BinaryWrite 替换为 return File(fileBytes, contentType, filename)ASP.NET Core导出到 Excel 的模式遵循相同的从工作簿到字节数组的方法。

如何向导出的Excel文件添加格式和列标题?

原始 SQL 导出文件在与最终用户共享之前通常需要进行格式优化。 IronXL允许您在数据写入工作表后控制单元格样式、列宽和数字格式。 以下示例演示了如何将标题行加粗以及如何自动调整列宽:

using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlDataAdapter adapter = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate, Total FROM Orders", connection);
DataTable dt = new DataTable();
adapter.Fill(dt);

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Orders");

// Write and style header row
for (int col = 0; col < dt.Columns.Count; col++)
{
    workSheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    workSheet[0, col].Style.Font.Bold = true;
    workSheet[0, col].Style.Font.Height = 12;
}

// Write data rows with type-aware value assignment
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        object value = dt.Rows[row][col];
        if (value is DateTime date)
            workSheet.SetCellValue(row + 1, col, date.ToString("yyyy-MM-dd"));
        else if (value is decimal || value is double || value is int)
            workSheet.SetCellValue(row + 1, col, Convert.ToDouble(value));
        else
            workSheet.SetCellValue(row + 1, col, value.ToString());
    }
}

workBook.SaveAs("FormattedOrdersExport.xlsx");
using IronXL;
using System.Data;
using System.Data.SqlClient;

string connectionString = "Data Source=localhost;Initial Catalog=Sales;Integrated Security=True";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

SqlDataAdapter adapter = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate, Total FROM Orders", connection);
DataTable dt = new DataTable();
adapter.Fill(dt);

WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Orders");

// Write and style header row
for (int col = 0; col < dt.Columns.Count; col++)
{
    workSheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
    workSheet[0, col].Style.Font.Bold = true;
    workSheet[0, col].Style.Font.Height = 12;
}

// Write data rows with type-aware value assignment
for (int row = 0; row < dt.Rows.Count; row++)
{
    for (int col = 0; col < dt.Columns.Count; col++)
    {
        object value = dt.Rows[row][col];
        if (value is DateTime date)
            workSheet.SetCellValue(row + 1, col, date.ToString("yyyy-MM-dd"));
        else if (value is decimal || value is double || value is int)
            workSheet.SetCellValue(row + 1, col, Convert.ToDouble(value));
        else
            workSheet.SetCellValue(row + 1, col, value.ToString());
    }
}

workBook.SaveAs("FormattedOrdersExport.xlsx");
$vbLabelText   $csharpLabel

将标题行的文本加粗并增大字体,可以使导出的报告在 Excel 中更容易阅读。 对于总计或计数等数字列,传递 double 值而不是字符串,可以使 Excel 的原生排序和聚合功能在导出的数据上正常工作。

您可以在IronXL单元格格式设置文档中探索所有格式设置选项,包括单元格边框、背景颜色和数字格式掩码。

如何高效处理大型 SQL 数据集?

对于拥有数万行数据的表来说,内存管理就显得尤为重要。 在写入 Excel 之前将整个结果集加载到 DataTable 中对于大多数报告来说效果很好,但对于非常大的导出,您可以分批处理行或直接使用 SqlDataReader

处理大批量出口业务时,请考虑以下策略:

-使用 SQL OFFSET/FETCH 进行分页:将大型导出数据拆分为多个工作表,每个工作表包含一页结果。 这样可以确保 Excel 中各个工作表的大小易于管理。 -流式传输到磁盘:在每个批次之后调用 workBook.SaveAs(filePath),而不是像 ToByteArray() 那样将所有内容保存在内存中。 -限制所选列:在 SELECT 语句中使用显式列列表,而不是 SELECT *,以减少从 SQL Server 传输的数据量。

如需了解在 C# 中将 DataTable 导出到 Excel 的最快方法, IronXL博客有一篇专门的基准测试文章,比较了不同的方法及其内存使用情况。

WorkBook.LoadWorkSheetsFromDataSet 方法对于中等大小的 DataSet 对象来说特别高效,因为它在内部处理行迭代。 具体来说,对于将 DataTable 导出到 Excel 的场景,这种方法可以减少样板代码,并针对批量写入进行了优化。

如何将数据从 Excel 导入回 SQL Server?

对于许多报表应用程序来说,导出工作流程只是其中的一部分。 您可能还需要允许用户下载模板、填写数据,然后将其重新上传到 SQL Server。 IronXL使这种双向工作流程变得简单易行。

要将Excel 数据导入数据库,请使用 WorkBook.Load(filePath) 加载上传的文件,遍历工作表行,并使用参数化 SqlCommand 插入每一行:

using IronXL;
using System.Data.SqlClient;

WorkBook workBook = WorkBook.Load("UploadedData.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

string connectionString = "Data Source=localhost;Initial Catalog=Inventory;Integrated Security=True";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

// Skip header row, start at row index 1
for (int row = 1; row <= sheet.RowCount; row++)
{
    string productName = sheet[row, 0].StringValue;
    int quantity = (int)sheet[row, 1].DoubleValue;
    decimal price = (decimal)sheet[row, 2].DoubleValue;

    using SqlCommand cmd = new SqlCommand(
        "INSERT INTO Products (Name, Quantity, Price) VALUES (@name, @qty, @price)",
        connection);
    cmd.Parameters.AddWithValue("@name", productName);
    cmd.Parameters.AddWithValue("@qty", quantity);
    cmd.Parameters.AddWithValue("@price", price);
    cmd.Execute无nQuery();
}
using IronXL;
using System.Data.SqlClient;

WorkBook workBook = WorkBook.Load("UploadedData.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

string connectionString = "Data Source=localhost;Initial Catalog=Inventory;Integrated Security=True";

using SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

// Skip header row, start at row index 1
for (int row = 1; row <= sheet.RowCount; row++)
{
    string productName = sheet[row, 0].StringValue;
    int quantity = (int)sheet[row, 1].DoubleValue;
    decimal price = (decimal)sheet[row, 2].DoubleValue;

    using SqlCommand cmd = new SqlCommand(
        "INSERT INTO Products (Name, Quantity, Price) VALUES (@name, @qty, @price)",
        connection);
    cmd.Parameters.AddWithValue("@name", productName);
    cmd.Parameters.AddWithValue("@qty", quantity);
    cmd.Parameters.AddWithValue("@price", price);
    cmd.Execute无nQuery();
}
$vbLabelText   $csharpLabel

参数化查询可以防止读取用户提供的 Excel 数据时发生 SQL 注入攻击。 Microsoft Learn 上的 SqlCommand 文档涵盖了所有可用的重载和参数绑定模式。 在插入数据之前,务必验证单元格值——检查是否存在空字符串、超出范围的数字以及可能导致 SQL Server 表约束冲突的意外数据类型。

对于反向操作, IronXL还支持在 C# 中读取 CSV 文件,以应对数据源生成逗号分隔输出而不是 .xlsx 文件的情况。

您如何将IronXL与其他出口方式进行比较?

在.NET中,有多种方法可以将 SQL 数据导出到 Excel。 下表总结了主要权衡取舍:

.NET中 SQL 到 Excel 导出方法——功能比较
方法 办公室要求 数据集支持 格式化 服务器安全
IronXL 是的(内置) 完整样式、配方
Microsoft Interop 手动迭代 通过 COM 完全 否(COM 服务器)
EPPlus 手动迭代 广泛的
NPOI 手动迭代 好的
CSV 输出 手册

Microsoft Interop 要求服务器上安装 Office,并且不支持服务器端 Web 应用程序。 IronXL、 EPPlusNPOI都无需 Office 即可运行。IronXL 的优势在于其一流的 DataSetDataTable 支持(通过 LoadWorkSheetsFromDataSet),与其他库中手动逐行迭代导出相比,这可以将导出代码减少到几行。

有关详细的对比分析,请参阅Microsoft Office Interop 替代方案文章。

下一步计划是什么?

有了 IronXl.Excel,使用 C# 将 SQL 数据导出到 Excel 变得简单易行。 该库消除了复杂的互操作依赖关系,同时为 DataSet 和直接数据库集成提供了强大的支持。 无论是构建控制台应用程序还是具有文件下载功能的基于 Web 的报表系统, IronXL都能在所有.NET 10 项目类型中提供可靠的 Excel 文件生成功能。

为了在此基础上继续深入学习,请探索以下相关资源:

-使用 C# 创建 Excel 文件——工作簿创建和格式化的完整教程 -将数据集和数据表导出到 Excel -- LoadWorkSheetsFromDataSet 方法的官方操作指南

购买许可证即可进行生产部署,或者继续使用免费试用版探索,在您的.NET项目中测试此 Excel 库的全部功能。

常见问题解答

如何使用 C# 将 SQL 数据导出到 Excel?

您可以使用IronXL通过 C #将 SQL 数据导出到 Excel。使用 SqlConnection 和 SqlDataAdapter 连接到 SQL Server,填充 DataTable,然后使用IronXL创建工作簿并将数据行写入 Excel。IronXL 不需要安装 Microsoft Office。

使用 IronXL 导出 SQL 数据的前提条件是什么?

要使用IronXL导出 SQL 数据,您需要一个.NET项目(Framework、Core 或.NET 10+),对 SQL Server 数据库的访问权限,以及通过Install-Package IronXL .Excel 安装的IronXL NuGet包。

使用 IronXl.Excel 将 SQL 数据导出到 Excel 是否需要安装 Microsoft Office?

不, IronXL允许您将 SQL 数据导出到 Excel,而无需在您的系统或服务器上安装 Microsoft Office。

IronXl.Excel 能否在将 SQL 数据导出到 Excel 时处理大型数据集?

是的, IronXL可以高效地处理大型数据集。对于非常大的导出数据,请使用 SQL OFFSET/FETCH 进行分页,使用 SaveAs 而不是 ToByteArray 写入磁盘,并在 SQL 查询中限制选定的列。

如何将多个 SQL 表导出到不同的 Excel 工作表中?

使用 WorkBook.LoadWorkSheetsFromDataSet 方法加载由多个 SqlDataAdapter 调用填充的 DataSet。IronXLIronXL为每个 DataTable 创建一个工作表,并根据 DataTable.TableName 属性为每个工作表命名。

如何在ASP.NET中触发 Excel 文件下载?

调用 `workBook.ToByteArray()` 将文件转换为字节数组,然后使用正确的 `Content-Type` 和 `Content-Disposition` 标头将其写入 HTTP 响应。在ASP.NET Core中,从控制器返回 `File(fileBytes, contentType, filename)`。

我可以使用IronXL将 Excel 数据导入 SQL Server 吗?

是的。使用 WorkBook.Load 加载 Excel 文件,使用 IronXL 的索引器遍历工作表行,并使用参数化的 SqlCommand 插入每一行,以防止 SQL 注入。

IronXL与 Microsoft Interop 在 SQL 数据导出方面相比如何?

IronXL不需要在服务器上安装 Office,它以托管代码形式运行,并原生支持使用 LoadWorkSheetsFromDataSet 导出数据集。Microsoft Interop 需要 COM 服务器,因此无法在 Web 服务器环境中稳定运行。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me