IRONSOFTWAREHOME
USING IRONXL

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

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

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

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

第一步:
arrow pointer

如何安装用于 SQL 数据导出的 IronXL?

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

PM > Install-Package IronXL.Excel

或者,使用.NET CLI:

dotnet add package IronXL.Excel

安装完成后,请在文件开头添加所需的命名空间。使用 .NET 10 的顶级语句时,您的代码结构如下所示:

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

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. 使用DataSet
  3. 调用 IronXL 方法创建工作簿并填充工作表单元格
  4. 将工作簿保存为.xls

此方案兼容 SQL Server 2012 及更高版本,同时也支持 Azure SQL Database、Amazon RDS for SQL Server 以及任何兼容 ADO.NET 的数据源。 无论您使用的是控制台应用程序还是基于 Web 的报表工具,该模式均适用。

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

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

以下示例通过 IronXL 的单元格写入 API 查询 无rthwind 数据库的 Customers 表,并将每行数据写入 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");

输出

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

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

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

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

当您的报告需要从多个SQL表中获取数据时 -- 例如,产品和类别 -- 您可以将它们加载到DataSet中,并让IronXL自动为每个表创建一个工作表。 这是将 DataSet 或 DataTable 导出到 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");

输出

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

LoadWorkSheetsFromDataSet 读取DataTable的属性,并创建一个匹配的工作表标签页。 来自DataTable的列名成为每个工作表的标题行。 这种方法特别适用于返回多个结果集的存储过程,因为您可以使用多个DataSet,然后在一步中导出所有内容。

对于需要以编程方式创建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();
    }
}

导出按钮示例

如何使用IronXL通过C#将SQL数据导出到Excel:图2 - 示例导出按钮界面

输出

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

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

对于ASP.NET Core和Razor Pages项目,从控制器操作中用Response.BinaryWriteASP.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");

将标题行设置为粗体并使用较大字体,可使导出的报告在 Excel 中更易于阅读。 对于例如总数或计数的数字列,传递double值而不是字符串可以使Excel的本地排序和聚合功能在导出数据时正确工作。

您可以在IronXL单元格格式文档中探索整套格式化选项,包括单元格边框、背景颜色和数字格式蒙版。

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

对于拥有数万行数据的表格,内存管理变得至关重要。 在写入Excel之前将整个结果集加载到SqlDataReader

处理大量导出任务时,请考虑以下策略:

  • 使用 SQL OFFSET/FETCH 进行分页:将大型导出数据拆分为多个工作表,每个工作表包含一页结果。 这样可以确保 Excel 中单个工作表的大小处于可控范围。
  • 流到磁盘: 在每个批次后调用ToByteArray()
  • 限制选定列: 在您的SELECT *,以减少从SQL Server传输的数据量。

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

DataSet对象特别有效,因为它在内部处理行迭代。 特别针对 DataTable 导出到 Excel 的场景,此方法可减少冗余代码,并针对批量写入进行了优化。

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

对于许多报表应用程序而言,导出工作流仅是整个流程的一半。 您可能还需要允许用户下载模板、填写数据,并将其重新上传至 SQL Server。 IronXL 使这种双向工作流变得简单直观。

将Excel数据导入数据库,加载上传的文件与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.ExecuteNonQuery();
}

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

对于相反的方向,IronXL还支持在C#中读取CSV文件,适用于数据源产生逗号分隔输出而不是.xlsx文件的场景。

IronXL 与其他导出方案相比如何?

在 .NET 中,有多种方法可以将 SQL 数据导出到 Excel。 下表总结了关键的权衡因素:

.NET 中的 SQL 转 Excel 导出方法——功能对比
方法办公室要求DataSet 支持格式要求服务器安全
IronXL是(内置)完整样式、公式
Microsoft Interop手动迭代完整内容请通过 COM 获取无(COM 服务器)
EPPlus手动迭代详尽
NPOI手动迭代好的
CSV 输出手册

Microsoft Interop 要求服务器上安装 Office,且不支持在服务器端 Web 应用程序中使用。 IronXL,EPPlusNPOI都可以在没有Office的情况下工作。IronXL的优势在于通过DataTable支持,与在其他库中手动行迭代相比,减少了导出代码到几行。

如需详细的对比分析,请参阅《Microsoft Office Interop 替代方案》一文。

下一步计划是什么?

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

为了在此基础上进一步拓展,请探索以下相关资源:

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

Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户