| 加入收藏| 设为首页| 联系我们

首页 站长学习 站长之家 源码下载 建站素材 书籍教程 常用工具
 您现在的位置: 动力中国 >> 网络编程 >> C#教程 >> 文章正文  
 [组图]用 XmlReader 读取 Excel 2007 文件
 

用 XmlReader 读取 Excel 2007 文件

http://www.domcn.org  文章来源:本站收藏  点击数:

  关键字:用 XmlReader 读取 Excel 2007 文件

 在我最近开发的一个网页查询的项目中,客户提供的数据是多个 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 文件的结构吧:



  上图是一个名为 test1.xlsx 的 Excel 2007 文件。我没有 Office 2007 软件,只有正版的 Office 2003 软件。所以需要到微软网站下载一个“Microsoft Office Word、Excel 和 PowerPoint 2007 文件格式兼容包”,就可以在 Office 2003 中编辑 Office Open XML 文档了。test1.xlsx 文件其实是一个 zip 文件。为了分析其结构,我们现在把她解压到 D:/Test/test1/ 目录下。第一个重要的文件是 xl/workbook.xml,如下图所示:



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



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



上图中的“<dimension>”元素的“ref”属性的值(“B2:C4”)表示该工作表的范围。“<sheetData>”元素表示工作的数据,其子元素“<row>”表示工作表中的一行,“<row>”的子元素“<c>”表示该行中的单元格。如果“<c>”元素有“t”属性的话,“<c>”元素的子元素“<v>”的值就是各工作表共享的字符串的索引。否则的话,“<v>”元素的值就是该单元格的值。各工作表共享的字符串存放在 xl/sharedStrings.xml 文件中,如下图所示:



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

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



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



我们先看看 XlsxFile.cs 吧:


Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1 using System;
 2 using System.IO;
 3 using System.Xml;
 4 using Skyiv.Ben.Common;
 5 
 6 namespace Skyiv.OfficeHelper
 7 {
 8   /// <summary>
 9   /// Excel 2007 文件
10   /// </summary>
11   sealed partial class XlsxFile : IDisposable
12   {
13     string fileName; // Excel 2007 文件的文件名
14     Sheet[] sheets;  // Excel 2007 文件的各工作表
15     FileStream fileStream { get { return new FileStream(fileName, FileMode.Open, FileAccess.Read); } }
16 
17     /// <summary>
18     /// Excel 2007 文件的构造函数
19     /// </summary>
20     /// <param name=fileName>Excel 2007 文件的文件名</param>
21     public XlsxFile(string fileName)
22     {
23       this.fileName = fileName;
24     }
25 
26     /// <summary>
27     /// Excel 2007 文件的各工作表
28     /// </summary>
29     public Sheet[] Sheets
30     {
31       get
32       {
33         if (sheets == null)
34         {
35           using (Stream zs = Zip.GetZipInputStream(fileStream, xl/workbook.xml))
36           {
37             // xl/workbook.xml 文件的内容举例如下:
38             // <workbook>
39             //   <sheets>
40             //     <sheet name=好人 sheetId=1 r:id=rId1 />
41             //     <sheet name=坏人 sheetId=2 r:id=rId2 />
42             //   </sheets>
43             // </workboo>
44             XmlDocument xmlDocument = new XmlDocument();
45             xmlDocument.Load(zs);
46             XmlNodeList elms = xmlDocument.DocumentElement[sheets].ChildNodes;
47             sheets = new Sheet[elms.Count];
48             for (int i = 0; i < elms.Count; i++)
49             {
50               XmlAttributeCollection attrs = elms[i].Attributes;
51               sheets[i] = new Sheet(attrs[name].Value, GetXmlFileName(attrs[r:id].Value), SharedStrings, fileStream);
52             }
53           }
54         }
55         return sheets;
56       }
57     }
58 
59     /// <summary>
60     /// 根据“标识”给出表示工作表的 XML 文件名
61     /// </summary>
62     /// <param name=id>标识</param>
63     /// <returns>表示工作表的 XML 文件名</returns>
64     string GetXmlFileName(string id)
65     {
66       string value;
67       using (Stream zs = Zip.GetZipInputStream(fileStream, xl/_rels/workbook.xml.rels))
68       {
69         // xl/_rels/workbook.xml.rels 文件的内容举例如下:
70         // <Relationships>
71         //   <Relationship Id=rId1 Target=worksheets/sheet1.xml />
72         //   <Relationship Id=rId2 Target=worksheets/sheet2.xml />
73         // </Relationships>
74         XmlDocument xmlDocument = new XmlDocument();
75         xmlDocument.Load(zs);
76         value = XmlHelper.GetElementById(xmlDocument, id).Attributes[Target].Value;
77       }
78       return value;
79     }
80 
81     public void Dispose()
82     {
83       if (sheets == null) return;
84       foreach (Sheet sheet in sheets) sheet.Dispose();
85     }
86   }
87 }
88 
该程序已经有很详细的注释了。在该程序中用 XmlDocument 类来读 xl/workbook.xml 文件和 xl/_rels/workbook.xml.rels 文件,是因为这两个文件都是非常小的文件。然后再来看看 XlsxFile.SharedStrings.cs 吧:


Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1 using System;
 2 using System.IO;
 3 using System.Xml;
 4 using Skyiv.Ben.Common;
 5 
 6 namespace Skyiv.OfficeHelper
 7&nb

[1] [2] [3] [4] 下一页


用 XmlReader 读取 Excel 2007 文件
  • 上一篇文章:

  • 下一篇文章:
  •  热门文章
    普通文章 电子邮件改头换面 四公司畅谈未
    普通文章 PC病毒史上最声名狼藉的八大病
    普通文章 Rails系统中的AJAX开发技术简析
    普通文章 基于ASP.NET AJAX框架实现表单
    普通文章 开发ASP.NET AJAX客户端定制行
    普通文章 用JFreeChart对JSP报表进行增强
    普通文章 SQL Server 2005上的CLR和ADO.
    普通文章 SQL Server 2005的XML支持机制
    普通文章 Firefox中标签式浏览技巧大全
    普通文章 Tomcat中的Session和Cookie大揭
     
     推荐文章
    推荐文章 把Google地图嵌入网页 就是这么
    推荐文章 迅雷搜索候选资源出错的解决
    推荐文章 轻松去除迅雷里的各种广告和资
    推荐文章 突破限制 免费领养到QQ空间五级
    推荐文章 Rational统一过程RUP贴近中小软
    推荐文章 构建自己的轻量级XML DOM分析程
    推荐文章 WPS Office 2007技巧:妙用配置
    推荐文章 Excel 2007:求余数函数实用进阶
    推荐文章 浅谈ASP.NET的Postback
    推荐文章 软件开发中项目需求管理简述
     
     相关文章
    没有相关文章
    设为首页 | 加入收藏 | 广告合作 | 联系站长 | 版权申明 |
    动力中国为网友提供免费学习资料,可用资源,如果您认为我们的相关内容侵害到了您的权利请联系管理员
    Copyright © 2006-2008 domcn.org All Rights Reserved.