在C#中无需Microsoft Office创建Excel:底层魔法揭秘

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为何“无需Office”以及内部原理?

\n\n

如果你曾搜索过如何在C#中生成Excel文件,你很可能遇到过Stack Overflow上那个拥有数万浏览量的经典问题。而其中的核心痛点就是那句“无需安装Microsoft Office”。为什么?因为拖拽COM对象、依赖服务器上的Excel版本以及捕获诸如“检索组件...的COM类工厂失败”之类的错误,对开发者而言简直是地狱般的体验。

\n\n

但那么,如何创建.XLSX和.XLS文件呢?答案在于格式本身的构造。现代Excel(自2007年起)实际上就是一个包含XML文件的普通ZIP压缩包。是的,你没听错:随便拿一个.xlsx文件,将其重命名为.zip,打开后你会看到xl、_rels、docProps等文件夹以及大量XML文档。每个工作表、每个单元格、每个样式都是结构清晰的XML。而旧的.XLS格式则是二进制格式(BIFF),但同样有开源解决方案可用。

\n\n

在本文中,我们将深入探究这一过程的底层原理:解析流行的库,编写实际代码,并理解当我们调用Save()时究竟发生了什么。开始吧!

\n\n

1. C#中无需Office操作Excel的三大支柱

\n\n

目前,有三个主要候选方案能够“开箱即用”地解决这个问题。它们都直接处理格式,无需安装Office。

\n\n

1.1. EPPlus(LGPL / 专有许可证)

\n

最流行的.NET库。最初是免费的,但从5.0版本开始,商业使用需要付费许可证。不过,对于教育目的和小型项目,你仍然可以使用它(4.5.3.3版本是最后一个免费版本)。EPPlus仅支持.XLSX。

\n\n

底层工作原理:EPPlus使用System.IO.Packaging(即ZIP压缩包)并根据Office Open XML(OOXML)规范生成XML文件。它可以创建样式、公式、图表——你在Excel中看到的一切。

\n\n

1.2. ClosedXML

\n

免费、开源(MIT许可证)。同样仅支持.XLSX。其API非常友好,类似于直接操作Excel:你使用Workbook、Worksheet、Cell。底层同样是Open XML,但ClosedXML承担了创建XML结构的所有繁琐工作。

\n\n

1.3. NPOI

\n

著名Java库Apache POI的移植版。主要优势在于它既能处理.XLSX(通过XSSFWorkbook),也能处理旧的.XLS(通过HSSFWorkbook)。免费、开源(Apache 2.0许可证)。如果你需要支持旧格式,这是理想选择。

\n\n

.XLS的底层原理:NPOI直接以BIFF8格式写入二进制数据。这比XML更复杂,但无需压缩。

\n\n

2. 编写代码:用三种方式创建Excel文件

\n\n

让我们创建一个包含标题和数据的简单报告。以下是每个库的示例。

\n\n

2.1. ClosedXML示例(最简单)

\n\n
using ClosedXML.Excel;\n\n// 创建工作簿\nusing (var workbook = new XLWorkbook())\n{\n    // 添加工作表\n    var worksheet = workbook.Worksheets.Add("报告");\n\n    // 标题\n    worksheet.Cell(1, 1).Value = "姓名";\n    worksheet.Cell(1, 2).Value = "年龄";\n    worksheet.Cell(1, 3).Value = "城市";\n\n    // 数据\n    worksheet.Cell(2, 1).Value = "安娜";\n    worksheet.Cell(2, 2).Value = 28;\n    worksheet.Cell(2, 3).Value = "莫斯科";\n\n    worksheet.Cell(3, 1).Value = "伊万";\n    worksheet.Cell(3, 2).Value = 35;\n    worksheet.Cell(3, 3).Value = "圣彼得堡";\n\n    // 标题样式\n    var headerRange = worksheet.Range("A1:C1");\n    headerRange.Style.Font.Bold = true;\n    headerRange.Style.Fill.BackgroundColor = XLColor.LightGray;\n\n    // 自动调整列宽\n    worksheet.Columns().AdjustToC                

博客

书籍推荐