
在 C# 应用程序中,将界面控件中的表格数据导出为 Excel 是一种非常常见的需求。无论是在 WinForms 还是 ASP.NET 项目中,用户通常都希望将当前显示在 DataGrid、DataGridView 或 GridView 中的数据导出为 Excel 文件,用于报表生成、数据共享或后续处理。
在实际业务场景中,导出的 Excel 文件往往不仅仅用于存储原始数据。通常还需要具备良好的可读性,例如清晰的布局、表头样式、合理的列宽以及合适的数值格式等。
本文将介绍如何使用 Spire.XLS for .NET,在不依赖 Microsoft Office Interop 的情况下,在 C# 中将 DataGridView 和 GridView/DataGrid 的数据导出为 Excel。该方案重点关注准确导出当前显示的数据,保持代码结构清晰,并以一致、可复用的方式应用 Excel 格式设置。
目录
- 在 C# 中以编程方式导出 Excel 的优势
- 核心思路:通过 DataTable 导出界面显示的数据
- 步骤一:将界面显示的数据提取为 DataTable
- 步骤二:在 C# 中将 DataTable 导出为 Excel
- 步骤三:为导出的 Excel 文件应用格式
- 性能与实践注意事项
- 总结
- FAQ
在 C# 中以编程方式导出 Excel 的优势
虽然可以通过 Microsoft Office Interop 生成 Excel 文件,但在从 DataGrid、DataGridView 或 GridView 导出数据时,使用纯代码方式具有明显优势:
- 不需要在运行环境中安装 Microsoft Excel
- 适用于服务器端或云环境
- 即使处理大规模数据集也能保持较高性能
- 更适合自动化处理和后台导出场景
通过直接使用代码导出数据,开发人员可以构建更加稳定、易维护、可扩展的 Excel 导出功能,并且在不同类型的应用程序中都能保持一致的行为。
核心思路:通过 DataTable 导出界面显示的数据
尽管 DataGrid、DataGridView 和 GridView 都属于 UI 控件,但它们的本质都是以行和列的形式展示结构化数据。若直接针对控件本身进行导出,往往会引入与界面强相关的逻辑,增加维护成本。
一种更可靠、也更易复用的流程是:
界面显示的数据 → DataTable → Excel 文件
在这种设计中:
- DataTable 精确反映用户当前看到的数据内容
- Excel 导出逻辑与 UI 层彻底解耦
- 同一套实现既适用于 WinForms,也适用于 ASP.NET
- 所有格式和布局都可以在 Excel 层统一处理
在这里,DataTable 作为一个干净的中间数据结构,而不是最终的导出目标。借助 Spire.XLS for .NET,可以非常方便地将 DataTable 导出为 Excel 文件并设置样式。
步骤一:将界面显示的数据提取为 DataTable
第一步是将 当前界面中显示的数据 从 UI 控件中提取出来,并转换为 DataTable。这一过程关注的是可见的行和列,而不是重新构建原始数据源。
从 DataGridView(WinForms)中导出显示的数据
在 WinForms 应用中,用户通常期望导出的内容与 DataGridView 在界面上的显示结果完全一致。下面的方法将当前显示的 DataGridView 数据转换为一个 DataTable:
DataTable ConvertDataGridViewToDataTable(DataGridView dgv)
{
DataTable dt = new DataTable();
foreach (DataGridViewColumn column in dgv.Columns)
{
dt.Columns.Add(column.HeaderText, column.ValueType ?? typeof(string));
}
foreach (DataGridViewRow row in dgv.Rows)
{
if (row.IsNewRow) continue;
DataRow dr = dt.NewRow();
for (int i = 0; i < dgv.Columns.Count; i++)
{
dr[i] = row.Cells[i].Value ?? DBNull.Value;
}
dt.Rows.Add(dr);
}
return dt;
}
这种方式在将 DataGridView 数据导出为 Excel 时,能够保留列标题、列顺序以及当前显示的单元格值。
从 GridView(ASP.NET)中导出显示的数据
在 ASP.NET 应用中,GridView 用于向用户展示和操作表格数据。若需要导出当前显示的 GridView 内容,可以将其渲染后的行数据转换为 DataTable,如下所示:
DataTable ConvertGridViewToDataTable(GridView gv)
{
DataTable dt = new DataTable();
foreach (TableCell cell in gv.HeaderRow.Cells)
{
dt.Columns.Add(cell.Text);
}
foreach (GridViewRow row in gv.Rows)
{
DataRow dr = dt.NewRow();
for (int i = 0; i < row.Cells.Count; i++)
{
dr[i] = row.Cells[i].Text;
}
dt.Rows.Add(dr);
}
return dt;
}
该方法提供了一种统一的数据结构,可用于在 C# 中将 GridView 数据导出为 Excel,同时避免引入与 UI 强耦合的导出逻辑。
如果你需要直接将数据库中的数据导出为 Excel 文件,可以参考这篇指南:在 C# 中将数据库导出为 Excel。
步骤二:在 C# 中将 DataTable 导出为 Excel
当界面显示的数据已经提取为 DataTable 之后,导出 Excel 的过程就完全独立于 UI 了。
在本示例中,我们使用 Spire.XLS for .NET 以编程方式生成 Excel 文件,而无需在系统中安装 Microsoft Excel。
安装 Spire.XLS for .NET
可以通过 NuGet 安装 Spire.XLS for .NET:
Install-Package Spire.XLS
你也可以选择 下载 Spire.XLS for .NET,并手动将其添加到项目中。
基本的 Excel 导出示例
using Spire.Xls;
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
// 将 DataTable 导入到 Excel,并包含列标题
worksheet.InsertDataTable(exportTable, true, 1, 1);
// 保存 Excel 文件
workbook.SaveToFile("ExportedData.xlsx", ExcelVersion.Version2016);
下面是导出的 Excel 文件预览效果:

这段导出逻辑无需修改即可同时适用于 DataGrid、DataGridView 和 GridView 场景。
步骤三:为导出的 Excel 文件应用格式
无论数据来源于哪里,Excel 导出时通常都需要进行格式设置。通过应用样式、调整列宽以及设置数值格式,可以显著提升导出文件的可用性和专业度。
下面的示例演示了一些常见的格式操作,这些操作可以应用于任何导出的 Excel 工作表:
CellStyle headerStyle = workbook.Styles.Add("HeaderStyle");
headerStyle.Font.IsBold = true;
headerStyle.Font.FontName = "微软雅黑";
headerStyle.Font.Size = 12f;
headerStyle.HorizontalAlignment = HorizontalAlignType.Center;
headerStyle.VerticalAlignment = VerticalAlignType.Center;
CellStyle dataStyle = workbook.Styles.Add("DataStyle");
dataStyle.Font.FontName = "微软雅黑";
dataStyle.Font.Size = 11f;
// 应用表头样式
CellRange headerRange = worksheet.Range[1, 1, 1, ordersTable.Columns.Count];
headerRange.Style = headerStyle;
// 应用数据行样式
worksheet.Range[2, 1, worksheet.LastRow, worksheet.LastColumn].Style = dataStyle;
// 自动调整列宽和行高
worksheet.AllocatedRange.AutoFitColumns();
worksheet.AllocatedRange.AutoFitRows();
// 设置日期和货币格式
worksheet.Range[$"D2:D{worksheet.LastRow}"].NumberFormat = "#,##0";
worksheet.Range[$"E2:E{worksheet.LastRow}"].NumberFormat = "$#,##0.00";
worksheet.Range[$"F2:G{worksheet.LastRow}"].NumberFormat = "yyyy-mm-dd";
应用格式后的 Excel 文件预览如下:

这些格式设置可以根据具体报表需求灵活组合或扩展,而无需修改数据提取逻辑。
Spire.XLS for .NET 还支持更多 Excel 格式功能,例如条件格式、图表等。你可以参考:如何在 C# 中创建 Excel 文件,了解更多格式设置选项。
性能与实践注意事项
在导出大型 DataGrid 或 GridView 数据集时,建议注意以下几点:
- 在桌面应用中以异步方式执行导出操作
- 避免在生成 Excel 文件时阻塞 UI 线程
- 仅导出必要或可见的列
- 在 ASP.NET 应用中优先在服务器端生成 Excel 文件
由于整个导出流程基于 DataTable 而非 UI 控件本身,因此即使数据量增大,代码依然易于维护和扩展。
总结
在 C# 中,将 DataGrid、DataGridView 或 GridView 的数据导出为 Excel 并不需要依赖 Microsoft Office Interop。通过先将界面显示的数据提取为 DataTable,再以编程方式生成 Excel 文件,开发人员可以实现稳定、可复用的 Excel 导出功能。
借助统一的格式支持以及清晰的 UI 与导出逻辑分离设计,该方案非常适合桌面应用和 Web 应用中的实际报表场景。如需评估该库或测试导出功能,你可以 联系我们申请临时许可。
FAQ
Q1:如何在 C# 中将 DataGridView 数据导出为 Excel?
A1:可以先将 DataGridView 中当前显示的数据提取为 DataTable,然后使用 Spire.XLS for .NET 以编程方式生成 Excel 文件,无需依赖 Microsoft Excel。
Q2:在将 GridView 导出为 Excel 时可以应用格式吗?
A2:可以。Spire.XLS 支持为导出的 Excel 工作表设置样式、调整列宽以及配置数值格式,从而生成清晰、专业的报表文件。
Q3:在 C# 中导出 DataGrid 或 GridView 数据时,是否必须安装 Microsoft Excel?
A3:不需要。使用 Spire.XLS 这类纯代码库,可以直接从 DataTable 生成 Excel 文件,无需在运行环境中安装 Excel,非常适合服务器端和云应用场景。







