使用序列化将通用集合数据导出到电子表格
一篇关于使用 Excel 对象模型序列化将通用集合导出到电子表格的文章。
引言
值得注意的是,电子表格在任何业务中都至关重要。我的观点是,像 Excel 这样的电子表格应用程序是 IT 行业在过去十年中推出的最佳应用程序之一。它节省了数百万小时的数据整合和推断工作,让业务用户能够专注于事实和数据。
在处理 LOB(行内业务)应用程序,尤其是在财务部门,我接触过许多将用户界面上呈现的数据导出到电子表格的 Windows 和 Web 应用程序。通过研究这些导出功能在多个 LOB 应用程序中的实现方式,我发现了一种常见的模式:开发人员使用互操作服务来利用 Microsoft Office Excel 应用程序,从而生成电子表格并呈现出来。但这种方法存在一些缺点或陷阱:
- 需要在服务器上安装 Microsoft Office Excel 应用程序。需要额外购买许可证。
- 代码本身通常编写得很复杂,可能存在维护问题。
- 使用互操作服务库会在每次请求时消耗服务器上的更多内存。这带来了可伸缩性问题。
- 响应时间通常会受到影响。这降低了用户体验。
当最近出现类似需求时,这给了我一个机会去探索实现此功能的其他替代方案。
背景
我更喜欢处理自定义业务实体。这些实体使用泛型(IList<T>
)包装成集合。在大多数情况下,这些基于泛型的实体集合会绑定到用户界面中的网格等用户控件。网格中呈现的数据通常需要导出到 Excel 电子表格。为了实现这一点,我想编写一个简单的可重用 API,该 API 可用于 Web 和 Windows 应用程序,并且可以根据需要进行扩展。此外,我不想采用传统的互操作服务方式。这时,我开始探索 Excel 电子表格的对象模型。
正如你们大多数人所知,您可以将 Excel 电子表格保存为 XML 格式。Excel 应用程序会创建一个基于 XML 的文件,可以进一步分析该文件以了解其对象模型。保存 XML 文件后,我使用 XSD 工具推断出架构。架构如下图所示。此架构帮助我理解了基于 XML 的 Excel 电子表格的基本模型。现在,只需创建一个符合此架构的对象模型,然后将其转换为 Excel 应用程序可识别的 XML。
使用代码
在附加的(参见压缩的源代码)文件中,我有两个项目。名为 Sphinx
的项目(与名称无关)是一个 .NET 库项目,其中包含构建基本 Excel 电子表格的所有类。它还包含一个名为 XMLSpreadsheet
的类,该类公开了一个名为 GenerateSpreadsheet<T>(IList<T> collection)
的方法,该方法返回一个 XML 字符串。然后可以将此 XML 字符串保存并用 Microsoft Office Excel 2003 应用程序打开(旧版本不支持)。同一解决方案中还有另一个项目,提供了一个示例测试实现。
库中提供的对象模型代表了 Excel 架构的一个非常基本版本,可用于生成 Excel 电子表格。该对象模型可以进一步扩展,以实现您项目特定的其他需求。经过一些初步测试,我发现与传统的互操作模型相比,这种方法非常快速。所以,下载源代码,解压解决方案,在 VS 2005 中打开并按 F5。
关注点
以下几点可能引起您的兴趣:
- Visual Studio .NET IDE 附带的 XSD 工具是一个出色的工具,可以从 XML 文件推断架构,也可以生成 C# 和 VB.NET 类。
- 通过正确的序列化属性,对象模型可以序列化为所需的 XML 格式。
- 请参阅
Sphinx.Utility
命名空间中的Serializer
类,了解如何在序列化时省略 XML 中的基本 XSD 和 XSI 命名空间。 - 请注意 Excel 电子表格所遵循的自定义命名空间,这在
Sphinx.Utility
命名空间中的Serializer
类的AddCustomNameSpace()
方法中有所体现。
历史
- 2007 年 1 月 20 日:版本 1.0