<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Jaxu's home</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/53608/rss</id><updated>2012-05-18T16:28:52Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/53608/rss"/><entry><id>http://www.cnblogs.com/jaxu/archive/2012/05/12/2496956.html</id><title type="text">还有什么不能做？——细谈在C#中读写Excel系列文章之四</title><summary type="text">本系列文章的第四篇，介绍了如何在Silverlight中使用OpenXML方式来读取和修改Excel文件。由于Silverlight的特殊性，我们不得不放弃临时目录的方式而在文件Stream中直接修改内容，从服务端以Stream的方式下载一个文件，然后在内存中修改这个Stream，最后将修改后的Stream返回到客户端下载。OpenXML使得Office文件从一个自封闭的环境中解脱出来了，基于XML结构的文件是开放的，因此我们做的所有工作其实就是在操作XML，如此简单！不是吗？</summary><published>2012-05-12T00:31:00Z</published><updated>2012-05-12T00:31:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/05/12/2496956.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/05/12/2496956.html"/><content type="html">&lt;p&gt;作为这一系列文章的最后一篇，向大家介绍下如何在Silverlight中解压和创建Excel OpenXml ZIP压缩包。由于Silverlight对本地客户端文件系统访问的安全级别要求比较高，不太容易像Windows应用程序那样可以随意地读写目录和文件，我们不得不考虑使用一些其它的办法。如使用Silverlight的OOB（Out of Browser）模式，可以允许Silverlight程序读写本地的部分目录和文件，下面这篇文章介绍了如何在Silverlight OOB模式下调用COM组件来操作Excel。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeproject.com/Articles/83996/Silverlight-4-Interoperability-with-Excel-using-th"&gt;http://www.codeproject.com/Articles/83996/Silverlight-4-Interoperability-with-Excel-using-th&lt;/a&gt;&lt;/p&gt;&lt;p&gt;又回到使用COM组件的方式了，不过这个不是我们要讨论的问题，了解一下也无妨。先说说为什么我们要如此变态地在Silverlight中使用Excel OpenXML。&lt;/p&gt;&lt;p&gt;这其实是一个需求，用户的数据存放在SharePoint List中，想通过一个程序从List读取数据然后填充到一个Excel模板中提供下载。这个需求本身其实非常简单，关键是用户要求程序不能在客户端安装，服务器端不能有Custom Code，这两点要求几乎扼杀了我们所有可以使用的方法，第一不能使用诸如Windows Form或WPF application，第二不能创建SharePoint Feature或Webpart，当然就更别提创建单独的ASP.NET应用程序了，客户根本就没有提供空间去部署站点。另外Silverlight的OOB模式也不允许，因为OOB模式也是要在本地安装的，尽管它不同于传统意义上的Windows程序安装。这样，我们只有一条路可走，那就是创建Silverlight应用程序然后通过SharePoint的Silverlight Webpart部署到页面上，在Silverlight中直接调用Excel Services把从List中读取到的数据填充到Excel中。那跟Excel OpenXML有什么关系？我们不是已经往Excel里写入数据了吗？对，没错！如果你只是单纯往Excel模板中写入数据根本不需要再做任何操作，可是修改Excel文件的样式呢？&lt;/p&gt;&lt;p&gt;还记得在上一篇文章中的那个图吗？如果单元格中没有部分内容加粗，而只是单纯的换行或空格，我们可以直接通过Excel的公式或表达式来实现。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051107042312.png" alt="" width="394" height="66" /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;=CONCATENATE(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;  Short-term investments (including securities loaned&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;CHAR&lt;/span&gt;(&lt;span style="color: #800080;"&gt;10&lt;/span&gt;), &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;    of $9,999 and $8,888&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;  Short-term investments (including securities loaned)&lt;/span&gt;&lt;span style="color: #800000;"&gt;" &lt;/span&gt;&amp;amp; &lt;span style="color: #0000ff;"&gt;CHAR&lt;/span&gt;(&lt;span style="color: #800080;"&gt;10&lt;/span&gt;)&amp;amp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;    of &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &amp;amp; TEXT(&lt;span style="color: #800000;"&gt;"9999&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$#,##0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) &amp;amp; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; and &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &amp;amp; TEXT(&lt;span style="color: #800000;"&gt;"8888&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$#,##0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;p&gt;上面两行代码分别使用了Excel中的Concatenate()函数和&amp;amp;连接符来填充单元格内容，其中CHAR(10)表示的就是回车符。但是我们无法在Excel中通过函数设置字符串的样式，Excel所有内置的函数都不能修改样式。或许我们可以尝试通过VBA来修改样式呢？在单独的Excel文件中这个办法是可行的，我们只需要在Workbook的Open事件或SheetChange事件中写入VBA代码，当事件被调用的时候样式会被自动修改。不过Excel Services不支持带有VBA或宏的Excel文件，当你尝试通过Excel Services读取一个带有VBA代码或宏的Excel文件时会抛出异常。所以，尝试通过VBA来修改样式是行不通的，尤其是那些特殊的样式，如上图中单元格内数字加粗和上标等。&lt;/p&gt;&lt;p&gt;因此，我们会考虑通过Excel OpenXML方式将已经填充好数据的Excel文件进行样式修改。按照前面几篇文章的介绍，修改Excel内容需要首先将其解压到一个临时目录，然后修改临时目录中相应的XML文件，最后再重新打包成一个Excel文件。可是在Silverlight中不太容易操作本地文件系统，因此我们只能考虑在文件Stream中完成操作了。&lt;/p&gt;&lt;p&gt;我们需要一个能支持在Silverlight工程中操作ZIP文件的类库，之前的那个开源类库&lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/"&gt;http://www.icsharpcode.net/OpenSource/SharpZipLib/&lt;/a&gt;是使用较早的.NET Framework编写的，有许多类型和对象在Silverlight Framework中找不到无法编译通过。幸好这里我找到有人将其修改成Silverlight版本了，非常感谢！互联网是强大的。&lt;/p&gt;&lt;p&gt;&lt;a href="http://web-snippets.blogspot.com/2008/03/unpacking-zip-files-in-silverlight-2.html"&gt;http://web-snippets.blogspot.com/2008/03/unpacking-zip-files-in-silverlight-2.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我这里也提供一个下载吧，以免原作者的空间打不开。&lt;a href="http://files.cnblogs.com/jaxu/SLSharpZipLib_Solution.zip"&gt;SLSharpZipLib_Solution.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这里还有一个关于ShareZipLib示例的WiKi站点，可以研究下这个类库都能干些什么。&lt;/p&gt;&lt;p&gt;&lt;a href="http://wiki.sharpdevelop.net/SharpZipLib_Updating.ashx#Updating_a_zip_file_in_memory_1"&gt;http://wiki.sharpdevelop.net/SharpZipLib_Updating.ashx#Updating_a_zip_file_in_memory_1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;来看一个实际应用的例子。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Format exported Excel file with a stream.&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="zipfileStream"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;A stream of Excel zip file.&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Return a MemoryStream of updated Excel zip file.&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stream FormatExcelWithStream(Stream zipfileStream)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; copy the current stream to a new stream&lt;/span&gt;&lt;br/&gt;    MemoryStream msZip = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; pos = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    pos &lt;/span&gt;=&lt;span style="color: #000000;"&gt; zipfileStream.Position;&lt;br/&gt;    zipfileStream.CopyTo(msZip);&lt;br/&gt;    zipfileStream.Position &lt;/span&gt;=&lt;span style="color: #000000;"&gt; pos;&lt;br/&gt;&lt;br/&gt;    XElement eleSheet &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; load sharedStrings xml document for updating&lt;/span&gt;&lt;br/&gt;    XElement eleSharedStrings = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (Stream mainStream = FindEntryFromZipStream(zipfileStream, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xl/sharedStrings.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (mainStream == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; msZip;&lt;br/&gt;        }&lt;br/&gt;        eleSharedStrings &lt;/span&gt;=&lt;span style="color: #000000;"&gt; XElement.Load(mainStream);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; distinct sheet xml document for searching&lt;/span&gt;&lt;br/&gt;    IEnumerable&amp;lt;ExcelFormattingSetting&amp;gt; noduplicates = ExcelFormattingSettings.Distinct(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExcelFormattingSettingCompare());&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (ExcelFormattingSetting sheet &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; noduplicates)&lt;br/&gt;    {&lt;br/&gt;        zipfileStream.Position &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (Stream stream =&lt;span style="color: #000000;"&gt; FindEntryFromZipStream(zipfileStream, sheet.SheetName))&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (stream != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                eleSheet &lt;/span&gt;=&lt;span style="color: #000000;"&gt; XElement.Load(stream);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; update sharedStrings.xml document&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;                UpdateSharedStringsXMLDoc(sheet.SheetName, eleSharedStrings, eleSheet);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; update to stream&lt;/span&gt;&lt;br/&gt;    MemoryStream msEntry = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br/&gt;    eleSharedStrings.Save(msEntry);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The zipStream is expected to contain the complete zipfile to be updated&lt;/span&gt;&lt;br/&gt;    ZipFile zipFile = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ZipFile(msZip);&lt;br/&gt;&lt;br/&gt;    zipFile.BeginUpdate();&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; To use the entryStream as a file to be added to the zip,&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; we need to put it into an implementation of IStaticDataSource.&lt;/span&gt;&lt;br/&gt;    CustomStaticDataSource sds = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; CustomStaticDataSource();&lt;br/&gt;    sds.SetStream(msEntry);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; If an entry of the same name already exists, it will be overwritten; otherwise added.&lt;/span&gt;&lt;br/&gt;    zipFile.Add(sds, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xl/sharedStrings.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Both CommitUpdate and Close must be called.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;    zipFile.CommitUpdate();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set this so that Close does not close the memorystream&lt;/span&gt;&lt;br/&gt;    zipFile.IsStreamOwner = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    zipFile.Close();&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; msZip;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Find a specific stream with the entry name of the Excel zip file package.&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="inputStream"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;The Excel zip file stream.&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="entryName"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Entry name in the Excel zip file package.&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Return the sepcific stream.&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Stream FindEntryFromZipStream(Stream inputStream, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; entryName)&lt;br/&gt;{&lt;br/&gt;    ZipInputStream zipStream &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ZipInputStream(inputStream);&lt;br/&gt;    ZipEntry zippedFile &lt;/span&gt;=&lt;span style="color: #000000;"&gt; zipStream.GetNextEntry();&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Do until no more zipped files left&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (zippedFile != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[&lt;span style="color: #800080;"&gt;2048&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytesRead;&lt;br/&gt;&lt;br/&gt;        MemoryStream memoryStream &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; read through the compressed data&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; ((bytesRead = zipStream.Read(buffer, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, buffer.Length)) != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            memoryStream.Write(buffer, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, bytesRead);&lt;br/&gt;        }&lt;br/&gt;        memoryStream.Position &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (zippedFile.Name.Equals(entryName))&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; memoryStream;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        zippedFile &lt;/span&gt;=&lt;span style="color: #000000;"&gt; zipStream.GetNextEntry();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Update formatted strings to the sharedStrings.xml document in Excel zip file.&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="sheetName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="navSharedStrings"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="navSheet"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; UpdateSharedStringsXMLDoc(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sheetName, XElement eleSharedStrings, XElement eleSheet)&lt;br/&gt;{&lt;br/&gt;    XNamespace nsSharedStrings &lt;/span&gt;=&lt;span style="color: #000000;"&gt; eleSharedStrings.GetDefaultNamespace();&lt;br/&gt;    XNamespace nsSheet &lt;/span&gt;=&lt;span style="color: #000000;"&gt; eleSheet.GetDefaultNamespace();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sContent;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; update each formatting settings to the sharedStrings xml document&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (ExcelFormattingSetting setting &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; ExcelFormattingSettings.Where(s =&amp;gt;&lt;span style="color: #000000;"&gt; s.SheetName.Equals(sheetName)))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; find out which si element need to update from the sheet xml document.&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; siIndex = eleSheet.Element(nsSheet + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sheetData&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                                .Descendants(nsSheet &lt;/span&gt;+ &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                                .Where(d &lt;/span&gt;=&amp;gt; d.Attribute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Value ==&lt;span style="color: #000000;"&gt; setting.ExcelPositionString).FirstOrDefault();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (siIndex != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.TryParse(siIndex.Value, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; i))&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; siEntry = eleSharedStrings.Elements(nsSharedStrings + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;si&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).ElementAt(i);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (siEntry != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; child = siEntry.Element(nsSharedStrings + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (child != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                    {&lt;br/&gt;                        setting.OriginalText &lt;/span&gt;=&lt;span style="color: #000000;"&gt; child.Value;&lt;br/&gt;                        sContent &lt;/span&gt;=&lt;span style="color: #000000;"&gt; setting.ProcessFormatting(setting.processFormatting);&lt;br/&gt;                        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; note, cannot set empty content to the new XElement.&lt;/span&gt;&lt;br/&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!sContent.Equals(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty))&lt;br/&gt;                        {&lt;br/&gt;                            XElement newElement &lt;/span&gt;= XElement.Parse(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt;si xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + setting.ProcessFormatting(setting.processFormatting) + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt;/si&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                            siEntry.ReplaceWith(newElement);&lt;br/&gt;                        }&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;不能在原Stream上进行操作。首先将文件的Stream Copy出来一份。函数FindEntryFromZipStream()通过entryName来返回ZIP压缩包中指定的部分，返回类型为Stream。将找到的Stream交给UpdateSharedStringsXMLDoc()方法进行修改，该方法会逐一读取所有工作表XML文件，找到需要修改的部分的si节点的序号（该序号存放在工作表XML文件的sheetData-&amp;gt;c-&amp;gt;r节点中），然后修改sharedStrings.xml文件的内容。注意sharedStrings.xml文件加载的XElement对象只有一个，传入该对象到UpdateSharedStringsXMLDoc()方法进行修改，之后将其存入到一个MemoryStream对象中。接下来的代码便是将该MemoryStream重新加到ZIP包里，使用了类库提供的方法，注意如果指定的entryName在原ZIP包中存在则会直接替换，否则就添加。CustomStaticDataSource类是自定义的一个类，按照要求该类必须继承自IStaticDataSource接口。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CustomStaticDataSource : IStaticDataSource&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stream _stream;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Implement method from IStaticDataSource&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stream GetSource()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _stream;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Call this to provide the memorystream&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; SetStream(Stream inputStream)&lt;br/&gt;    {&lt;br/&gt;        _stream &lt;/span&gt;=&lt;span style="color: #000000;"&gt; inputStream;&lt;br/&gt;        _stream.Position &lt;/span&gt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;所有的操作都在一个Stream里完成，不需要临时目录存放解压后的文件。这里是上面整个类的完整下载，&lt;a href="http://files.cnblogs.com/jaxu/ExcelFormattingAdjustor.zip"&gt;ExcelFormattingAdjustor.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;例子中将所有需要修改样式的单元定义成常量，然后在自定义类ExcelFormattingSetting中存储设置样式的一些参数，如原内容、工作表名称、样式替换字符串，以及如何修改样式的委托等。将所有ExcelFormattingSetting类的实例存放到一个集合里，遍历该集合对所有的设置项进行修改。你可以在ExcelFormattingSetting类的ProcessFormatting()方法中定义如何替换这些样式字符串，如果遇到需要特殊处理的情况，就在该类的实例中定义一个匿名函数，在匿名函数中进行处理。&lt;/p&gt;&lt;p&gt;更多的应用还在不断尝试中，如果能够提供一个功能丰富且成熟的类库，我们完全可以脱离COM组件来操作Excel，包括创建一个全新的Excel文件、读取数据生成报表、导出数据到Excel文件并自定义样式等等。但所有这一切都应该归功于OpenXML，它使得Office文件从一个自封闭的环境中解脱出来了，基于XML结构的文件是开放的，因此我们做的所有工作其实就是在操作XML，如此简单！不是吗？&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2496956.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/05/12/2496956.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/05/11/2495316.html</id><title type="text">还有什么不能做？——细谈在C#中读写Excel系列文章之三</title><summary type="text">该系列文章的第三篇，介绍了OpenXML文件的一些基本概念以及Excel OpenXML包中文件之间的关系。另外给出了一个例子用来说明如何借用开源类库对zip压缩包的操作来读取和编辑Excel OpenXML文件。</summary><published>2012-05-10T23:35:00Z</published><updated>2012-05-10T23:35:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/05/11/2495316.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/05/11/2495316.html"/><content type="html">&lt;p&gt;在第二篇文章中我已经向大家详细介绍了Excel 2007以后版本的文件的OpenXML结构。所谓的OpenXML结构从本质上来讲其实就是一个ZIP压缩包，所有基于OpenXML数据结构的文件都一样。这样文件的结构是开放的，你不需要借助于任何第三方的组件就可以读取文件中的数据，或者修改文件的内容。而且所有资源文件诸如图片和多媒体文件都是被编译成一个固定的格式存放在压缩包中，而不是传统形式上的流。另外，以压缩包的形式存储数据也使得文件所占用的空间更小。&lt;/p&gt;&lt;p&gt;这些都是它的优点。其实，微软在.NET中已经提供了相应的类库来帮助我们操作OpenXML文件，就像我在第二篇文章中向大家介绍的一样，微软把OpenXML压缩包称之为一个Package，在Package中的文件称作Parts，不同的Parts有自己的Content Type。Content Type可以描述任何内容，如application XML，user XML，images，sounds，videos，或者其它二进制内容。各个Part之间通过一个被称之为relationship的part连接起来，这个part其实也是一种特殊的XML文件，后缀为".rels"，在Package中可以找到它。下图说明了一个Package中各个Part之间的关系，&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051106174083.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;虽然.NET中提供的Package类可以帮助我们非常方便地解析Excel包，但是也有许多的局限性，有的时候你不得不使用一些方法来自己读取包中的内容，或者尝试去修改包中的数据。&lt;/p&gt;&lt;p&gt;1. 将Package作为一个标准的zip文件进行解压。&lt;/p&gt;&lt;p&gt;2. 找到Package中你想要读取的parts。有许多的方法可以帮助你找到这些parts，你可以解析relationship，也可以直接通过path来定位到某一个文件，不过不太确定path在将来是否会有变化。或者还可以通过part的content type来找到它。&lt;/p&gt;&lt;p&gt;3. 读取part中的内容。如果parts是以XML的形式存放的，通过标准的XML类库就可以非常方便地读取到数据。如果是其它形式，如图片、声音或视频文件则也可以通过相应的方法来获取到内容。&lt;/p&gt;&lt;p&gt;另一方面，你也可以创建一个基于OpenXML的文件（如采用非COM组件的形式创建一个Excel文件），&lt;/p&gt;&lt;p&gt;1. 创建或复制所有必须的parts。通过标准XML类库来创建这些基于XML数据格式的parts，或者从其它package中复制这些parts，或者采用任何其它你所熟悉的方法。&lt;/p&gt;&lt;p&gt;2. 创建relationships部分。也就是创建一个后缀为".rels"的特殊XML文件。&lt;/p&gt;&lt;p&gt;3. 将整个package压缩成一个zip包，然后将文件的后缀修改成需要的类型（如docx，xlsx，或者pptx等）。只要package中的结构符合要求，修改之后的文件可以直接被打开。当然，该过程可以在完全没有安装office的机器上完成（例如服务器），然后分发给需要的地方使用。&lt;/p&gt;&lt;p&gt;所有这一切包括packages，parts，content types，以及relationships都被称之为OpenXML文档，微软将这个叫做Open Packaging Conventions。&lt;/p&gt;&lt;p&gt;有关Excel OpenXML的内部结构以及一些比较重要的节点含义在前一篇文章中已经做了一些介绍，除了直接使用.NET类库中的Package类之外，我们当然也可以使用其它的第三方类库或者自己编写代码读取包中的内容，这里有一个.NET的开源类库专门用来操作zip压缩文件。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/"&gt;http://www.icsharpcode.net/OpenSource/SharpZipLib/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;提供一个程序集下载吧，源代码大家去上面这个网址下载。&lt;a href="http://files.cnblogs.com/jaxu/ICSharpCode.SharpZipLib.zip"&gt;ICSharpCode.ShareZipLib.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;借用该类库中的ExtractZip()和CreateZip()方法可以帮助我们读取或修改（创建）Excel文件。当然这个类库中的某些代码是使用较早的.NET版本中的语法和对象来编写的，诸如ArratList、Hashtable等，它可能不适合在Silverlight工程中使用（支持Silverlight的.NET Framework与普通的.NET Framework有许多区别并且变化比较频繁），接下来的文章中我会向大家介绍如何在Silverlight工程中使用它。但现在并不妨碍我们在其它类型的工程中使用。&lt;/p&gt;&lt;p&gt;来看一看实际的例子。这里有一个类提供了一些方法用来读取和修改Excel文件中的数据：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Globalization;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Xml;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICSharpCode.SharpZipLib.Zip;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; XlsxReadWrite&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; XlsxRW&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; DeleteDirectoryContents(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; directory)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; info = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DirectoryInfo(directory);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; file &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; info.GetFiles())&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #000000;"&gt;                file.Delete();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; dir &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; info.GetDirectories())&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;                 dir.Delete(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; UnzipFile(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; zipFileName, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; targetDirectory)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FastZip().ExtractZip(zipFileName, targetDirectory, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ZipDirectory(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sourceDirectory, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; zipFileName)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FastZip().CreateZip(zipFileName, sourceDirectory, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; IList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; ReadStringTable(Stream input)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stringTable = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reader =&lt;span style="color: #000000;"&gt; XmlReader.Create(input))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (reader.MoveToContent(); reader.Read(); )&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (reader.NodeType == XmlNodeType.Element &amp;amp;&amp;amp; reader.Name == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        stringTable.Add(reader.ReadElementString());&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; stringTable;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ReadWorksheet(Stream input, IList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; stringTable, DataTable data)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; reader =&lt;span style="color: #000000;"&gt; XmlReader.Create(input))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;                 DataRow row = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; columnIndex = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; type;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (reader.MoveToContent(); reader.Read(); )&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (reader.NodeType ==&lt;span style="color: #000000;"&gt; XmlNodeType.Element)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (reader.Name)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt;                             &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;row&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;                                 row =&lt;span style="color: #000000;"&gt; data.NewRow();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt; &lt;span style="color: #000000;"&gt;                                data.Rows.Add(row);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;                                 columnIndex = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;                                 &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;                             &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;                                 type = reader.GetAttribute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;span style="color: #000000;"&gt;                                reader.Read();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;                                 value = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Parse(reader.ReadElementString(), CultureInfo.InvariantCulture);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;                                 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (type == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;                                     row[columnIndex] =&lt;span style="color: #000000;"&gt; stringTable[value];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;                                 &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;                                     row[columnIndex] =&lt;span style="color: #000000;"&gt; value;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt;                                 columnIndex++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;                                 &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; IList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; CreateStringTables(DataTable data, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; IDictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; lookupTable)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stringTable = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt;             lookupTable = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (DataRow row &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; data.Rows)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (DataColumn column &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; data.Columns)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (column.DataType == &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; value = (&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;)row[column];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;lookupTable.ContainsKey(value))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #000000;"&gt;                            lookupTable.Add(value, stringTable.Count);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #000000;"&gt;                            stringTable.Add(value);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; stringTable;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; WriteStringTable(Stream output, IList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; stringTable)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; writer =&lt;span style="color: #000000;"&gt; XmlWriter.Create(output))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt;                 writer.WriteStartDocument(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sst&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;count&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, stringTable.Count.ToString(CultureInfo.InvariantCulture));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;uniqueCount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, stringTable.Count.ToString(CultureInfo.InvariantCulture));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; str &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; stringTable)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt;                     writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;si&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt;                     writer.WriteElementString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, str);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; RowColumnToPosition(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; column)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ColumnIndexToName(column) +&lt;span style="color: #000000;"&gt; RowIndexToName(row);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;139&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;140&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;141&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; ColumnIndexToName(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; columnIndex)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;142&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;143&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; second = (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;)(((&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) + columnIndex % &lt;span style="color: #800080;"&gt;26&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;144&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;145&lt;/span&gt;             columnIndex /= &lt;span style="color: #800080;"&gt;26&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;146&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;147&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (columnIndex == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;148&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; second.ToString();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;149&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;150&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ((&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;)(((&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;) - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; + columnIndex)).ToString() +&lt;span style="color: #000000;"&gt; second.ToString();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;151&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;152&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;153&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; RowIndexToName(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; rowIndex)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;154&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;155&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (rowIndex + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;).ToString(CultureInfo.InvariantCulture);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;156&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;157&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;158&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; WriteWorksheet(Stream output, DataTable data, IDictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; lookupTable)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;159&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;160&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (XmlTextWriter writer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlTextWriter(output, Encoding.UTF8))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;161&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;162&lt;/span&gt;                 writer.WriteStartDocument(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;163&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;164&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;worksheet&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;165&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;166&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xmlns:r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.openxmlformats.org/officeDocument/2006/relationships&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;167&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;168&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;dimension&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;169&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; lastCell = RowColumnToPosition(data.Rows.Count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, data.Columns.Count - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;170&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ref&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A1:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; lastCell);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;171&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;172&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;173&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sheetViews&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;174&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sheetView&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;175&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;tabSelected&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;176&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;workbookViewId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;177&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;178&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;179&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;180&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sheetFormatPr&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;181&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;defaultRowHeight&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;15&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;182&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;183&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;184&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sheetData&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;185&lt;/span&gt; &lt;span style="color: #000000;"&gt;                WriteWorksheetData(writer, data, lookupTable);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;186&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;187&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;188&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;pageMargins&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;189&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;left&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.7&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;190&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;right&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.7&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;191&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;top&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.75&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;192&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;bottom&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.75&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;193&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;header&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;194&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;footer&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0.3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;195&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;196&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;197&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;198&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;199&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;200&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;201&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; WriteWorksheetData(XmlTextWriter writer, DataTable data, IDictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; lookupTable)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;202&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;203&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; rowsCount =&lt;span style="color: #000000;"&gt; data.Rows.Count;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;204&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; columnsCount =&lt;span style="color: #000000;"&gt; data.Columns.Count;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;205&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; relPos;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;206&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;207&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; row &amp;lt; rowsCount; row++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;208&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;209&lt;/span&gt;                 writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;row&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;210&lt;/span&gt;                 relPos =&lt;span style="color: #000000;"&gt; RowIndexToName(row);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;211&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, relPos);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;212&lt;/span&gt;                 writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;spans&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; columnsCount.ToString(CultureInfo.InvariantCulture));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;213&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;214&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; column = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; column &amp;lt; columnsCount; column++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;215&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;216&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; value =&lt;span style="color: #000000;"&gt; data.Rows[row][column];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;217&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;218&lt;/span&gt;                     writer.WriteStartElement(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;219&lt;/span&gt;                     relPos =&lt;span style="color: #000000;"&gt; RowColumnToPosition(row, column);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;220&lt;/span&gt;                     writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, relPos);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;221&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;222&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; str = value &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;223&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (str != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;224&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;225&lt;/span&gt;                         writer.WriteAttributeString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;226&lt;/span&gt;                         value =&lt;span style="color: #000000;"&gt; lookupTable[str];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;227&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;228&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;229&lt;/span&gt;                     writer.WriteElementString(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;v&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, value.ToString());&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;230&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;231&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;232&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;233&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;234&lt;/span&gt; &lt;span style="color: #000000;"&gt;                writer.WriteEndElement();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;235&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;236&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;237&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;238&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;1. DeleteDirectoryContents()方法用来清空临时目录的内容，该临时目录被用来存放解压Excel之后的文件。&lt;/p&gt;&lt;p&gt;2. UnzipFile()方法直接使用了开源类库中的ExtractZip()方法，将Excel文件解压到临时目录。&lt;/p&gt;&lt;p&gt;3. ZipDirectory()方法使用开源类库中的CreateZip()方法将临时目录中的内容重新打包成zip压缩文件。&lt;/p&gt;&lt;p&gt;4. ReadStringTable()方法用来读取xl/sharedStrings.xml文件中节点t的内容。其实应该是直接读取si节点的内容，应为并不是所有的si节点都有t子节点。&lt;/p&gt;&lt;p&gt;考虑一个情况：在Excel的单元格中，选中一部分内容，如内容中的某一个数字或某一个单词，然后对它单独设置样式。通过这种方法你可以将Excel单元格中的某一部分内容设置为粗体、上标，还可以在单元格内进行换行等。如下图：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051107042312.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;在Excel单元格内设置的样式被存放到sharedStrings.xml文件中后会变成如下这种形式：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;si&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;t &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xml:space&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="preserve"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  Short-term investments (including securities loaned &lt;br/&gt;    of &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;rPr&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;sz &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;color &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;rgb&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="FF404040"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;rFont &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Verdana"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;family &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;rPr&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;$9,999&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;rPr&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;sz &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;color &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;rgb&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="FF404040"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;rFont &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Verdana"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;family &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;rPr&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;t &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xml:space&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="preserve"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt; and $8,888)&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;si&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这个时候节点si中的内容就不是单纯的子节点t了。因此，如何解析XML文件需要根据实际情况去考虑，这主要取决于你在Excel文件中存储的内容。&lt;/p&gt;&lt;p&gt;5. ReadWorksheet()方法会按照指定的工作表XML文件（如"xl/worksheets/sheet1.xml"）在sharedStrings.xml文件中查找数据，并将结果存放到一个DataTable中。&lt;/p&gt;&lt;p&gt;6. CreateStringTables()和WriteStringsTable()方法用来创建一个sharedStrings.xml文件。&lt;/p&gt;&lt;p&gt;7. WriteWorksheet()方法用来创建一个工作表XML文件。&lt;/p&gt;&lt;p&gt;来看看如何调用：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ReadInput(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the input file name from the text box.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; fileName = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.inputTextBox.Text;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Delete contents of the temporary directory.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    XlsxRW.DeleteDirectoryContents(tempDir);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Unzip input XLSX file to the temporary directory.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;    XlsxRW.UnzipFile(fileName, tempDir);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;     IList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; stringTable;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Open XML file with table of all unique strings used in the workbook..&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stream = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileStream(Path.Combine(tempDir, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xl\sharedStrings.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;        FileMode.Open, FileAccess.Read))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ..and call helper method that parses that XML and returns an array of strings.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;         stringTable =&lt;span style="color: #000000;"&gt; XlsxRW.ReadStringTable(stream);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Open XML file with worksheet data..&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stream = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileStream(Path.Combine(tempDir, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xl\worksheets\sheet1.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        FileMode.Open, FileAccess.Read))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ..and call helper method that parses that XML and fills DataTable with values.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;         XlsxRW.ReadWorksheet(stream, stringTable, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.data);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; WriteOutput(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, RoutedEventArgs e)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the output file name from the text box.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fileName = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.outputTextBox.Text;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Delete contents of the temporary directory.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;    XlsxRW.DeleteDirectoryContents(tempDir);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Unzip template XLSX file to the temporary directory.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;    XlsxRW.UnzipFile(templateFile, tempDir);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; We will need two string tables; a lookup IDictionary&amp;lt;string, int&amp;gt; for fast searching &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; an ordinary IList&amp;lt;string&amp;gt; where items are sorted by their index.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;     IDictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; lookupTable;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Call helper methods which creates both tables from input data.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stringTable = XlsxRW.CreateStringTables(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.data, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; lookupTable);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Create XML file..&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stream = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileStream(Path.Combine(tempDir, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xl\sharedStrings.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #000000;"&gt;        FileMode.Create))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ..and fill it with unique strings used in the workbook&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt; &lt;span style="color: #000000;"&gt;        XlsxRW.WriteStringTable(stream, stringTable);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Create XML file..&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; stream = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileStream(Path.Combine(tempDir, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xl\worksheets\sheet1.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;        FileMode.Create))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ..and fill it with rows and columns of the DataTable.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;         XlsxRW.WriteWorksheet(stream, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.data, lookupTable);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ZIP temporary directory to the XLSX file.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt; &lt;span style="color: #000000;"&gt;    XlsxRW.ZipDirectory(tempDir, fileName);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; If checkbox is checked, show XLSX file in Microsoft Excel.&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.openFileCheckBox.IsChecked == &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt; &lt;span style="color: #000000;"&gt;        System.Diagnostics.Process.Start(fileName);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;你所要做的只是对XML进行操作，仅此而以！&lt;/p&gt;&lt;p&gt;支持.NET操作zip压缩包的类库应该还有很多，任何一个都可以，因为Excel的OpenXML文件本身就是一个标准的zip压缩包。但是上面的方法还是有一个局限性，那就是需要临时目录来存放解压之后的文件，以及重新打包时所指定的源文件。对普通的Windows应用程序或asp.net应用程序而言这个并没有什么困难，只要权限允许，读写临时目录没有任何问题，但是在Silverlight中则有所不同，因为在Silverlight中读写客户端文件需要比较高的安全级别和认证，这就导致解压文件会有困难，一个简单的方法就是直接在文件的流中进行解压和修改，然后再将流打包成zip文件。下一篇文章中我会向大家介绍如何在Silverlight中使用，以及如何定义一个类来完成Excel文件中某些字符串样式的修改。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2495316.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/05/11/2495316.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/05/10/2493627.html</id><title type="text">还有什么不能做？——细谈在C#中读写Excel系列文章之二</title><summary type="text">该系列文章的第二篇，主要介绍了如何使用WindowsBase.dll类库中的System.IO.Packaging.Package读取Excel文件包中的内容，不使用COM组件。</summary><published>2012-05-09T22:27:00Z</published><updated>2012-05-09T22:27:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/05/10/2493627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/05/10/2493627.html"/><content type="html">&lt;p&gt;在前一篇文章中我谈到了Excel 2007以后版本的文件其实就是一个zip压缩包，里面包含了该Excel文件的所有内容和使用的资源，大部分文件都是以XML的形式存放的。再来回顾一下解压之后的文件夹结构，&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012050906111534.png" alt="" width="494" height="181" /&gt;&lt;/p&gt;&lt;p&gt;其中比较重要的是xl文件夹，里面包含了一些很有用的信息。sharedStrings.xml文件存放了Excel中所有的字符串数据。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051004375247.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;worksheets文件夹中存放了所有的工作表信息，如果你的Excel文件中包含多个工作表，则这里你会发现有多个与工作表对应的xml文件。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051004402095.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;来看一下sharedStrings.xml和工作表xml文件之间的关系。首先找到对应的工作表xml文件，如上图所示文件夹中的sheet3.xml，找到该xml文件的sheetData节点，下面包含有row节点，用来表示该工作表中的每一行，属性r代表行号。子节点c表示了该行中的每一个单元格，属性r表示单元格在Excel工作表的位置，如&amp;ldquo;A1&amp;rdquo;。注意属性t="s"，它表示该单元格的内容是存储在sharedStrings.xml文件中的，其子节点v的值用来说明该值在sharedStrings.xml文档中的位置。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051004443149.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;sharedStrings.xml文件中包含有很多si节点，其中存放的就是Excel文件里各个工作表中的字符串数据。上图中v节点的值代表的就是sharedStrings.xml文件中si节点的序号，该序号从1开始计数。通过这个关系，我们就可以在sharedStrings.xml文件中找到我们想要的数据了。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012051004514237.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;弄清楚这个关系之后，我们再来看看如何通过代码取到我们想要的数据。从.NET Framework 3.0之后提供了一个新的类库可以帮助我们直接读取Excel包里面的文件。如果你的.NET工程是普通的Windows应用程序，那可以直接在工程中引用WindowsBase.dll类库。如果你的工程是非Windows应用程序，如Silverlight，则无法引用该类库，在后续的文章中我还会再介绍如何在Silverlight工程中读取Excel包里的文件。&lt;/p&gt;&lt;p&gt;还是直接上代码吧，写太多文字大家看得也累！&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Collections.Generic;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.ComponentModel;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Drawing;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Windows.Forms;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO.Packaging;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Xml;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Xml.Linq;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExcelPackageOperator&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 : Form&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1()&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #000000;"&gt;            InitializeComponent();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;             List&amp;lt;Cell&amp;gt; parsedCells = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Cell&amp;gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fileName = &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C:\Users\jaxu\Desktop\Example.xlsx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;(Package xlsxPackage =&lt;span style="color: #000000;"&gt; Package.Open(fileName, FileMode.Open, FileAccess.Read))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; load sharedStrings.xml document from Excel package&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt;                 PackagePartCollection allParts =&lt;span style="color: #000000;"&gt; xlsxPackage.GetParts();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;                 PackagePart sharedStringsPart = (&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; part &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; allParts&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt;                                                  &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; part.Uri.OriginalString.Equals(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/xl/sharedStrings.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt;                                                  &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; part).Single();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; load to XElement from sharedStrings.xml document&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt;                 XElement sharedStringsElement =&lt;span style="color: #000000;"&gt; XElement.Load(XmlReader.Create(sharedStringsPart.GetStream())); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; read all fixed text to a dictionary from sharedStrings document&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt;                 Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; sharedStrings = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;(); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #000000;"&gt;                ParseSharedStrings(sharedStringsElement, sharedStrings); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;                 &lt;br/&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; get worksheet 1&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;                 XElement worksheetElement = GetWorksheet(&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;, allParts); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;                 &lt;br/&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;                 IEnumerable&amp;lt;XElement&amp;gt; cells = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; c &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; worksheetElement.Descendants(ExcelNamespaces.excelNamespace + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;                                               &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; c; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt;                 &lt;br/&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (XElement cell &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; cells) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cell.HasElements &amp;amp;&amp;amp; cell.Attribute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; cell.Attribute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;t&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).Value.Equals(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; cellPosition = cell.Attribute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).Value;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index =&lt;span style="color: #000000;"&gt; IndexOfNumber(cellPosition);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; column = cellPosition.Substring(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, index);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row = Convert.ToInt32(cellPosition.Substring(index, cellPosition.Length -&lt;span style="color: #000000;"&gt; index));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; valueIndex = Convert.ToInt32(cell.Descendants(ExcelNamespaces.excelNamespace + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;v&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).Single().Value);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;                         parsedCells.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Cell(column, row, sharedStrings[valueIndex]));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;span style="color: #000000;"&gt;                } &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;             &lt;br/&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;From here is additional code not covered in the posts, just to show it works&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (Cell cell &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; parsedCells)            &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.textBox1.Text += cell.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Console.WriteLine(cell);            &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ParseSharedStrings(XElement SharedStringsElement, Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt; sharedStrings) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt; &lt;span style="color: #000000;"&gt;        { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;             IEnumerable&amp;lt;XElement&amp;gt; sharedStringsElements = &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; SharedStringsElement.Descendants(ExcelNamespaces.excelNamespace + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;si&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt;                                                           &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; s; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;             &lt;br/&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Counter = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (XElement sharedString &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; sharedStringsElements) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; &lt;span style="color: #000000;"&gt;            { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;                 sharedStrings.Add(Counter, sharedString.Value); Counter++&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt; &lt;span style="color: #000000;"&gt;            } &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }         &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;         &lt;br/&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; XElement GetWorksheet(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; worksheetID, PackagePartCollection allParts) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;span style="color: #000000;"&gt;        { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;             PackagePart worksheetPart = (&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; part &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; allParts &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;                                          &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; part.Uri.OriginalString.Equals(String.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/xl/worksheets/sheet{0}.xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, worksheetID)) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;                                          &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; part).Single(); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; XElement.Load(XmlReader.Create(worksheetPart.GetStream())); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt;         &lt;br/&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; IndexOfNumber(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; value) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #000000;"&gt;        { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; counter = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; counter &amp;lt; value.Length; counter++&lt;span style="color: #000000;"&gt;) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #000000;"&gt;            { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IsNumber(value[counter])) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #000000;"&gt;                { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; counter; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;             &lt;br/&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExcelNamespaces &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;span style="color: #000000;"&gt;    { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; XNamespace excelNamespace = XNamespace.Get(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; XNamespace excelRelationshipsNamepace = XNamespace.Get(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.openxmlformats.org/officeDocument/2006/relationships&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);    &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Cell &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Cell(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; column, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; row, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; data) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Column =&lt;span style="color: #000000;"&gt; column; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Row =&lt;span style="color: #000000;"&gt; row; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Data =&lt;span style="color: #000000;"&gt; data; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;         &lt;br/&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; ToString() &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}:{1} - {2}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Row, Column, Data); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt;         &lt;br/&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Column &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt;         &lt;br/&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Row &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt;         &lt;br/&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Data &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;1. 使用Package类直接打开Excel文件，该类属于System.IO.Packing命名空间，必须确保工程中引用了WindowsBase.dll类库。&lt;/p&gt;&lt;p&gt;2.&amp;nbsp;通过GetParts()方法读取包里面的内容。注意LINQ语句取到的是sharedStrings.xml文件。&lt;/p&gt;&lt;p&gt;3. 将读取到的sharedStrings.xml文件加载到XElement对象中，然后通过PaseSharedStrings这个自定义函数读取里面所有的si子节点并存放到一个字典里。&lt;/p&gt;&lt;p&gt;4. 自定义函数GetWorksheet用来将指定的工作表xml从包中读取出来加载到XElement对象中。&lt;/p&gt;&lt;p&gt;5. 程序接下来的部分就是遍历工作表xml中所有的节点c，并从属性r中找出单元格的行编号和列编号。然后将准备好的数据存储到parsedCells集合中，该集合的类型是一个自定义的Cell对象，该对象包含三个属性（行编号、列编号和数据内容）和一个改写的ToString()方法，该方法用来定义数据输出格式。&lt;/p&gt;&lt;p&gt;注意数据是从字典中取出来的，字典的Key值就是节点r的子节点v的值！还记得文章一开始我们介绍的sharedStrings.xml文件和工作表xml文件之间的关系吗？这里就是借用的这个关系。另外在遍历工作表xml中的节点c时是过滤掉了那些不包含有属性t="s"的节点的，因为这些节点直接存储了数据，而不需要再从sharedStrings.xml去取。&lt;/p&gt;&lt;p&gt;6. 输出parsedCells集合中的数据。&lt;/p&gt;&lt;p&gt;好了，程序的结构就是这样。代码可能稍稍有点长，只看主要的部分，其实还是很简单的：借用WindowsBase类库中的System.IO.Packing.Package对象来读取Excel包里的内容，然后找出sharedStrings.xml文件中的所有字符串数据并存放到一个字典中，遍历你想要操作的工作表xml文件，按单元格的位置从字典中找出对应的数据显示出来。&lt;/p&gt;&lt;p&gt;不过还是有一个遗憾。在使用.NET现有的功能时总会遇到一些问题！该对象并没有提供对Excel文件的修改和保存功能，至少我没有发现。也就是说它可以允许我们在不调用COM组件的情况下非常方便地读取Excel文件中的数据，包括字符串和数字。另外还有一个问题就是该类库不能在Silverlight工程中引用，如果你刚好想在Silverlight工程中使用该功能那么只能想其它的方法了。不过有一个问题值得思考，那就是既然Excel是一个zip压缩包，而且里面大部分的数据都是以xml文件的格式存储的，我们何不自己写代码解压然后读取或者修改xml文件呢？甚至我们还可以把修改之后的文件重新打包还原成一个新的Excel文件，这样的话我们就可以实现Excel文件内容的修改，而且也可以在Silverlight工程中使用了。&lt;/p&gt;&lt;p&gt;我会在接下来的文章中介绍如何把Excel文件作为zip压缩包来进行操作，包括读取和修改。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2493627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/05/10/2493627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/05/09/2491096.html</id><title type="text">还有什么不能做？——细谈在C#中读写Excel系列文章之一</title><summary type="text">Excel 2007之后的文件格式XLSX其实就是ZIP文件，里面以XML文件的形式存储了Excel的所有数据和资源。我们可以在.NET中直接以ZIP文件的形式读取Excel文件并操作里面的数据。本文是这一系列文章的开篇，简单介绍了一下Excel文件的格式和组织形式，在接下来的文章中我会详细介绍如何在没有安装Excel app的机器上操作Excel文件并读写数据。另外本文还简单介绍了下SharePoint Excel REST Services服务以及如何通过特定的URL与SharePoint Library中的Excel文件进行数据交互。</summary><published>2012-05-08T22:56:00Z</published><updated>2012-05-08T22:56:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/05/09/2491096.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/05/09/2491096.html"/><content type="html">&lt;p&gt;在写这一系列文章之前，我要首先申明一个事情，那就是自打.NET一开始我们大概就已经开始使用它在自己的程序中与Excel进行交互了，诸如从Excel中读取数据显示报表、将程序中的数据导出到Excel中等等。这个看似很平常，而且我相信有很多的人都写过或看过类似的程序。在早期版本的.NET中我们需要在Windows中执行一个命令（时间太久我也不太记得这个命令叫什么了）来将Office COM组件变成托管代码以便在.NET程序中调用，后来的.NET Framework可以完全支持Office COM组件的调用，但需要在工程中添加引用。但是无论怎样，我们在程序中都是对Office COM组件进行操作，这样会有许多不便，无论从程序执行效率上还是代码编辑上都会让你感觉很别扭。&lt;/p&gt;&lt;p&gt;那现在又有什么不同呢？&lt;/p&gt;&lt;p&gt;我的意思是说如果你的程序运行的环境没有安装Office，或者说运行环境中没有注册Office COM组件，那会怎样？&lt;/p&gt;&lt;p&gt;你可能会说那不是程序本身的问题，我们甚至可以要求客户提供Office COM组件。但是请注意，如果你的程序要求跨平台使用，而Office COM组件在目标平台上并不受支持（怎么会有这么奇怪的需求？！），你可能会遇到点麻烦。这个时候我们可以考虑在程序中提供一个替代的选项来禁用相应的功能，从而避免程序错误地使用并不存在的Office COM组件。&lt;/p&gt;&lt;p&gt;不过，如果能有一个行之有效的办法解决所有的问题难道不是一件令人兴奋的事情吗？我们可否绕过Office COM组件而直接对文件本身进行操作呢？（有点痴心妄想了）这个想法有点夸张，在早期版本的Excel文件中（应该是在Excel&amp;nbsp;2007之前）几乎是行不通的，但从Excel 2007之后这个事情变得可行了。&lt;/p&gt;&lt;p&gt;在Excel 2007之后的版本中，文件名的后缀变成XLSX了，其实这个也是SpreadsheetXL。我们有三种方法可以操作它：自己写解析器分析文件中的内容，这个可能会比较麻烦；第二种是使用Microsoft提供的OpenXML SDK来操作Excel文件，OPENXML SDK到目前为止应该有两个版本，而且包含的功能还是很丰富的；第三种就是直接使用自.NET Framework 3.0之后提供的新功能直接操作Excel文件。&lt;/p&gt;&lt;p&gt;先介绍下什么是XLSX文件。看下面这个图就明白了。&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012050906060097.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;XLSX文件本身就是一个压缩包，里面包含了Excel文件中所有的数据和样式，包括一些资源文件（如图片、链接等等），这些文件几乎都以XML的形式放在压缩包里不同的文件夹中。只要我们熟悉了这些XML文件的结构以及不同文件夹的用途，就可以非常方便地以ZIP压缩文件的形式操作XLSX文件了。下面这个图就是解压XLSX文件后的内容：&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2012/51946/2012050906111534.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;稍后我会介绍如何通过各种不同的方式来使用XLSX文件以及各种不同的应用。但在这之前我想先说一下Excel的REST应用。这里有几个链接可以帮助你了解什么是Excel REST应用。&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee556820.aspx"&gt;http://msdn.microsoft.com/en-us/library/ee556820.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dwang/archive/2010/12/08/1899983.html"&gt;http://www.cnblogs.com/dwang/archive/2010/12/08/1899983.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh124646.aspx"&gt;http://msdn.microsoft.com/en-us/library/hh124646.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Excel REST是SharePoint Excel Services提供的一个用来访问Excel文件的服务，我们只需要通过一个简单的URL就可以得到Excel文件中的数据，使用非常方便。而且我们还可以通过这个URL来修改Excel中某些单元格的数据，甚至获取或修改图表。具体的使用方法和例子大家可以查看MSDN，上面会有非常详细的介绍。&lt;/p&gt;&lt;p&gt;在使用Excel REST服务返回Range数据时，如果所对应的工作表有自定义名称，URL应该是怎样的？这里有几个例子：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;读取Student表，范围从A1到G5，注意%7C是转义之后的冒号。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://&amp;lt;ServerName&amp;gt;/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('Student!A1%7CG5')?$format=html"&gt;http://&amp;lt;ServerName&amp;gt;/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('Student!A1%7CG5')?$format=html&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;读取Teacher and Student表，范围从D5到CG27。注意表名中的空格可能需要进行转义。另外就是表名用了两个单引号括起来。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://&amp;lt;ServerName&amp;gt;/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher%20and%20Student''!D5%7CCG27')?$format=html"&gt;http://&amp;lt;ServerName&amp;gt;/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher%20and%20Student''!D5%7CCG27')?$format=html&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;读取Teacher表，范围为A10单元格。注意表名也用了两个单引号括起来。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://&amp;lt;ServerName&amp;gt;/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher''!A10%7CA10')?$format=html"&gt;http://&amp;lt;ServerName&amp;gt;/_vti_bin/ExcelRest.aspx/ExcelTemplates/sampleWorkbook.xlsx/Model/Ranges('''Teacher''!A10%7CA10')?$format=html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在Excel中，自定义的表名可以用两个单引号括起来。Excel REST Services返回的数据类型有三种：html、atom和xml。注意atom是RSS的格式，如果返回的数据类型不符合RSS规范则无法显示。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2491096.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/05/09/2491096.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/04/17/2452988.html</id><title type="text">如何在XSLT中将字符串转换为大写或小写形式</title><summary type="text">一个介绍如何在XSLT 1.0中转换字符串大小写形式的方法。</summary><published>2012-04-16T17:31:00Z</published><updated>2012-04-16T17:31:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/04/17/2452988.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/04/17/2452988.html"/><content type="html">&lt;p&gt;查阅&lt;a href="http://www.w3school.com.cn/xpath/xpath_functions.asp#string"&gt;w3school&lt;/a&gt;的文档，你会看到XSLT提供了两个系统函数用于转换字符串的大小写形式：upper-case()和lower-case()。但是这两个函数是针对于XSLT2.0以上版本的，Microsoft所使用的XSLT都是1.0版本的，所以当你在代码中使用这两个函数时会提示无效。这里有一个替代的解决方案，使用translate()函数可以解决这个问题。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:variable &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="smallcase"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="'abcdefghijklmnopqrstuvwxyz'"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:variable &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="uppercase"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt; &lt;br/&gt; &lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="/"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:value-of &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="translate(doc, $smallcase, $uppercase)"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;事先定义好两个变量，用于存储英文中26个字母的大小写形式，然后在translate()函数中对要进行的字符串进行转换。上例中是将字符串转换为大写形式，颠倒$smallcase和$uppercase两个变量的位置实现将字符串转换为小写形式。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2452988.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/04/17/2452988.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/04/13/2445134.html</id><title type="text">XSLT解析InfoPath生成的XML文件并去掉文件中的InfoPath额外信息</title><summary type="text">使用XSLT输出InfoPath生成的XML文件，并在输出结果中将文件头中的InfoPath额外信息过滤掉。</summary><published>2012-04-12T23:29:00Z</published><updated>2012-04-12T23:29:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/04/13/2445134.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/04/13/2445134.html"/><content type="html">&lt;p&gt;InfoPath表单用来生成模板所规定格式的XML文档，但是在生成的XML文件中常常会包含一些额外信息，这些信息也是以节点的形式出现在XML文件中，并且在根节点之外，主要用于在IE中识别该XML文件是用InfoPath表单生成的可以直接用InfoPath打开，如果你在其它的浏览器中打开这些文件，则不会出现文件打开的提示。这些额外信息在程序中处理的时候难免会带来一些麻烦，影响我们对XML节点的处理和操作。这些额外信息可以在C#中找到相应的对象，看我的另一篇文章&lt;a href="http://www.cnblogs.com/jaxu/archive/2011/10/04/2198752.html%C3%A3%C2%80%C2%82"&gt;http://www.cnblogs.com/jaxu/archive/2011/10/04/2198752.html。&lt;/a&gt;&lt;/p&gt;&lt;p&gt;例如我有一个非常简单的页面，功能就是把指定的XML文件原样输出到页面上，我考虑用XSLT对象来解析这些XML文件，然后把结果输出到页面上。XSLT中的代码应该非常简单，只需要将所有的节点原样输出就行了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:stylesheet &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1.0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; xmlns:xsl&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://www.w3.org/1999/XSL/Transform"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    xmlns:msxsl&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="urn:schemas-microsoft-com:xslt"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; exclude-result-prefixes&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="msxsl"&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:output &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;method&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="xml"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; indent&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="yes"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="*"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:copy-of &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="./node()"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;然后在C#代码中使用XPathDocument和XslCompiledTransform来转换输出结果。但是我发现这样做在IE中打开页面的时候总是提示要打开文件，原因就是因为IE识别出了这些XML文件中的InfoPath的额外信息。当然，如果你用FireFox打开的话则不会出现提示，而且你还能看到那些额外信息也被解析出来了。最简单的解决办法就是在输出之前将这些额外信息去掉，你完全可以在C#里来实现，这里给出用XSLT的实现方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:stylesheet &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1.0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; xmlns:xsl&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://www.w3.org/1999/XSL/Transform"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br/&gt;    xmlns:msxsl&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="urn:schemas-microsoft-com:xslt"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; exclude-result-prefixes&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="msxsl"&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:output &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;indent&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="yes"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; omit-xml-declaration&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="yes"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; method&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="xml"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br/&gt;        &amp;lt;xsl:copy-of select="./node()"/&amp;gt;&lt;br/&gt;    &amp;lt;/xsl:template&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="/"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; select all nodes and only attributes in the default namespace&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:apply-templates &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@*[namespace-uri()='']|node()"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; copy any other element type node in any other namespace &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="node()"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; redefine the element: note that all other namespace declarations&lt;br/&gt;are omitted &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:element &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{name()}"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; namespace&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{namespace-uri()}"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; match any child attribute or node &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:apply-templates &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;select&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@*[namespace-uri()='']|node()"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; copy any other non-element type nodes &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@*|text()|comment()"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:copy&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; delete InfoPath PI node &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="processing-instruction('mso-infoPathSolution')"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; output nothing &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; delete Office ProgID PI node &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="processing-instruction('mso-application')"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; output nothing &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; delete others &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;match&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="processing-instruction('MicrosoftWindowsSharePointServices')"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; output nothing &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;代码中使用了XSLT的template匹配以及系统函数，在匹配到InfoPath额外信息节点时什么也不输出，从而在最终的输出结果中将InfoPath额外信息过滤掉。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2445134.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/04/13/2445134.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/04/07/2435593.html</id><title type="text">使用Microsoft Expression Encoder将音频转换为视频并配上背景图片或背景音乐</title><summary type="text">使用Microsoft Expression Encoder将音频转换为视频并配背景图片或背景音乐。</summary><published>2012-04-06T22:45:00Z</published><updated>2012-04-06T22:45:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/04/07/2435593.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/04/07/2435593.html"/><content type="html">&lt;p&gt;Microsoft Expression Encoder是Microsoft Expression产品中的一部分，它主要的功能是转换和重新编码媒体文件，如将视频或音频文件转换为Web支持的格式，或者进行各种音视频文件格式之间的转换，将媒体文件转换为Microsoft Smooth Streaming支持的格式或者Silverlight媒体文件格式等。Encoder提供的功能很强大，而且非常专业，大家可以去微软的官方站点查看介绍和下载使用版本，&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=19652"&gt;http://www.microsoft.com/download/en/details.aspx?id=19652&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;有关如何在Encoder中转换Smooth Streaming格式的文件请看我另一篇较早的文章&lt;a href="http://www.cnblogs.com/jaxu/archive/2010/01/08/1642143.html"&gt;http://www.cnblogs.com/jaxu/archive/2010/01/08/1642143.html&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;本文主要介绍下如何在Encoder中将音频格式的文件转换为视频格式，并且添加播放时的背景图片或背景音乐。&lt;/p&gt;&lt;p&gt;1. 打开Expression Encoder导入一个你想要转换的音频文件。直接点击Encoder窗体下方的Import按钮即可。导入成功后Encoder会给出该音频文件的相关信息并显示在Media Content中，如下图：&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012040706140068.png" alt="" width="871" height="115" /&gt;&lt;/p&gt;&lt;p&gt;2. 在窗体的右侧选择Encode tab，然后选择输出格式。由于导入的媒体文件是音频格式，所以默认情况下Video复选框是没有被选上的。勾选Video，然后可以根据需要选择不同的Video和Audio的编码格式。Encoder给出了很多用来进行媒体文件转换的选项，如进行文件截取Clips，修改尺寸，比特率、帧率等等。&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012040706193489.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;3. 在Output tab中选择好输出文件的位置，然后直接点击窗体下方的Encode按钮就可以开始转换工作了。转换时间的长短取决于被转换文件的大小和机器的性能，一般情况下几十兆的文件转换时间大概在几分钟左右。&lt;/p&gt;&lt;p&gt;4. 因为是将音频文件转换为视频格式，因此转换完后在Windows Media Player中播放时是没有画面的，也就是说用户体验并不好。Encoder允许你给视频提供Overlay image，也就是在视频播放的时候放置在视频上方的图片，我们可以使用该功能添加背景图片。在设置窗口中选择Enhance tab，然后在Visual Overlay中勾选Add Overlay，在弹出的对话框中选择你要添加的图片。你还可以设置该图片在视频中的什么时间段显示，以及透明度、大小和位置等等。这里我们直接选择Maintain Aspect Radio，意思就是说图片的长宽比是固定的，这样的话当你放大和缩小视频播放起时图片的大小会自动调整。同样，在Audio Overlay中你还可以添加背景音乐，方法与Visual Overlay类似。&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012040706303838.png" alt="" width="292" height="554" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012040706305558.png" alt="" width="664" height="332" /&gt;&lt;/p&gt;&lt;p&gt;你可以看到进度条上方绿色的duration以及你所使用的Visual Overlay图片的文件名，可以选择Visual Overlay图片在视频的什么时间段内显示。当然，如果你要转换的文件本身就是视频文件并且包含有真实的视频内容，则你可以借用该功能添加说明内容的图片或者广告等等。下面是转换完成后在Windows Media Player中播放时的效果。&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012040706412335.png" alt="" width="442" height="344" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2435593.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/04/07/2435593.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/02/15/2352589.html</id><title type="text">SQL Server打开数据表中的XML内容时报错的解决办法</title><summary type="text">默认情况下在SQL Server Management Studio中查看XML数据内容时报以下错误：Unable to show XML. The following error happended:Unexpected end of file while parsing Name has occurred. Line ***, position ***.One solution is to increase the number of characters retrieved from the server for xml data. To change this setting, on the Tools menu, click Options.</summary><published>2012-02-15T06:40:00Z</published><updated>2012-02-15T06:40:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/02/15/2352589.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/02/15/2352589.html"/><content type="html">&lt;p&gt;从SQL Server2005开始提供了一种新的数据类型XML type，它允许用户将数据以XML文件的格式直接存储到数据表中。结合在ASP.NET中使用Linq to Sql，我们可以非常方便地将XML文件存储到SQL Server数据库中。但是在默认情况下，如果你存储的XML文件比较大（超过2MB），在SQL Server管理器中不能直接点击查看XML内容而报以下错误提示：&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012021514294271.jpg" alt="" width="576" height="160" /&gt;&lt;/p&gt;&lt;p&gt;如何解决该问题呢？很简单，其实错误提示中已经描述地很清楚了，在SQL Server Management Studio中点击Tools菜单，选择Options。然后找到下图对应的设置节点，将XML data的最大字符限制改成Unlimited（无限制）即可。&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012021514332934.jpg" alt="" width="659" height="357" /&gt;&lt;/p&gt;&lt;p&gt;默认情况下，SQL Server为了提高查询效率，在Management Studio中最多只返回小于2MB的XML数据内容，如果你存储的XML文件的内容大于2MB则剩余的字符会自动被截断，从而在打开的时候出错。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2352589.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/02/15/2352589.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2012/01/31/2333798.html</id><title type="text">IE9不能在线打开InfoPath表单的解决办法</title><summary type="text">解决在IE9中无法在线打开InfoPath表单的问题。</summary><published>2012-01-31T09:25:00Z</published><updated>2012-01-31T09:25:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2012/01/31/2333798.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2012/01/31/2333798.html"/><content type="html">&lt;p&gt;在IE9中，我们在线打开SharePoint文档库中的InfoPath表单时会出现下面的错误，如何解决这个问题？&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012013117104153.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;1. 在IE9的工具栏上单击右键，选择Menu bar，显示菜单栏。&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012013117174667.jpg" alt="" width="478" height="186" /&gt;&lt;/p&gt;&lt;p&gt;2. 在菜单栏中选择Tools-&amp;gt;Compatibility View Settings，在打开的窗口中将当前站点添加到兼容性视图的列表中。&lt;/p&gt;&lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" src="http://pic002.cnblogs.com/images/2012/51946/2012013117220090.jpg" alt="" width="311" height="356" /&gt;&lt;/p&gt;&lt;p&gt;3. 点击确定，刷新页面。然后就可以IE9中在线打开InfoPath表单了。当然，你也可以勾选Display all websites in Compatibility View，这样所有的站点都会默认在兼容模式下打开，也就不会出现无法在线打开InfoPath表单的问题了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2333798.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2012/01/31/2333798.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jaxu/archive/2011/12/31/2308376.html</id><title type="text">日期和时间处理的类库</title><summary type="text">一个处理日期和时间的工具类库。</summary><published>2011-12-31T01:31:00Z</published><updated>2011-12-31T01:31:00Z</updated><author><name>Jaxu</name><uri>http://www.cnblogs.com/jaxu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jaxu/archive/2011/12/31/2308376.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jaxu/archive/2011/12/31/2308376.html"/><content type="html">&lt;p&gt;发一个专门处理时间和日期的类库，记录以备查询。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; Utilities&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Common DateTime Methods.&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt; Quarter&lt;br /&gt;    {&lt;br /&gt;        First = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;,&lt;br /&gt;        Second = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;,&lt;br /&gt;        Third = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;,&lt;br /&gt;        Fourth = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt; Month&lt;br /&gt;    {&lt;br /&gt;        January = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;,&lt;br /&gt;        February = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;,&lt;br /&gt;        March = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;,&lt;br /&gt;        April = &lt;span style="color: #800080;"&gt;4&lt;/span&gt;,&lt;br /&gt;        May = &lt;span style="color: #800080;"&gt;5&lt;/span&gt;,&lt;br /&gt;        June = &lt;span style="color: #800080;"&gt;6&lt;/span&gt;,&lt;br /&gt;        July = &lt;span style="color: #800080;"&gt;7&lt;/span&gt;,&lt;br /&gt;        August = &lt;span style="color: #800080;"&gt;8&lt;/span&gt;,&lt;br /&gt;        September = &lt;span style="color: #800080;"&gt;9&lt;/span&gt;,&lt;br /&gt;        October = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;,&lt;br /&gt;        November = &lt;span style="color: #800080;"&gt;11&lt;/span&gt;,&lt;br /&gt;        December = &lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DateUtilities&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Quarter&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfQuarter( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Year, Quarter Qtr )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( Qtr == Quarter.First )    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1st Quarter = January 1 to March 31&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( Qtr == Quarter.Second ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 2nd Quarter = April 1 to June 30&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( Qtr == Quarter.Third ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 3rd Quarter = July 1 to September 30&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;7&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4th Quarter = October 1 to December 31&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;10&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfQuarter( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Year, Quarter Qtr )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( Qtr == Quarter.First )    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1st Quarter = January 1 to March 31&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;3&lt;/span&gt;, DateTime.DaysInMonth( Year, &lt;span style="color: #800080;"&gt;3&lt;/span&gt; ), &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( Qtr == Quarter.Second ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 2nd Quarter = April 1 to June 30&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;6&lt;/span&gt;, DateTime.DaysInMonth( Year, &lt;span style="color: #800080;"&gt;6&lt;/span&gt; ), &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( Qtr == Quarter.Third ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 3rd Quarter = July 1 to September 30&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;9&lt;/span&gt;, DateTime.DaysInMonth( Year, &lt;span style="color: #800080;"&gt;9&lt;/span&gt; ), &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4th Quarter = October 1 to December 31&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;12&lt;/span&gt;, DateTime.DaysInMonth( Year, &lt;span style="color: #800080;"&gt;12&lt;/span&gt; ), &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; Quarter GetQuarter( Month month )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( month &amp;lt;= Month.March )    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1st Quarter = January 1 to March 31&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Quarter.First;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( ( month &amp;gt;= Month.April ) &amp;amp;&amp;amp; ( month &amp;lt;= Month.June ) ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 2nd Quarter = April 1 to June 30&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Quarter.Second;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( ( month &amp;gt;= Month.July ) &amp;amp;&amp;amp; ( month &amp;lt;= Month.September ) ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 3rd Quarter = July 1 to September 30&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Quarter.Third;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 4th Quarter = October 1 to December 31&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Quarter.Fourth;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfLastQuarter()&lt;br /&gt;        {            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( DateTime.Now.Month &amp;lt;= (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)Month.March ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;go to last quarter of previous year&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfQuarter( DateTime.Now.Year - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, GetQuarter( Month.December ));&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;return last quarter of current year&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfQuarter( DateTime.Now.Year, GetQuarter( (Month)DateTime.Now.Month));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfLastQuarter()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( DateTime.Now.Month &amp;lt;= &lt;span style="color: #800080;"&gt;3&lt;/span&gt; ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;go to last quarter of previous year&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfQuarter( DateTime.Now.Year - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, GetQuarter( Month.December ));&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;return last quarter of current year&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfQuarter( DateTime.Now.Year, GetQuarter( (Month)DateTime.Now.Month));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfCurrentQuarter()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfQuarter( DateTime.Now.Year, GetQuarter( (Month)DateTime.Now.Month ));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfCurrentQuarter()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfQuarter( DateTime.Now.Year, GetQuarter( (Month)DateTime.Now.Month ));&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Weeks&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfLastWeek()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; DaysToSubtract = (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)DateTime.Now.DayOfWeek + &lt;span style="color: #800080;"&gt;7&lt;/span&gt;;&lt;br /&gt;            DateTime dt = DateTime.Now.Subtract( System.TimeSpan.FromDays( DaysToSubtract ) );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( dt.Year, dt.Month, dt.Day, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfLastWeek()&lt;br /&gt;        {&lt;br /&gt;            DateTime dt = GetStartOfLastWeek().AddDays(&lt;span style="color: #800080;"&gt;6&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( dt.Year, dt.Month, dt.Day, &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfCurrentWeek()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; DaysToSubtract = (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)DateTime.Now.DayOfWeek ;&lt;br /&gt;            DateTime dt = DateTime.Now.Subtract( System.TimeSpan.FromDays( DaysToSubtract ) );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( dt.Year, dt.Month, dt.Day, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfCurrentWeek()&lt;br /&gt;        {&lt;br /&gt;            DateTime dt = GetStartOfCurrentWeek().AddDays(&lt;span style="color: #800080;"&gt;6&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( dt.Year, dt.Month, dt.Day, &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Months&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfMonth( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Month, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Year )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, Month, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfMonth( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Month, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Year )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, Month, DateTime.DaysInMonth( Year, Month ), &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfLastMonth()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( DateTime.Now.Month == &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfMonth( &lt;span style="color: #800080;"&gt;12&lt;/span&gt;, DateTime.Now.Year - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfMonth( DateTime.Now.Month -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, DateTime.Now.Year );            &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfLastMonth()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( DateTime.Now.Month == &lt;span style="color: #800080;"&gt;1&lt;/span&gt; )&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfMonth( &lt;span style="color: #800080;"&gt;12&lt;/span&gt;, DateTime.Now.Year - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfMonth( DateTime.Now.Month -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, DateTime.Now.Year );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfCurrentMonth()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfMonth( DateTime.Now.Month, DateTime.Now.Year );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfCurrentMonth()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfMonth( DateTime.Now.Month, DateTime.Now.Year );&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Years&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfYear( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Year )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfYear( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Year )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( Year, &lt;span style="color: #800080;"&gt;12&lt;/span&gt;, DateTime.DaysInMonth( Year, &lt;span style="color: #800080;"&gt;12&lt;/span&gt; ), &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfLastYear()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfYear( DateTime.Now.Year - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfLastYear()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfYear( DateTime.Now.Year - &lt;span style="color: #800080;"&gt;1&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfCurrentYear()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetStartOfYear( DateTime.Now.Year );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfCurrentYear()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetEndOfYear( DateTime.Now.Year );&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;        &lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Days&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetStartOfDay( DateTime date )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( date.Year, date.Month, date.Day, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; DateTime GetEndOfDay( DateTime date )&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime( date.Year, date.Month, date.Day, &lt;span style="color: #800080;"&gt;23&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;59&lt;/span&gt;, &lt;span style="color: #800080;"&gt;999&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jaxu/aggbug/2308376.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jaxu/archive/2011/12/31/2308376.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
