冰蓝科技
|
028-81705109
|
|
微信扫一扫
|

Spire.Cloud 纯前端文档控件

如何使用 Java 轻松解析 Excel 文件

Excel 文件广泛用于存储和交换结构化数据,例如报表、用户提交的表单,以及从其他系统导出的业务记录。在许多 Java 应用程序中,开发者都需要打开 Excel 文件并提取其中的数据,以便进行后续处理。

在 Java 中,“解析 Excel 文件”通常指加载 .xls 或 .xlsx 文件,读取工作表内容,并将单元格值转换为 Java 可用的数据类型,例如字符串、数字或日期。
本文将通过实际示例,介绍如何使用 Spire.XLS for Java 分步解析 Excel 文件,从基础的文本读取到基于数据类型的精确解析,帮助你全面掌握 Excel 数据处理方法。

目录

准备环境

在开始解析 Excel 文件之前,需要将 Spire.XLS for Java 添加到项目中。该库支持 .xls 与 .xlsx 两种格式,并且无需安装 Microsoft Excel。

添加依赖

如果使用 Maven,请在 pom.xml 中添加以下依赖:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls</artifactId>
        <version>16.9.2</version>
    </dependency>
</dependencies>

添加完成后,即可在 Java 项目中加载并解析 Excel 文件。

如果未使用 Maven,也可以手动 下载 Spire.XLS for Java,并将其添加到项目依赖中。

在 Java 中加载并解析 Excel 文件

解析 Excel 文件的第一步是将其加载到 Workbook 对象中,然后获取需要读取的工作表。

import com.spire.xls.*;

public class ParseExcel {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("data.xlsx");

        Worksheet sheet = workbook.getWorksheets().get(0);
        System.out.println("Worksheet loaded: " + sheet.getName());
    }
}

读取结果预览:

在 Java 中读取 Excel 工作表名称

上述代码同时适用于 .xls 和 .xlsx 文件。加载工作表后,即可开始遍历行和单元格进行数据读取。

以文本形式读取 Excel 数据(基础解析)

在许多场景中,开发者只需要将 Excel 数据作为文本读取,而无需关心具体数据类型。这种方式实现简单,适用于日志记录、数据展示或快速导入等场景。

将所有单元格读取为字符串

for (int i = 1; i <= sheet.getLastRow(); i++) {
    for (int j = 1; j <= sheet.getLastColumn(); j++) {
        String cellText = sheet.getCellRange(i, j).getValue();
        System.out.print(cellText + "\t");
    }
    System.out.println();
}

文本读取结果预览:

在 Java 中以文本形式读取 Excel 数据

使用 getValue() 方法返回的是 Excel 中显示的格式化结果。当对数据精度或类型转换要求不高时,这是最便捷的读取方式。

如果你的需求不仅限于读取,还包括修改或编辑 Excel 文件,可以参考单独的教程:如何使用 Spire.XLS 在 Java 中编辑 Excel 文档。

将 Excel 单元格解析为不同数据类型

在数据处理、校验或计算场景中,仅以文本形式读取往往不够。这时需要将单元格值解析为对应的 Java 数据类型。

解析数值类型(int / double / float)

在 Excel 中,许多单元格内部实际上以数值形式存储,即使显示为日期、货币或百分比。 Spire.XLS for Java 提供 getNumberValue() 方法,用于直接读取单元格的底层数值。

CellRange usedRange = sheet.getAllocatedRange();
System.out.println("Raw number values:");
for (int i = usedRange.getRow(); i <= usedRange.getLastRow(); i++) {
    for (int j = usedRange.getColumn(); j <= usedRange.getLastColumn(); j++) {
        CellRange cell = sheet.getRange().get(i, j);
        if (!(Double.isNaN(cell.getNumberValue())))
            {
                System.out.print(cell.getNumberValue() + "\t");
            }
        }
    System.out.println();
}

数值读取结果预览:

在 Java 中读取 Excel 数值

该方法返回单元格中存储的原始数值,不受 Excel 显示格式影响。

根据业务逻辑转换数值类型

读取到数值后,可以根据业务需求转换为合适的 Java 类型:

double numberValue = cell.getNumberValue();

// 转换为 int
int intValue = (int) numberValue;

// 转换为 float
float floatValue = (float) numberValue;

// 保持为 double
double doubleValue = numberValue;

例如,ID、计数器或数量通常使用 int,而价格、余额或测量数据更适合使用 double 或 float。

注意:Excel 中的日期本质上也是数值类型。如果单元格表示日期或时间,建议使用日期相关 API 进行读取,而不要简单地当作普通数值处理。下文将介绍相关方法。

解析日期和时间

在 Excel 中,日期和时间以数值形式存储,但显示效果由单元格格式决定。 Spire.XLS for Java 提供 getDateTimeValue() 方法,可直接将其读取为 Date 对象,便于在 Java 中进行日期处理。

例如,如果某一列用于存储日期,可以按如下方式读取:

CellRange usedRange = sheet.getAllocatedRange();
System.out.println("Date values:");

for (int i = 0; i < usedRange.getRowCount(); i++) {
    // 例如读取第 G 列(日期列)
    CellRange cell = usedRange.get(String.format("G%d", i + 1));
    java.util.Date date = cell.getDateTimeValue();
    System.out.println(date);
}

第七列日期读取结果预览:

在 Java 中读取 Excel 日期值

由于 Excel 日期本质为数值,getDateTimeValue() 会自动将其转换为 Date 对象,适用于报表系统、数据导入或预定义列结构的电子表格。

实际场景中的混合类型解析

在真实业务中,同一列可能包含文本、数字、日期、布尔值或空值等多种数据类型。 此时,可以结合不同 API,根据业务逻辑选择合适的读取方式。

CellRange cell = sheet.getRange().get(2, 1); // B2

// Excel 中显示的格式化文本
String text = cell.getText();

// 原始字符串值
String value = cell.getValue();

// 通用底层值(可能是数字、布尔值、日期等)
Object rawValue = cell.getValue2();

// 如果单元格包含公式
String formula = cell.getFormula();

// 公式计算结果
String evaluated = cell.getEnvalutedValue();

// 数值
double numberValue = cell.getNumberValue();

// 日期值
java.util.Date dateValue = cell.getDateTimeValue();

// 布尔值
boolean booleanValue = cell.getBooleanValue();

在实际开发中,getText() 常作为安全的兜底方案,用于展示、日志记录或数据导出;而在需要数据计算或逻辑判断时,应根据列的语义使用 getNumberValue()、getDateTimeValue() 或 getBooleanValue() 等方法。

这种灵活的解析方式尤其适用于用户上传或结构较为松散的 Excel 文件,有助于避免类型误判,同时保持代码简洁与稳定。

更多类型解析请查看:XlsRange API 参考

实际应用中的常见解析场景

将 Excel 行映射为 Java 对象

常见做法是将 Excel 中的每一行映射为一个 Java 对象(例如 DTO 或实体类)。

例如,一行表示一条产品记录或业务数据,每一列对应对象的一个字段。解析完成后,可以将对象存入 List 中,进行后续处理或写入数据库。

将 Excel 数据读取到集合结构

另一种常见方式是将数据读取为 List<List<Object>> 等集合结构,适用于批量处理、数据校验或数据转换流程。

Spire.XLS for Java 提供简洁的遍历接口,使开发者能够根据列语义灵活读取数值或日期数据,满足不同业务需求。

为什么使用 Spire.XLS for Java 解析 Excel 文件?

在 Java 中解析 Excel 文件时,Spire.XLS for Java 具有以下优势:

  • 同时支持 .xls 与 .xlsx 格式
  • 无需依赖 Microsoft Excel
  • 提供简单直观的文本、数值与日期读取 API
  • 适用于服务器端和桌面 Java 应用

这些特性使其成为实际项目中进行 Excel 数据解析的实用选择。

此外,Spire.XLS for Java 还支持向 Excel 工作表写入多种类型的数据。更多内容可参考:如何使用 Java 将数据写入 Excel 文件。

总结

在 Java 应用开发中,解析 Excel 文件是一项常见需求。无论是读取简单文本,还是提取具有准确数据类型的结构化数据,都需要合适的解析方式。

通过使用 Spire.XLS for Java,你可以轻松加载 Excel 文件,以文本形式读取单元格内容,或按数值、日期等类型进行精确解析,并以较少代码实现稳定的数据处理流程。

根据实际业务需求,可以选择基础文本解析或基于类型的数据提取方式,从而安全、高效地将 Excel 数据整合到 Java 应用中。

如需解锁 Spire.XLS for Java 的完整功能(无评估限制),可申请 免费试用许可。

常见问题

Java 可以同时解析 XLS 和 XLSX 文件吗?

可以。Spire.XLS for Java 使用统一 API 同时支持 .xls 与 .xlsx 格式。

以文本读取和按数据类型解析有什么区别?

以文本读取返回的是 Excel 中显示的格式化结果;按数据类型解析则保留原始数值或日期类型,适用于计算与逻辑处理。

解析 Excel 文件是否需要安装 Microsoft Excel?

不需要。Spire.XLS for Java 可独立运行,无需依赖 Microsoft Excel。

尊敬的客户与合作伙伴:

值此春节来临之际,衷心感谢您一直以来对成都冰蓝科技有限公司的信任与支持。现将我司 2026 年春节放假安排通知如下:

放假期间,QQ、电话将暂停服务。若您有购买咨询、申请临时授权文件以及其他紧急事宜,请通过邮件与我们联系,值班人员会尽快为您处理。

感谢您的理解与支持!恭祝您新春愉快、事业顺利、万事如意!

联系我们:

我们很高兴地宣布发布Spire.Doc for .NET 14.2.7。本版本支持在表格中隐藏行,并包含若干调整和错误修复,以增强可用性和性能。

新功能:

调整:

问题修复:


获取 Spire.Doc 14.2.7,请点击以下链接:

https://www.e-iceblue.cn/Downloads/Spire-Doc-NET.html

Spire.Doc for Java 14.2.4 现已正式发布。该版本支持删除 Word 文档中的空白页或指定页。同时,一些在转换 Word 到 PDF、HTML、以及 RTF,提取页面或文本时出现的问题也得以成功被修复。更多详情如下。

新功能:

问题修复:


获取 Spire.Doc for Java 14.2.4 请点击:

https://www.e-iceblue.cn/Downloads/Spire-Doc-JAVA.html

Spire.PDF 12.2.6 现已正式发布。该版本主要修复了一些在转换 PDF 到图片、XPS 到 PDF,以及PDF 到 PDF/A-2B 时出现的问题。详情请查阅以下内容。

问题修复:


获取Spire.PDF 12.2.6,请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-NET.html

Spire.Barcode for Python 7.3.0 现已正式发布。该版本新增了对 ARM 架构 macOS 的支持,使开发者能够在该平台更高效地运行条码生成与识别相关功能。详情如下。

新功能:


获取 Spire.Barcode for Python 7.3.0 请点击

https://www.e-iceblue.cn/Downloads/Spire-Barcode-Python.html

C# 无需 Interop 导出 List 到 Excel 教程

在现代 .NET 应用中,使用 C# 将列表数据导出为 Excel 是一个非常常见的需求。无论是桌面应用、Web 系统,还是后台服务,开发者都经常需要将内存中的集合数据(尤其是 List<T>)转换为结构清晰的 Excel 文件,供用户下载、分析或共享。

本文将演示如何不使用 Excel Interop 在 C# 中将对象列表导出为 Excel 文件,所使用的工具是 Spire.XLS for .NET。该方案完全兼容 .NET Core 及现代 .NET 版本,适用于常见的业务数据模型,并且无需在运行环境中安装 Microsoft Excel。

目录


为什么要在 C# 中不使用 Interop 导出 List 到 Excel?

将列表数据导出为 Excel,是一种非常实用的数据展示方式,能够以用户熟悉、广泛接受的格式呈现结构化信息。在实际项目中,这类需求通常出现在以下场景:

  • 生成运营报表或财务报表
  • 允许用户从 Web 应用中下载查询结果
  • 与非技术人员共享结构化数据
  • 使用 Excel 进行离线分析或审计

传统上,许多开发者会使用 Excel Interop 来生成 Excel 文件。但这种方式在实际使用中存在明显限制:

  • 运行环境必须安装 Microsoft Excel
  • 不适用于服务器端或 ASP.NET Core 应用
  • 对于简单的导出任务来说,引入了不必要的依赖

因此,在现代 .NET 应用中,不依赖 Interop 导出 Excel 已逐渐成为主流选择。像 Spire.XLS for .NET 这样的组件,可以在不依赖 Microsoft Office 的情况下,直接将 List<T> 导出为 Excel 文件,稳定且适合服务器环境。


在 C# 中将对象列表导出为 Excel

在大多数实际项目中,数据通常以业务对象列表的形式存在,而不是简单的基础类型集合。本节将以一个贴近真实业务场景的示例,介绍如何使用一种可复用、无需 Interop 的方式,将 List<T> 导出为 Excel。

前提条件

在开始之前,请确保项目中已安装 Spire.XLS for .NET。

可以通过 NuGet 进行安装:

Install-Package Spire.XLS

安装完成后,无需额外配置,即可开始将 List<T> 数据导出为 Excel。

核心导出流程

将对象列表导出为 Excel 的整体流程可以概括为以下几个步骤:

  1. 准备 List<T> 数据
  2. 创建 Excel 工作簿和工作表
  3. 根据对象属性动态生成列标题
  4. 将列表数据逐行写入工作表
  5. 保存 Excel 文件

下面的示例展示了完整的实现过程。

C# 示例:将 List 导出为 Excel

using Spire.Xls;
using System;
using System.Collections.Generic;
using System.Reflection;

public class OrderReport
{
    public int OrderId { get; set; }
    public string CustomerName { get; set; }
    public DateTime OrderDate { get; set; }
    public decimal TotalAmount { get; set; }
    public string Status { get; set; }
}

class Program
{
    static void Main()
    {
        // 准备数据
        List<OrderReport> orders = new List<OrderReport>
        {
            new OrderReport { OrderId = 20240101, CustomerName = "华东电子有限公司", OrderDate = DateTime.Today.AddDays(-7), TotalAmount = 15680.00m, Status = "已确认" },
            new OrderReport { OrderId = 20240102, CustomerName = "深圳智创科技股份有限公司", OrderDate = DateTime.Today.AddDays(-3), TotalAmount = 8920.50m, Status = "审核中" },
            new OrderReport { OrderId = 20240103, CustomerName = "北京远航信息技术有限公司", OrderDate = DateTime.Today, TotalAmount = 32450.75m, Status = "已完成" }
        };

        // 创建工作簿,获取默认工作表
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];

        // 通过反射读取对象属性
        PropertyInfo[] properties = typeof(OrderReport).GetProperties();

        // 写入列标题
        for (int i = 0; i < properties.Length; i++)
        {
            sheet.Range[1, i + 1].Text = properties[i].Name;
        }

        // 写入数据行
        for (int row = 0; row < orders.Count; row++)
        {
            for (int col = 0; col < properties.Length; col++)
            {
                object value = properties[col].GetValue(orders[row]);
                sheet.Range[row + 2, col + 1].Value2 = value;
            }
        }

        // 保存 Excel 文件
        workbook.SaveToFile("OrderReport.xlsx", ExcelVersion.Version2016);
    }
}

生成的 Excel 文件示例效果如下:

使用 Spire.XLS for .NET 在 C# 中将 List 导出为 Excel

技术说明与实现细节

  • 通过实例化 Workbook 创建 Excel 文件,并使用 workbook.Worksheets[0] 获取第一个工作表
  • 使用反射(Type.GetProperties)动态生成列标题,避免硬编码字段映射
  • 表头使用 Range.Text 写入,确保第一行以字符串形式显示
  • 数据部分通过 Range.Value2 逐行写入,以保持 Excel 原生数据类型
  • 最终通过 Workbook.SaveToFile 生成 Excel 文件,全程不依赖 Microsoft Excel 或 Interop

这种实现方式非常适合构建可复用的导出工具或报表生成模块。

如果数据来源是 DataTable 而不是 List<T>,Spire.XLS 也提供了高效的导出方式。可参考:如何在 C# 中将 DataTable 导出为 Excel。


设置导出 Excel 工作表的格式

除了基础的数据导出功能,Spire.XLS for .NET 还支持对 Excel 工作表进行格式设置,以提升可读性和实际使用体验。

常见的格式化需求包括:

  • 设置表头样式
  • 格式化日期和数值
  • 自动调整列宽
  • 设置单元格文字样式

示例:应用基础格式设置

using System.Drawing;

// 设置表头样式
CellStyle headerStyle = workbook.Styles.Add("HeaderStyle");
headerStyle.Font.FontName = "Arial";
headerStyle.Font.Size = 12f;
headerStyle.Font.IsBold = true;
headerStyle.Color = Color.LightGray;  // 设置单元格背景色
headerStyle.HorizontalAlignment = HorizontalAlignType.Center;

sheet.Range[1, 1, 1, sheet.LastColumn].Style = headerStyle;

// 设置日期和金额列格式
sheet.Range[2, 3, orders.Count + 1, 3].NumberFormat = "yyyy-mm-dd";
sheet.Range[2, 4, orders.Count + 1, 4].NumberFormat = "#,##0.00";

// 自动调整行高和列宽
sheet.AllocatedRange.AutoFitRows();
sheet.AllocatedRange.AutoFitColumns();

设置格式后的 Excel 表格效果如下:

使用 Spire.XLS for .NET 在 C# 中设置 Excel 格式

通过适当的格式设置,可以让导出的 Excel 文件更加专业,适合直接用于业务场景。

如需了解更高级的工作表格式设置(例如样式、合并单元格、条件格式、公式等),可参考:如何在 C# 中创建和格式化 Excel 工作表。


.NET Core 与服务器端兼容性

Spire.XLS for .NET 完全兼容 .NET Core 及现代 .NET 版本,适用于以下场景:

  • ASP.NET Core Web 应用
  • Web API
  • 云环境和容器化部署
  • 后台服务和定时任务

由于不依赖 Excel Interop,该导出方案可以安全地运行在服务器端和生产环境中。

如果你正在使用 ASP.NET Core 或 Web API 项目,可以参考以下教程,了解如何生成并返回 Excel 文件给客户端:在 ASP.NET Core 中使用 C# 导出 Excel 文件。


总结

在 C# 中将列表数据导出为 Excel 并不一定要依赖 Excel Interop。借助 Spire.XLS for .NET,可以高效地将 List<T> 转换为结构清晰、格式规范的 Excel 文件,并在 .NET Framework 与 .NET Core 环境中无缝运行。

采用不依赖 Interop 的方案,不仅可以降低部署复杂度,还能提升应用的稳定性和灵活性,特别适合服务器端和云环境。

无论是复杂报表还是简单列表导出,Spire.XLS 都能为现代 C# 应用提供可靠、可扩展的 Excel 解决方案。如需评估或解除试用限制,可申请 30 天临时许可证。


常见问题

Q1. 这种方式可以高效导出大规模列表数据吗?

可以。Spire.XLS for .NET 专为服务器端场景设计,能够高效处理较大的 List<T> 数据集。对于数据量极大的情况,可结合分批处理或流式写入进一步提升性能。

Q2. 是否需要在运行环境中安装 Microsoft Excel?

不需要。Spire.XLS for .NET 完全独立运行,不依赖 Excel Interop,非常适合服务器和云环境。

Q3. 可以自定义列标题或单元格格式吗?

可以。列标题可以手动指定,日期、数值和样式等格式也都可以通过代码进行设置。更复杂的格式化需求可参考 C# Excel 格式设置指南。

Q4. 是否兼容 ASP.NET Core 和 Web API?

是的。该导出逻辑可直接应用于 ASP.NET Core、Web API、后台服务以及其他服务器端 .NET 项目。

我们很高兴发布 Spire.PDF for Java 12.2.1。本次更新主要修复并优化了 PDF 转 Word 相关问题。具体内容如下。

问题修复:


获取 Spire.PDF for Java 12.2.1,请点击以下链接:

https://www.e-iceblue.cn/Downloads/Spire-PDF-JAVA.html

Spire.Presentation 11.2.1 已发布。该版本修复了几个在转换 PPT 到 PDF 和 SVG 时出现的问题。详情请查看下文。

问题修复:


获取Spire.Presentation 11.2.1,请点击:

https://www.e-iceblue.cn/Downloads/Spire-Presentation-NET.html

使用 C# 将 DataGrid/GridView 导出到 Excel

在 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 的优势

虽然可以通过 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 文件预览效果:

C# 中基本的 DataGridView 导出到 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 文件预览如下:

C# 中带格式的 DataGridView 导出到 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,非常适合服务器端和云应用场景。