C#读取Excel技术概览 (2)

简介:

5、自定义SDK,使用xmlReader文件流式处理

  第四章节中,总是感觉用别人的工具要受制于人。既然我 们知道了Excel的存储方式,问题便转换成从xml中取出数据,然后放入内存得到我们想要的东西,更重要的是,官方的sdk对xml的读取采用的 Document的方式,对于大文件xml执行速度必然降低,同时对 内存,数据量都有限制,若有几十亿,好几百T的数据,这种处理方式就很难发挥作用了,所以我们决定自己做一个sdk出来,只是将原来读取xml的方式,改 为用xmlReader的方式来读取,采用文件流的方式进行处理。

  就不需要将整个的xml文件树完全的读进去,而是按照流的方式进行处理,按照节点一个一个的读取,速度就会更进一步,并且不受数据量以及内存的限制。

   网上关于这样的处理的文章较多,大概整理了一下,但是都不全面,在处理的时候还会遇到很多的问题,网上给的代码也只是一个思路,碰到bug,还需要 自己去更多了解Excel到xml的转换过程到底是怎么样的,而本文将站在巨人的肩膀上,告诉你,应该注意的细节。首先还是转载下前人的文档,然后在对文 档中的问题,进行介绍,注意这些问题是必须要注意的,不然会耗费你大量的时间却找不到自己想要的结果!

 

5.1 Open XML 文件的结构

 

  最近开发的一个网页查询的项目 中,客户提供的数据是多个 Excel 2007 文件,这些文件都很大,有的有十几万行(注意:Excel 2003 文件不能超过 65,536 行)。这些 Excel 2007 文件需要定期批量转换为网页程序可以读取的专用二进制格式文件。我们知道,Microsoft Office System 2007 引入了一个新的文件格式:Office Open XML 格式。她是基于 XML 和 ZIP 归档技术创建的,可以使用任何平台的能够处理 XML 或者 ZIP 文件的工具来访问并且修改文档内容。所以我们就可以使用 Microsoft .NET Framework 2.0 的强大 XML 类库来读取 Excel 2007 文件并转换为网页程序所需的专用二进制格式文件。当然,也可以使用 System.IO.Packaging 名称空间中的类库,但是她位于 .NET Framework 3.0 SDK (WinFX) 的 WindowsBase.dll 中。微软网站上有几篇很有用的文章:“Office (2007) Open XML 文件格式简介”和“如何操作 Office Open XML 格式文档”。下面,就来看看 Excel 2007 (及以上版本) 的Open XML 文件的结构吧。

   

 

                                  解压后的文件

上图是一个名为test_file.xlsx 的 Excel 2013 文件。该文件其实是一个 zip 文件。为了分析其结构,我们现在把她解压到D:\最近下载\_Major\TEST_SETS\XLS文件解析\test_file 目录下。第一个重要的文件是 xl/workbook.xml,如下图所示:

 

该 文件中的每个“<sheet>”元素都代表 Excel 2013 文件中的一个工作表,工作表的名称就是其“name”属性的值,在上图中是“好人”和“坏人”。然后根据“<sheet>”元素“r:id” 属性的值(如上图中的“rId1”)到 xl/_rels/workbook.xml.rels 文件中寻找相应工作表数据实际存放的 xml 文件,如下图所示:

从图中可以看中,第一个工作表“好人”的数据实际存放在 worksheets/sheet1.xml 文件中,该文件的内容如下图所示:

上 图中的“<dimension>”元素的“ref”属性的值(“B4:C6”)表示该工作表的范围。

“<sheetData>”元素表示工作的数据,其子元素“<row>”表示工作表中的一行,“<row>”的子元素“<c>”表示该行中的单元格

如果“<c>”元素有“t”属性的话,“<c>”元素的子元素 “<v>”的值就是各工作表共享的字符串的索引。否则的话,“<v>”元素的值就是该单元格的值。

各工作表共享的字符串存放在 xl/sharedStrings.xml 文件中,如下图所示:

上图中,“<sst>”元素的子元素“<si>”就代表了共享的字符串,其值就是“<si>”元素的子元素“<t>”的值。

5.2 测试程序

下面就看看我们的测试程序吧:

源程序的整体结构如下图所示:

我们先看看 XlsxFile.cs 吧:

  XlsxFile

该 程序已经有很详细的注释了。在该程序中用 XmlDocument 类来读 xl/workbook.xml 文件和 xl/_rels/workbook.xml.rels 文件,是因为这两个文件都是非常小的文件。然后再来看看 XlsxFile.SharedStrings.cs 吧:

  XlsxFile.SharedStrings

这下必须用 XmlReader 类来读取 xl/sharedStrings.xml 了,因为这个 xml 文件可能很大。最后是 XlsxFile.Sheet.cs 了:

  XlsxFile.Sheet

在这个程序中也是用 XmlReader 类来读取 xl/worksheets/sheet1.xml 文件。

 

5.3 说明

1.时间的问题,非文本的时间,xml中会自动转换成浮点数存放的,这个浮点数是通过ToOAtime()得到的,这个函数是干嘛的?自己查sdk去。

2.sharedStrings 中<t></t>并不是完全跟<si></si>一对一对应关系的,本文的代码中是默认一对一的,其实 是错误的,因为当单元格中内容若有颜色,字体,大小属性限制某个字符的,会将这个单元格的内容拆分成多个t标签来存放,具体可以自己测试去,因为涉及到保 密,就不提供源码了,处理也很简单,我这里就是告诉下你,这种情况会出问题,要注意!

 

源码下载地址 OpenXmlTest Download Link 2016-8-15

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。


    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5750887.html ,如需转载请自行联系原作者


相关文章
|
4月前
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
|
1月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
1月前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
|
3月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
3月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
2月前
|
人工智能 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
|
2月前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
2月前
|
存储 安全 算法
C#一分钟浅谈:数据加密与解密技术
【10月更文挑战第3天】在数字化时代,信息安全至关重要。数据加密作为保障信息不被未授权访问的有效手段,通过特定算法将明文转换为密文,确保即使数据被截获也难以解读。本文从基础概念入手,介绍C#中实现数据加密的方法,涵盖对称加密(如AES、DES)与非对称加密(如RSA),并通过具体示例代码演示如何使用`System.Security.Cryptography.Aes`类完成AES加密和解密过程。此外,还强调了密钥管理及安全策略的重要性。
77 4
|
2月前
|
负载均衡 网络协议 C#
C#实现WebSocket实时消息推送技术详解
C#实现WebSocket实时消息推送技术详解
82 1
|
2月前
|
数据可视化 NoSQL C#
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)