还有什么不能做?——细谈在C#中读写Excel系列文章之一

  在写这一系列文章之前,我要首先申明一个事情,那就是自打.NET一开始我们大概就已经开始使用它在自己的程序中与Excel进行交互了,诸如从Excel中读取数据显示报表、将程序中的数据导出到Excel中等等。这个看似很平常,而且我相信有很多的人都写过或看过类似的程序。在早期版本的.NET中我们需要在Windows中执行一个命令(时间太久我也不太记得这个命令叫什么了)来将Office COM组件变成托管代码以便在.NET程序中调用,后来的.NET Framework可以完全支持Office COM组件的调用,但需要在工程中添加引用。但是无论怎样,我们在程序中都是对Office COM组件进行操作,这样会有许多不便,无论从程序执行效率上还是代码编辑上都会让你感觉很别扭。

  那现在又有什么不同呢?

  我的意思是说如果你的程序运行的环境没有安装Office,或者说运行环境中没有注册Office COM组件,那会怎样?

  你可能会说那不是程序本身的问题,我们甚至可以要求客户提供Office COM组件。但是请注意,如果你的程序要求跨平台使用,而Office COM组件在目标平台上并不受支持(怎么会有这么奇怪的需求?!),你可能会遇到点麻烦。这个时候我们可以考虑在程序中提供一个替代的选项来禁用相应的功能,从而避免程序错误地使用并不存在的Office COM组件。

  不过,如果能有一个行之有效的办法解决所有的问题难道不是一件令人兴奋的事情吗?我们可否绕过Office COM组件而直接对文件本身进行操作呢?(有点痴心妄想了)这个想法有点夸张,在早期版本的Excel文件中(应该是在Excel 2007之前)几乎是行不通的,但从Excel 2007之后这个事情变得可行了。

  在Excel 2007之后的版本中,文件名的后缀变成XLSX了,其实这个也是SpreadsheetXL。我们有三种方法可以操作它:自己写解析器分析文件中的内容,这个可能会比较麻烦;第二种是使用Microsoft提供的OpenXML SDK来操作Excel文件,OPENXML SDK到目前为止应该有两个版本,而且包含的功能还是很丰富的;第三种就是直接使用自.NET Framework 3.0之后提供的新功能直接操作Excel文件。

  先介绍下什么是XLSX文件。看下面这个图就明白了。

  XLSX文件本身就是一个压缩包,里面包含了Excel文件中所有的数据和样式,包括一些资源文件(如图片、链接等等),这些文件几乎都以XML的形式放在压缩包里不同的文件夹中。只要我们熟悉了这些XML文件的结构以及不同文件夹的用途,就可以非常方便地以ZIP压缩文件的形式操作XLSX文件了。下面这个图就是解压XLSX文件后的内容:

  稍后我会介绍如何通过各种不同的方式来使用XLSX文件以及各种不同的应用。但在这之前我想先说一下Excel的REST应用。这里有几个链接可以帮助你了解什么是Excel REST应用。

http://msdn.microsoft.com/en-us/library/ee556820.aspx

http://www.cnblogs.com/dwang/archive/2010/12/08/1899983.html

http://msdn.microsoft.com/en-us/library/hh124646.aspx

  Excel REST是SharePoint Excel Services提供的一个用来访问Excel文件的服务,我们只需要通过一个简单的URL就可以得到Excel文件中的数据,使用非常方便。而且我们还可以通过这个URL来修改Excel中某些单元格的数据,甚至获取或修改图表。具体的使用方法和例子大家可以查看MSDN,上面会有非常详细的介绍。

  在使用Excel REST服务返回Range数据时,如果所对应的工作表有自定义名称,URL应该是怎样的?这里有几个例子:

  • 读取Student表,范围从A1到G5,注意%7C是转义之后的冒号。

http://<ServerName>/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('Student!A1%7CG5')?$format=html

  • 读取Teacher and Student表,范围从D5到CG27。注意表名中的空格可能需要进行转义。另外就是表名用了两个单引号括起来。

http://<ServerName>/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher%20and%20Student''!D5%7CCG27')?$format=html

  • 读取Teacher表,范围为A10单元格。注意表名也用了两个单引号括起来。

http://<ServerName>/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher''!A10%7CA10')?$format=html

  在Excel中,自定义的表名可以用两个单引号括起来。Excel REST Services返回的数据类型有三种:html、atom和xml。注意atom是RSS的格式,如果返回的数据类型不符合RSS规范则无法显示。

posted @ 2012-05-09 06:56  Jaxu  阅读(3885)  评论(15编辑  收藏  举报