65.9K
CodeProject 正在变化。 阅读更多。
Home

使用序列化将通用集合数据导出到电子表格

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.79/5 (5投票s)

2007年1月20日

CPOL

4分钟阅读

viewsIcon

62979

downloadIcon

568

一篇关于使用 Excel 对象模型序列化将通用集合导出到电子表格的文章。

引言

值得注意的是,电子表格在任何业务中都至关重要。我的观点是,像 Excel 这样的电子表格应用程序是 IT 行业在过去十年中推出的最佳应用程序之一。它节省了数百万小时的数据整合和推断工作,让业务用户能够专注于事实和数据。

在处理 LOB(行内业务)应用程序,尤其是在财务部门,我接触过许多将用户界面上呈现的数据导出到电子表格的 Windows 和 Web 应用程序。通过研究这些导出功能在多个 LOB 应用程序中的实现方式,我发现了一种常见的模式:开发人员使用互操作服务来利用 Microsoft Office Excel 应用程序,从而生成电子表格并呈现出来。但这种方法存在一些缺点或陷阱:

  1. 需要在服务器上安装 Microsoft Office Excel 应用程序。需要额外购买许可证。
  2. 代码本身通常编写得很复杂,可能存在维护问题。
  3. 使用互操作服务库会在每次请求时消耗服务器上的更多内存。这带来了可伸缩性问题。
  4. 响应时间通常会受到影响。这降低了用户体验。

当最近出现类似需求时,这给了我一个机会去探索实现此功能的其他替代方案。

背景

我更喜欢处理自定义业务实体。这些实体使用泛型(IList<T>)包装成集合。在大多数情况下,这些基于泛型的实体集合会绑定到用户界面中的网格等用户控件。网格中呈现的数据通常需要导出到 Excel 电子表格。为了实现这一点,我想编写一个简单的可重用 API,该 API 可用于 Web 和 Windows 应用程序,并且可以根据需要进行扩展。此外,我不想采用传统的互操作服务方式。这时,我开始探索 Excel 电子表格的对象模型。

正如你们大多数人所知,您可以将 Excel 电子表格保存为 XML 格式。Excel 应用程序会创建一个基于 XML 的文件,可以进一步分析该文件以了解其对象模型。保存 XML 文件后,我使用 XSD 工具推断出架构。架构如下图所示。此架构帮助我理解了基于 XML 的 Excel 电子表格的基本模型。现在,只需创建一个符合此架构的对象模型,然后将其转换为 Excel 应用程序可识别的 XML。

Excel Object Model

使用代码

在附加的(参见压缩的源代码)文件中,我有两个项目。名为 Sphinx 的项目(与名称无关)是一个 .NET 库项目,其中包含构建基本 Excel 电子表格的所有类。它还包含一个名为 XMLSpreadsheet 的类,该类公开了一个名为 GenerateSpreadsheet<T>(IList<T> collection) 的方法,该方法返回一个 XML 字符串。然后可以将此 XML 字符串保存并用 Microsoft Office Excel 2003 应用程序打开(旧版本不支持)。同一解决方案中还有另一个项目,提供了一个示例测试实现。

库中提供的对象模型代表了 Excel 架构的一个非常基本版本,可用于生成 Excel 电子表格。该对象模型可以进一步扩展,以实现您项目特定的其他需求。经过一些初步测试,我发现与传统的互操作模型相比,这种方法非常快速。所以,下载源代码,解压解决方案,在 VS 2005 中打开并按 F5。

关注点

以下几点可能引起您的兴趣:

  1. Visual Studio .NET IDE 附带的 XSD 工具是一个出色的工具,可以从 XML 文件推断架构,也可以生成 C# 和 VB.NET 类。
  2. 通过正确的序列化属性,对象模型可以序列化为所需的 XML 格式。
  3. 请参阅 Sphinx.Utility 命名空间中的 Serializer 类,了解如何在序列化时省略 XML 中的基本 XSD 和 XSI 命名空间。
  4. 请注意 Excel 电子表格所遵循的自定义命名空间,这在 Sphinx.Utility 命名空间中的 Serializer 类的 AddCustomNameSpace() 方法中有所体现。

历史

  • 2007 年 1 月 20 日:版本 1.0
© . All rights reserved.