﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-tonyqus.cn</title><link>http://www.cnblogs.com/tonyqus/</link><description>NPOI - 一个能帮助你直接读写office文件流的库 (QQ交流群:  78142590)</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 03:13:36 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 03:13:36 GMT</pubDate><ttl>60</ttl><item><title>.NET文件格式相关开源项目</title><link>http://www.cnblogs.com/tonyqus/archive/2010/01/03/1637721.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Sun, 03 Jan 2010 01:18:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2010/01/03/1637721.html</guid><description><![CDATA[<p>阅读: 2670 评论: 21 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2010-01-03 09:18 <a href="http://www.cnblogs.com/tonyqus/archive/2010/01/03/1637721.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>
<p>&nbsp;</p>
<p>在过去的一年里，我已确定把文件格式作为我的主要研究课题之一，NPOI就是在这样的研究课题下的产物。尽管从严格意义上讲NPOI只是POI的.NET版本，并不是我创造的，但是在开发过程中，我对OLE2有了深入的理解和认识，也对Office 97-2003的文件格式有了截然不同的认识。如果在过去，有人问我：你知道Office文件格式吗？作为开发人员的我会毫不犹豫的说：我当然知道！但如今，我会说：我只知道一部分。有句话说得好：学得越多越觉得自己无知。</p>
<p>很多研究生为毕业时写篇合格的论文而发愁，觉得3年压根没学到啥东西，充其量就是跟着导师做点能赚外快的项目，其实他们并没有意识到，很多研究课题就在他们眼前，只是他们并不懂得去挖掘而已，所以有人说：搞研究的人没事要钻钻牛角尖，要懂得&#8220;斤斤计较&#8221;，你觉得啥都&#8220;顺眼&#8221;，还研究个啥。文件格式之所以有研究价值是因为它可能涉及到很多算法、压缩、编码学方面的知识，另外它也能帮你理解前人的思路&#8212;&#8212;为什么要用这种算法，而不用另外一种算法；为什么要用这种结构而不是另一种。</p>
<p>&nbsp;</p>
<p>好了，开场白差不多了，呵呵。开始进入正题，希望以下内容对大家有帮助，特别是打算研究文件格式的朋友。</p>
<p>&nbsp;</p>
<p><strong>NPOI</strong></p>
<p>语言: C#</p>
<p>官方网站: <a href="http://npoi.codeplex.com/" target="_blank">http://npoi.codeplex.com/</a> </p>
<p>描述: NPOI是POI的.NET移植版本，目前稳定版本中仅支持对xls文件（Excel 97-2003）文件格式的读写。目前的NPOI版本主要是基于POI 3.2的，目前正在将部分POI 3.5的bug修整放入新版本中。</p>
<p>相关文件格式: xls, OLE2格式</p>
<p>工具：POIFS Browser</p>
<p>代码协议： Apache 2.0</p>
<p>&nbsp;</p>
<p><strong>Office Binary Translator to Open XML </strong></p>
<p>语言： c#</p>
<p>官方网站: <a href="http://b2xtranslator.sourceforge.net/" target="_blank">http://b2xtranslator.sourceforge.net/</a></p>
<p>描述: 这个项目的主要目的是把Office 97-2003的文件格式转换成Open XML格式，为其他软件提供参考。</p>
<p>相关工具: BiffView++ (下载<a href="http://b2xtranslator.sourceforge.net/snapshots/BiffView.zip" target="_blank">zip</a>文件)</p>
<p>相关文件格式：doc/docx, ppt/pptx, xls/xlsx</p>
<p>代码协议：BSD</p>
<p>&nbsp;</p>
<p><strong>Open XML Format SDK</strong></p>
<p>官方网站：<a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;DisplayLang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;DisplayLang=en" target="_blank">http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;DisplayLang=en</a></p>
<p>描述：微软官方提供的Open XML读写库，目前最新版是2.0 CTP版本。</p>
<p>相关文件格式：Open XML Formats (docx, xlsx, pptx等)</p>
<p>&nbsp;</p>
<p><strong>ZeraldotNet</strong></p>
<p>语言： c#</p>
<p>官方网站: <a href="http://www.codeplex.com/ZeraldotNet" target="_blank">http://www.codeplex.com/ZeraldotNet</a></p>
<p>描述: Zeral .Net类库实现了BitTorrent协议、eMule协议、Overnet协议和Gnutella协议。</p>
<p>相关文件格式： .torrent</p>
<p>代码协议：Ms-CL v1.1</p>
<p>&nbsp;</p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong>NAudio</strong></p>
<p>语言: C#</p>
<p>官方网站: <a href="http://www.codeplex.com/naudio" target="_blank">http://www.codeplex.com/naudio</a></p>
<p>描述: NAudio是一套实用的音频类库，目的是加快.NET上音频相关工具的开发。它诞生于2001年，现在已经有了很多功能。</p>
<p>相关文件格式: MP3, OGG, SFZ, MIDI, SoundFont, WAV</p>
<p>代码协议：Ms-PL</p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong></strong>&nbsp;</p>
<p><strong>DotNetZip</strong></p>
<p>语言: C#</p>
<p>官方网站: <a href="http://www.codeplex.com/DotNetZip" target="_blank">http://www.codeplex.com/DotNetZip</a></p>
<p>描述: DotNetZip是一个小巧、使用简便的zip类库。用VB.NET及C#写的应用程序都能简单方便的创建、阅读和更新zip文件。</p>
<p>相关文件格式: zip</p>
<p>代码协议：Ms-PL</p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong></strong>&nbsp;</p>
<p><strong>7zSharp</strong></p>
<p>语言: C#</p>
<p>官方网站: <a href="http://www.codeplex.com/7zsharp" target="_blank">http://www.codeplex.com/7zsharp</a></p>
<p>描述: 7zSharp是基于.NET 2.0的7z LZMA二次开发包，提供了一套便捷的API用于解密和加密7z文件。</p>
<p>相关文件格式: 7z (.7z), ZIP (.zip), GZIP (.gz), BZIP2 (.bz2) and TAR (.tar), RAR (.rar), CAB (.cab), ISO (.iso), ARJ (.arj), LZH (.lzh), CHM (.chm), Z (.Z), CPIO (.cpio), RPM (.rpm), DEB (.deb), NSIS (.nsis)</p>
<p>代码协议：LGPL 2.1</p>
<p>&nbsp;</p>
<p><strong></strong></p>
<p><strong>iTextSharp</strong></p>
<p>语言: C#</p>
<p>官方网站: <a href="http://sourceforge.net/projects/itextsharp/" target="_blank">http://sourceforge.net/projects/itextsharp/</a></p>
<p>描述: iText# (iTextSharp)是iText Java开源库的C#移植版本，它可以让你从头开始生成PDF。</p>
<p>相关文件格式: PDF, rtf, bmp, gif, png,tiff, jpeg</p>
<p>相关技术: OpenPGP, OpenSSL, TSP(时间戳协议), x509, ocsp, BigInterger, BCPG</p>
<p><strong></strong></p>
<p><strong></strong>&nbsp;</p>
<p><strong>GifLib</strong></p>
<p>语言: C#</p>
<p>官方网站: <a href="http://www.codeplex.com/GifLib" target="_blank">http://www.codeplex.com/GifLib</a>或<a href="http://www.cndotnet.org/GifLib" target="_blank">http://www.cndotnet.org/GifLib</a></p>
<p>描述: GifLib能够无损读写Gif格式 </p>
<p>相关文件格式: gif</p>
<p>相关技术: LZW压缩</p>
<p>代码协议：BSD</p>
<p>&nbsp;</p>
<p><strong>.NET DiscUtil</strong></p>
<p>语言：C#</p>
<p>官方网站：<a href="http://discutils.codeplex.com/" target="_blank">http://discutils.codeplex.com/</a> </p>
<p>相关文件格式：ISO, FAT, NTFS, VHD, XVA, VMDK和VDI</p>
<p>描述：可读写ISO文件和虚拟机磁盘文件格式（VHD, VDI, XVA, VMDK等）的库，完全用C#实现，没有P-Invoke。</p>
<p>代码协议：MIT</p>
<p>&nbsp;</p>
<p><strong>UOF and OOXML translator</strong></p>
<p>官方网站：<a href="http://uof-translator.sourceforge.net/" target="_blank">http://uof-translator.sourceforge.net/</a> </p>
<p>相关文件格式：UOF, Open XML Formats</p>
<p>描述：这是微软公司、北京大学、LiSoft、清华大学、北京科技大学共同开发的开源项目，目的是实现UOF和OOXML的双向转换。目前最新版本是2.0，貌似正在开发2.1版本。</p>
<p>&nbsp;</p>
<p><strong>JPEG Data</strong></p>
<p>环境：.NET 3.5 sp1</p>
<p>官方网站：<a title="http://jpegdata.codeplex.com/" href="http://jpegdata.codeplex.com/" target="_blank">http://jpegdata.codeplex.com/</a></p>
<p>相关文件格式：jpeg</p>
<p>描述：从jpeg中获得需要的数据</p>
<p>代码协议：Ms-PL</p>
<p>&nbsp;</p>
<p><strong>Mp4 Explorer</strong></p>
<p>官方网站：<a title="http://mp4explorer.codeplex.com/" href="http://mp4explorer.codeplex.com/" target="_blank">http://mp4explorer.codeplex.com/</a></p>
<p>相关文件格式：mp4格式</p>
<p>描述：可用于从MPEG-4 iso文件（(ISO/IEC 14496-12, ISO/IEC 14496-14, ISO/IEC 14496-15)）中读取各种信息，如mp4头，元数据和其他数据</p>
<p>代码协议：Ms-PL</p>
<p>&nbsp;</p>
<p>大家如果还知道其他的.NET文件格式项目可以写在回复中，我会及时更新。</p><img src="http://www.cnblogs.com/tonyqus/aggbug/1637721.html?type=1" width="1" height="1" alt=""/><p>评论: 21　<a href="http://www.cnblogs.com/tonyqus/archive/2010/01/03/1637721.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2010/01/03/1637721.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>体验微软Pivot浏览器——UX新体验</title><link>http://www.cnblogs.com/tonyqus/archive/2009/12/26/1632517.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Fri, 25 Dec 2009 23:14:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/12/26/1632517.html</guid><description><![CDATA[<p>阅读: 2739 评论: 23 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-12-26 07:14 <a href="http://www.cnblogs.com/tonyqus/archive/2009/12/26/1632517.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>  <p>&#160;</p>  <p>今天收到了Pivot浏览器的邀请函，心里一阵暗喜，迫不及待地安装了Pivot CTP版。据说Pivot是用WPF做的，用Snoop扫了下，2D模式可以，可惜每次切换到3D模式Pivot都会抛异常，不知道为啥。</p>  <p>由于最近在使用IE8过程中，经常发生网站不兼容、浏览器窗口黑屏（相当频繁），再加上在做兼容性项目中发现众多的IE8 Bug，更生厌恶之情！所以决定试一下这个ie家族的&#8220;私生子&#8221;。</p>  <p>&#160;</p>  <p>进入Pivot的第一感觉就是界面很清爽，有点苹果Mac OS的感觉，个人十分喜欢。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_38.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb.png" width="640" height="375" /></a> </p>  <p>&#160;</p>  <p>从前的页面选项卡跑最底下去了，就是下面这张图，点击图示的小按钮，你就会看到你正在浏览的页面的缩略图。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_1.png" width="242" height="111" /></a>&#160;</p>  <p>是不是看着有点像google toolbar的homepage。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_2.png" width="639" height="482" /></a> </p>  <p>接下来是Pivot比较有卖点的功能——History</p>  <p>我们来做个对比，左侧是IE8的History，右侧是Pivot的History，是不是有点Windows和Mac OS对比的味道，呵呵。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_22.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_10.png" width="259" height="482" /></a>&#160; <a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_20.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_9.png" width="642" height="448" /></a> </p>  <p>接下来是更炫的动画效果，左侧勾选checkbox将触发右侧的动画效果，我特地截了好几次才得到以下图形序列</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_16.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_7.png" width="83" height="242" /></a> <a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_18.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_8.png" width="84" height="242" /></a>&#160;<a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_14.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_6.png" width="89" height="242" /></a> <a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_24.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_11.png" width="76" height="242" /></a> </p>  <p>当然图形毕竟还是图形，要想知道这个界面到底有多酷，建议你自己装一下pivot。</p>  <p>另外在地址栏左侧有一个&#8220;胶卷&#8221;按钮，点了之后同样也可以看到每个History记录的缩略图，有点类似Windows7的taskbar。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_26.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_12.png" width="642" height="176" /></a></p>  <p>话说，添加Favorite页面也比较炫，尽然有动画效果——那个小星星会从右边飞到左边。</p>  <p>&#160;</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_28.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_13.png" width="642" height="53" /></a> </p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_30.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_14.png" width="642" height="51" /></a> </p>  <p>你试过把垂直滚动条向左拖吗？呵呵，Pivot会告诉你将发生什么，如下：</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_36.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_17.png" width="242" height="159" /></a> <a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_34.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_16.png" width="203" height="242" /></a> <a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_32.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/Pivot_5FC4/image_thumb_15.png" width="204" height="242" /></a> </p>  <p>其实这里Pivot提供的是全局预览功能，当网页内容很多很长时，可以用它来找到你最需要的区域。</p>  <p>&#160;</p>  <p>先写到这，其他的大家自己体验吧~地址：<a title="http://www.getpivot.com/" href="http://www.getpivot.com/">http://www.getpivot.com/</a></p> <img src="http://www.cnblogs.com/tonyqus/aggbug/1632517.html?type=1" width="1" height="1" alt=""/><p>评论: 23　<a href="http://www.cnblogs.com/tonyqus/archive/2009/12/26/1632517.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/12/26/1632517.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>NPOI实践: .NET导入Excel文件的另一种选择</title><link>http://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Fri, 25 Dec 2009 08:50:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html</guid><description><![CDATA[<p>阅读: 2179 评论: 15 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-12-25 16:50 <a href="http://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>  <p>官方网站：<a target="_blank" href="http://npoi.codeplex.com/">http://npoi.codeplex.com</a> | NPOI QQ交流群:&nbsp; 78142590 </p>  <p>&nbsp;</p>  <p>NPOI之所以强大，并不是因为它支持导出Excel，而是因为它支持导入Excel，并能&#8220;理解&#8221;OLE2文档结构，这也是其他一些Excel读写库比较弱的方面。通常，读入并理解结构远比导出来得复杂，因为导入你必须假设一切情况都是可能的，而生成你只要保证满足你自己需求就可以了，如果把导入需求和生成需求比做两个集合，那么生成需求通常都是导入需求的子集，这一规律不仅体现在Excel读写库中，也体现在pdf读写库中，目前市面上大部分的pdf库仅支持生成，不支持导入。</p>  <p>如果你不相信NPOI能够很好的理解OLE2文档格式，那就去下载<a href="http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409" target="_blank">POIFS Brower</a>。具体可以参考这篇文章的介绍：<a href="http://www.cnblogs.com/tonyqus/archive/2009/09/15/office_2003_file_format.html" target="_blank">Office文件格式解惑</a>。当然单单理解OLE2是不够的，因为Excel文件格式是BIFF，但BIFF是以OLE2为基础的，做个很形象的比喻就是：OLE2相当于磁盘的FAT格式，BIFF相当于文件和文件夹。NPOI负责理解BIFF格式的代码基本都在HSSF命名空间里面。</p>  <p>好了，刚才废话了一会儿，主要是给大家打打基础，现在进入正题。</p>  <p>&nbsp;</p>  <p>本文将以DataTable为容器读入某xls的第一个工作表的数据（最近群里面很多人问这个问题）。<br /></p>  <p>在开始之前，我们先来补些基础知识。每一个xls都对应一个唯一的HSSFWorkbook，每一个HSSFWorkbook会有若干个HSSFSheet，而每一个HSSFSheet包含若干HSSFRow（Excel 2003中不得超过65535行），每一个HSSFRow又包含若干个HSSFCell（Excel 2003中不得超过256列）。 </p>  <p>为了遍历所有的单元格，我们就得获得某一个HSSFSheet的所有HSSFRow，通常可以用HSSFSheet.GetRowEnumerator()。如果要获得某一特定行，可以直接用HSSFSheet.GetRow(rowIndex)。另外要遍历我们就必须知道边界，有一些属性我们是可以用的，比如HSSFSheet.FirstRowNum（工作表中第一个有数据行的行号）、HSSFSheet.LastRowNum（工作表中最后一个有数据行的行号）、HSSFRow.FirstCellNum（一行中第一个有数据列的列号）、HSSFRow.LastCellNum（一行中最后一个有数据列的列号）。</p>  <p>基础知识基本上补得差不多了，现在开工！</p>  <p>&nbsp;</p>  <p>首先我们要准备一个用于打开文件流的函数InitializeWorkbook，由于文件读完后就没用了，所以这里直接用using（养成好习惯，呵呵）。</p>  <div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">   <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><p>HSSFWorkbook hssfworkbook;</p><p><span style="color: #0000ff;">void</span> InitializeWorkbook(<span style="color: #0000ff;">string</span> path)<br />{<br />    <span style="color: #008000;">//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.</span>
    <span style="color: #008000;">//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added. </span>
    <span style="color: #0000ff;">using</span> (FileStream file = <span style="color: #0000ff;">new</span> FileStream(path, FileMode.Open, FileAccess.Read))<br />    {<br />        hssfworkbook = <span style="color: #0000ff;">new</span> HSSFWorkbook(file);<br />    }<br />}</p></pre>
</div>

<p>接下来我们要开始写最重要的函数ConvertToDataTable，即把HSSF的数据放到一个DataTable中。</p>

<p>&nbsp;</p>

<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
  <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">HSSFSheet sheet = hssfworkbook.GetSheetAt(0);<br />System.Collections.IEnumerator rows = sheet.GetRowEnumerator();<br /><br /><span style="color: #0000ff;">while</span> (rows.MoveNext())<br />{<br />    HSSFRow row = (HSSFRow)rows.Current;<br />    <span style="color: #008000;">//TODO::Create DataTable row</span>

    <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt; row.LastCellNum; i++)<br />    {<br />        HSSFCell cell = row.GetCell(i);<br />        <span style="color: #008000;">//TODO::set cell value to the cell of DataTables</span>
    }</pre>
</div>

<p>上面的结构大家都应该能看懂吧，无非就是先遍历行，再遍历行中的每一列。这里引出了一个难点，由于Excel的单元格有好几种类型，类型不同显示的东西就不同，具体的类型有 布尔型、数值型、文本型、公式型、空白、错误。</p>

<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
  <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">enum</span> HSSFCellType<br />{<br />    Unknown = -1,<br />    NUMERIC = 0,<br />    STRING = 1,<br />    FORMULA = 2,<br />    BLANK = 3,<br />    BOOLEAN = 4,<br />    ERROR = 5,<br />}</pre>
</div>

<p>&nbsp;</p>

<p>这里的HSSFCellType描述了所有的类型，但细心的朋友可能已经发现了，这里没有日期型，这是为什么呢？这是因为Excel底层并没有一定日期型，而是通过数值型来替代，至于如何区分日期和数字，都是由文本显示的样式决定的，在NPOI中则是由HSSFDataFormat来处理。为了能够方便的获得所需要的类型所对应的文本，我们可以使用HSSFCell.ToString()来处理。</p>

<p>于是刚才的代码则变成了这样：</p>

<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
  <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">HSSFSheet sheet = hssfworkbook.GetSheetAt(0);<br />System.Collections.IEnumerator rows = sheet.GetRowEnumerator();<br /><br />DataTable dt = <span style="color: #0000ff;">new</span> DataTable();<br /><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> j = 0; j &lt; 5; j++)<br />{<br />    dt.Columns.Add(Convert.ToChar(((<span style="color: #0000ff;">int</span>)<span style="color: #006080;">'A'</span>)+j).ToString());<br />}<br /><br /><span style="color: #0000ff;">while</span> (rows.MoveNext())<br />{<br />    HSSFRow row = (HSSFRow)rows.Current;<br />    DataRow dr = dt.NewRow();<br /><br />    <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt; row.LastCellNum; i++)<br />    {<br />        HSSFCell cell = row.GetCell(i);<br /><br />        <span style="color: #0000ff;">if</span> (cell == <span style="color: #0000ff;">null</span>)<br />        {<br />            dr[i] = <span style="color: #0000ff;">null</span>;<br />        }<br />        <span style="color: #0000ff;">else</span>
        {
            dr[i] = cell.ToString();
        }
    }
    dt.Rows.Add(dr);
}</pre>
</div>

<p>是不是很简单，呵呵！</p>

<p>当然，如果你要对某个特定的单元格类型做特殊处理，可以通过判HSSFCell.CellType来解决，比如下面的代码：</p>

<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
  <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">        <span style="color: #0000ff;">switch</span>(cell.CellType)<br />        {<br />            <span style="color: #0000ff;">case</span> HSSFCellType.BLANK:<br />                dr[i] = <span style="color: #006080;">"[null]"</span>;<br />                <span style="color: #0000ff;">break</span>;<br />            <span style="color: #0000ff;">case</span> HSSFCellType.BOOLEAN:<br />                dr[i] = cell.BooleanCellValue;<br />                <span style="color: #0000ff;">break</span>;<br />            <span style="color: #0000ff;">case</span> HSSFCellType.NUMERIC:<br />                dr[i] = cell.ToString();    <span style="color: #008000;">//This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number.</span>
                <span style="color: #0000ff;">break</span>;<br />            <span style="color: #0000ff;">case</span> HSSFCellType.STRING:<br />                dr[i] = cell.StringCellValue;<br />                <span style="color: #0000ff;">break</span>;<br />            <span style="color: #0000ff;">case</span> HSSFCellType.ERROR:<br />                dr[i] = cell.ErrorCellValue;<br />                <span style="color: #0000ff;">break</span>;<br />            <span style="color: #0000ff;">case</span> HSSFCellType.FORMULA:<br />            <span style="color: #0000ff;">default</span>:<br />                dr[i] = <span style="color: #006080;">"="</span>+cell.CellFormula;<br />                <span style="color: #0000ff;">break</span>;<br />        }</pre>
</div>

<p>这里只是举个简单的例子。</p>

<p>&nbsp;</p>

<p>完整代码下载：<a target="_blank" title="http://files.cnblogs.com/tonyqus/ImportXlsToDataTable.zip" href="http://files.cnblogs.com/tonyqus/ImportXlsToDataTable.zip">http://files.cnblogs.com/tonyqus/ImportXlsToDataTable.zip</a></p>

<p>注意，此代码中不包括NPOI的assembly，否则文件会很大，所以建议去npoi.codeplex.com下载。</p> <img src="http://www.cnblogs.com/tonyqus/aggbug/1631075.html?type=1" width="1" height="1" alt=""/><p>评论: 15　<a href="http://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>一个IE8 Bug的解决方法以及一些思考</title><link>http://www.cnblogs.com/tonyqus/archive/2009/10/26/1589664.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Sun, 25 Oct 2009 23:42:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/10/26/1589664.html</guid><description><![CDATA[<p>阅读: 1738 评论: 5 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-10-26 07:42 <a href="http://www.cnblogs.com/tonyqus/archive/2009/10/26/1589664.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>
<p>&nbsp;</p>
<p><strong>Bug重现</strong></p>
<p>这里我引用了我同事<a href="http://www.cnblogs.com/wangqi/" target="_blank">流星陨落</a>的例子。</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;!</span><span style="color: #800000">DOCTYPE</span> <span style="color: #ff0000">HTML</span> <span style="color: #ff0000">PUBLIC</span> <span style="color: #0000ff">"-//W3C//DTD HTML 4.01//EN"</span> <span style="color: #0000ff">"http://www.w3.org/TR/html4/strict.dtd"</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">style</span><span style="color: #0000ff">&gt;</span>
.table1
{
    border-collapse:collapse;
}
 .table1 th {
  -ms-filter:"progid:DXImageTransform.Microsoft.gradient(enabled='true',startColorstr=white, endColorstr=gray)";
   border:1px solid red;
 }
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">style</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">table</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">="table1"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>Give me a border<span style="color: #0000ff">&lt;/</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>Give me a border<span style="color: #0000ff">&lt;/</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></pre></div>
<p>重现环境：IE8, Browser Mode: IE8, Document Mode: IE8 Standard</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/IE8Bug_5AAB/image_8.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/IE8Bug_5AAB/image_thumb_3.png" width="311" height="37" /></a> </p>
<p>正确的效果：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/IE8Bug_5AAB/image_6.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/IE8Bug_5AAB/image_thumb_2.png" width="314" height="49" /></a> </p>
<p>问题描述：</p>
<p>a.上面、左边和单元格中间的边框不应该看不见。</p>
<p>b. 这个问题与border-collapse属性没有关系，即使去掉border-collapse，也是没有边框的。</p>
<p>&nbsp;</p>
<p><strong>解决方案</strong></p>
<p>我看了我同事发的帖子，<a title="http://space.cnblogs.com/question/9322/" href="http://space.cnblogs.com/question/9322/" target="_blank">http://space.cnblogs.com/question/9322/</a>，<a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a>同学给出了他的回复，在此表示感谢。不过position:absolute似乎并不是一个很好的解决方案，至少对于我们公司的系统是这样的，因为我们公司的table会有最多300列，如果每一列都要给一个新样式，那就有些小题大做了。更何况我们的列要支持宽度可变、拖放等功能，所以这种方法并不推荐。</p>
<p>但邀月的方法给了我点启发，既然position不行，float也许能行，于是早上拿float:left试了一把，居然可以，修正代码如下：</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;!</span><span style="color: #800000">DOCTYPE</span> <span style="color: #ff0000">HTML</span> <span style="color: #ff0000">PUBLIC</span> <span style="color: #0000ff">"-//W3C//DTD HTML 4.01//EN"</span> <span style="color: #0000ff">"http://www.w3.org/TR/html4/strict.dtd"</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">style</span><span style="color: #0000ff">&gt;</span>
.table1
{
    border-collapse:collapse;
}
 .table1 th {
  -ms-filter:"progid:DXImageTransform.Microsoft.gradient(enabled='true',startColorstr=white, endColorstr=gray)";
  border-left:1px solid red;
  border-top:1px solid red;
  border-bottom:1px solid red;
  border-right:none;
  float:left;
 }
 .table1 th.last
 {
     border-right:1px solid red;
 }
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">style</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">table</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">="table1"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>Give me a border<span style="color: #0000ff">&lt;/</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">th</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">="last"</span><span style="color: #0000ff">&gt;</span>Give me a border<span style="color: #0000ff">&lt;/</span><span style="color: #800000">th</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></pre></div>
<p>说明：</p>
<p>a. 这里我之所以加上th.last样式，是因为这时的border失去了border-collapse的功能，所以位于单元格之间的border会产生2px的粗线，这样会很难看，QA也不会放过这样明显的bug。所以觉得采用border-right:none，然后在最后一个单元格补上一个border-right:1px solid red。当然这样做的代价是对于所有table的TH我都必须去遍历到最后一个元素，然后把那个元素加上last样式。</p>
<p>b. 有人也许会问，你为啥不用th:last-child，其实我一开始是想用这个，结果所有的IE均不支持这个属性，无奈放弃。</p>
<p>c. 也有人提出了另外一种解决方法，即用background-image，没错，background-image确实可以解决这个问题，但很遗憾，我们公司的产品要求允许客户使用任意2种颜色换肤，如果采用生成图片的方案，将会产生大量的图片，更何况，我们有些table的header高度是随机的，到底该生成多高的渐变色又是一个令人头疼的问题。</p>
<p>注：如果你有更好的方法，请告诉我，最好连float都不用，呵呵，先谢了</p>
<p><strong>我的一些看法</strong></p>
<p>很多时候，微软产品会出现很多很诡异的现象，比如说蓝屏，但是蓝屏的case在大多数情况下是由于第三方的驱动引起的，所以我们不该怪微软，只能说她的驱动架构还无法很好的限制第三方驱动程序开发人员的行为。</p>
<p>但IE8的这个bug我觉得有些太容易重现了，而且我在网上也看到了Beta RC1时就有人发了询问帖（<a title="http://www.eggheadcafe.com/software/aspnet/34097060/ie8-rc1-bug-th-loses-bor.aspx" href="http://www.eggheadcafe.com/software/aspnet/34097060/ie8-rc1-bug-th-loses-bor.aspx" target="_blank">http://www.eggheadcafe.com/software/aspnet/34097060/ie8-rc1-bug-th-loses-bor.aspx</a>），可偏偏微软的SDET没有发现，或者是SDE嫌烦不愿意修，不管哪一种原因，作为一个市场占有率极高的产品，这种bug实在有些说不过去。如果微软的同仁看到这篇帖子，麻烦转给相关人员，最好能够直接forward给IE team的SDE Lead，希望这个bug能够在sp1中修复。</p>
<p>在IE8发布之前，IE8的主管曾经声称IE8不完全支持W3C标准，我当时以为只是少量的问题、少量的不支持，但从这个bug来看，这句话看来很有内涵，这其中也包括了很多没有修复的bug所导致的&#8220;不标准&#8221;情况。前段时间也看了Gerard Talbot整理的<a href="http://www.gtalbot.org/BrowserBugsSection/MSIE8Bugs/" target="_blank">IE8 Bug列表</a>，看完这列表，恐怕你对IE8会有另外一种想法&#8212;&#8212;全力抵制。回头看微软ie8的发布，也许是怕被Firefox赶上，提前发布了IE8，结果导致了一堆没有修复的bug也随之延后到sp1才能修复，当然这只是我的猜测，真正的原因只有IE team知道。</p>
<p>&nbsp;</p>
<p>最后提一下IE8最让人失望的东西：</p>
<p>a. 放弃对canvas的支持，要求ie team提供支持的投票人数 70人</p>
<p><a title="https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=334060" href="https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=334060" target="_blank">https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=334060</a></p>
<p>b. 放弃对VML的支持，要求ie team提供支持的投票人数投票人数23人</p>
<p><a title="https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333905" href="https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333905" target="_blank">https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333905</a></p>
<p>c. 放弃对SVG的支持，要求ie team提供支持的投票人数投票人数27人</p>
<p><a title="https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333795" href="https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333795" target="_blank">https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333795</a></p>
<p>这也就意味着，IE8没有提供任何可以在浏览器中画矢量图的东西，结果微软说你可以考虑用Silverlight，哎，拿这种回答来回避其浏览器的不足，实在让人无语。客户买我的产品，我还得要求客户安装Silverlight插件，那如果他没有装或者没法装咋办？难道我和客户说那我们也没有办法，要不你换其他公司的产品？老板不杀了我才怪！</p>  <img src="http://www.cnblogs.com/tonyqus/aggbug/1589664.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/tonyqus/archive/2009/10/26/1589664.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/10/26/1589664.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Office2003文件格式解惑</title><link>http://www.cnblogs.com/tonyqus/archive/2009/09/15/office_2003_file_format.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Tue, 15 Sep 2009 13:02:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/09/15/office_2003_file_format.html</guid><description><![CDATA[<p>阅读: 2197 评论: 15 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-09-15 21:02 <a href="http://www.cnblogs.com/tonyqus/archive/2009/09/15/office_2003_file_format.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>  <p>&#160;</p>  <p>很多人会有这样的疑问，为什么新建任何一个Office文件格式初始大小永远是几k，而不是0k，既然是空的，为什么会占用空间？当初我也有这种疑问，但在研究了OLE2文档格式之后，这些疑问全部得以解开。简单的说，Office文件就是OLE2文档的一种，由于这种文档中有一些附属信息和初始结构，所以初始就是有大小的。</p>  <p>本文中即将提到的POIFS Browser可以到<a title="http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409" href="http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409">http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409</a>下载，它是基于<a href="http://npoi.codeplex.com/" target="_blank">NPOI项目</a>的一个工具，专门用于分析OLE2文件格式。</p>  <p><strong>什么是OLE2文档</strong></p>  <p>OLE2文档，又叫ActiveX文档或Windows Compound File，它是一种广泛用于Windows平台上的格式，除了微软自己以外，很多第三方厂商也使用这种格式存放数据。虽然平时我们没有看到过.ole的文件格式，但确实有很多文件使用这种格式作为一种标准，只不过它的扩展名是.xls, .doc, .db等。一个更加常见的例子就是thumbs.db，几乎你可以在任何目录中看到这个隐藏文件，这个文件正如其名字所暗示的，就是用来存储缩略图的，其内部存了好多bmp或者jpg缩略文件，利用OLE2的灵活文件结构，它把每一个缩略图保存为一个记录，就像一个小型文件夹，如下图所示：</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_3.png" width="125" height="249" /></a> </p>  <p>用POIFS Browser打开后thumbs.db，可以看到里面有4个缩略图，外加一个索引（catalog的作用纯属猜测，未经验证）。</p>  <p>看到这，你是不是觉得OLE2更像文件系统，确实，Windows Compound File的spec来看，这种文件格式的设计很像FAT格式。毕竟微软是做操作系统的，这方面可是微软的强项，所以那些鼓吹微软文件格式过于复杂的人，更多的是看到了表象，这也从侧面反应出了这些人的无知。</p>  <p><strong>为什么.xls文件格式的初始化大小是11K</strong></p>  <p>现在让我们来解开本文最初的那个疑问，之所以不是0k，是因为Office2003文件格式内部有两个默认的文档头，分别是DocumentSummaryInformation（简称DSI）和SummaryInformation（简称SI），这两个文档头中分别存储了作者（AUTHOR）、创建它的应用程序名(APPNAME)、编码页号（CODEPAGE）等信息，之所以平时我们很少关注这些信息，是因为我们很少需要这些信息，但这些信息对于文件版本管理、数据挖掘等还是很有帮助的，这也是为什么很多搜索引擎提供一些第三方文件解析器（包括OLE2文件解析器）。另外，一个默认的Excel文件通常会有三个sheet，而这三个sheet也是要占空间的，而且通常情况下里面有不少子记录。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_12.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_5.png" width="368" height="475" /></a> </p>  <p>上图，是按鼠标右键-&gt;属性，弹出的窗口，其中的详细信息有一部分就是来源于DSI和SI的，本文件的属性有作者、最后一次修改作者、公司、程序名称、最后一次保存日期等。</p>  <p><strong>不同Office文件格式的区别</strong></p>  <p>这一节，我们来分析一下不同的Office文件格式的区别，尽管使用了同样的文件结构，但是里面的内容还是很不同的。这里大家可以借助POIFS Browser来直观的了解这些文件格式，有好工具要学会利用。</p>  <p>Word文件格式 (.doc)</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_20.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_9.png" width="374" height="243" /></a> </p>  <p>Word文件的内部记录比较多，有1Table（有时是0Table）、Data、WordDocument，其中WordDocument是最主要的数据记录，内部还有很多小型数据结构。CompObj是用来存储Office版本信息的，即用什么版本的Office来写的，具体数据如下：</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_30.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_14.png" width="494" height="185" /></a> </p>  <p>虽然我们看不到其中的一些二进制数据，但基本的ASCII明文信息表明了这个结构的记录。</p>  <p>Excel文件格式 (.xls)</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_18.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_8.png" width="359" height="229" /></a> </p>  <p>由于POIFS Browser能够识别Workbook记录，所以这里是用文件夹图标表示的，你可以展开它。Excel文件格式在没有VBA宏和嵌入对象的情况下是很简单的，只有Workbook和CompObj两个记录，CompObj的作用和Word文件中的是一样的，这里的Workbook存储了所有的Excel BIFF数据，内部有很多BIFF小型记录。</p>  <p>PowerPoint文件格式 (.ppt)</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_24.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_11.png" width="380" height="242" /></a> </p>  <p>Viso文件格式 (.vsd)</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_28.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/db7ce633df9b_6F17/image_thumb_13.png" width="378" height="201" /></a></p>  <p>&#160;</p>  <p>请注意，以上这些文件包括的内容是最基本的，没有包括权限（Right Management）、VBA宏、加密等信息，所以其内部的记录只有4-5个，否则可能包括一大堆内部记录。这里限于篇幅，就不一一展开了。</p>  <p>   <br />附言    <br />如果你有兴趣参加NPOI项目开发，为中国的开源事业做一份贡献，请与我取得联系。&#160; <br /></p>  <p>参考</p>  <p>a. Apache POI project - <a title="http://poi.apache.org/" href="http://poi.apache.org/">http://poi.apache.org/</a></p>  <p>b. Excel Binary File Format (.xls) Structure Specification</p> <img src="http://www.cnblogs.com/tonyqus/aggbug/1567271.html?type=1" width="1" height="1" alt=""/><p>评论: 15　<a href="http://www.cnblogs.com/tonyqus/archive/2009/09/15/office_2003_file_format.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/09/15/office_2003_file_format.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Web页中页脚（Footer）贴底实现（兼容IE6/7/8, FF3）</title><link>http://www.cnblogs.com/tonyqus/archive/2009/08/15/adaptive_footer.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Sat, 15 Aug 2009 14:59:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/08/15/adaptive_footer.html</guid><description><![CDATA[<p>阅读: 2539 评论: 10 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-08-15 22:59 <a href="http://www.cnblogs.com/tonyqus/archive/2009/08/15/adaptive_footer.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>
<p>最近有个需求，要求让页脚贴底，一开始采用了绝对位置的footer方案（设置footer的top），虽然可以应付大部分情况，但有的时候由于页面不规范，会导致计算出来的高度值太小，导致底部上浮；有的时候甚至会叠在页面内容之上。我们原本在onmouseup, onresize, onload中进行计算，但由于系统的庞大，往往会有一些层的onmouseup事件无法传上来（可能是调用了stoppropagation或cancelBubble的关系），有很多未知的情况发生。</p>
<p>回过头来说说这个需求的具体要求：</p>
<p>a. 当可见内容的总高度（不包括页脚）不超过浏览器客户区域实际高度时，页脚要贴在浏览器底部，但不能有滚动条</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/POIFSBrowserOLE2_7055/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/POIFSBrowserOLE2_7055/image_thumb.png" width="400" height="300" /></a> </p>
<p>（图中红色为屏幕显示区域）</p>
<p>b. 当可见内容的总高度超过浏览器客户区域实际高度时，页脚随内容向下</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/POIFSBrowserOLE2_7055/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/POIFSBrowserOLE2_7055/image_thumb_1.png" width="404" height="409" /></a> </p>
<p>（图中红色为屏幕显示区域）</p>
<p>&nbsp;</p>
<p>其实是个人第一点想到的就是想办法计算除去footer高度的内容总高度，问题是总高度怎么算？什么时候算？这确实是一个值得思考的问题。</p>
<p>&nbsp;</p>
<p>总高度的计算看上去是个很简单的问题，但实际情况真的是如此吗？如果我们自己用遍历DOM的方法来计算高度，恐怕很难得出一个准确的高度，因为并不是所有的元素都要纳入高度计算的（例如加了float的元素、position为absolute的元素）。于是想到了请浏览器帮忙，尽量用html DOM原生属性来解决，这时想到了document或者window的属性。在IE中，我们找到了document.documentElement.clientHeight（由于我们使用的DOCTYPE是XHTML 1.0的，document.body.clientHeight不能正常工作）；而在firefox中，我们找到了window.innerHeight。到目前为止，我们已经可以获得整个页面的高度了，那去除footer高度的内容总高度自然而然就可以用下面的公式来获得：</p>
<p>去除footer高度的内容总高度=页面总高度-footer的高度</p>
<p>接下来要做的就是把这个高度赋给Content的容器（假设是一个ID为contentContainer的DIV），请注意这里的Content包括任何除footer以外的东西（包括header）。由于有需求b，我们就得考虑如何让footer在content超过显示高度后不会继续被看见（浮在页面底部），所以肯定不能用top或margin-top，查阅css手册后，发现有一个属性最合适&#8212;&#8212;min-height，这个属性在实际内容不够时，仍然会保持设置的高度，超过设置高度，会自然增加高度，但有一点，IE6不支持min-height，经实验表明，在IE6中可以用height代替。</p>
<p>&nbsp;</p>
<p>所以我们得到了以下的方案：</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">var isIE6=navigator.userAgent.indexOf(<span style="color: #006080">'MSIE 6'</span>)&gt;0;
var isIE=navigator.userAgent.indexOf(<span style="color: #006080">'MSIE'</span>)&gt;0;


ion setFooterPosition()

var objBodycontainer = document.getElementById(<span style="color: #006080">"ContentContainer"</span>);   
var footerHeight=document.getElementById(<span style="color: #006080">'FooterContainer'</span>).offsetHeight;
     
f(!isIE)

   <span style="color: #0000ff">if</span>(window.innerHeight &gt; footerHeight)
       document.getElementById(<span style="color: #006080">'ContentContainer'</span>).style.minHeight =  (window.innerHeight-footerHeight)+<span style="color: #006080">'px'</span>;

lse

       <span style="color: #0000ff">if</span>(isIE6)
       {
           <span style="color: #0000ff">if</span>(document.documentElement.clientHeight &gt; footerHeight)
               document.getElementById(<span style="color: #006080">'ContentContainer'</span>).style.height =  (document.documentElement.clientHeight-footerHeight)+<span style="color: #006080">'px'</span>;
       }
       <span style="color: #0000ff">else</span>
       {    
            <span style="color: #0000ff">if</span>(document.documentElement.clientHeight &gt; footerHeight)
               document.getElementById(<span style="color: #006080">'ContentContainer'</span>).style.minHeight = (document.documentElement.clientHeight-footerHeight)+<span style="color: #006080">'px'</span>;

       }

}</pre></div>
<p>最后就是选择重新进行高度计算的时机，由于我们设置的是min-height（除了IE6），所以从根本上保证了不需要在内容高度改变时重新计算高度，但有一种情况必须考虑，那就是浏览器的客户区域大小的改变，所以最后选择了onresize事件和onload事件。</p>
<p>完整代码如下：</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&lt;!DOCTYPE html PUBLIC <span style="color: #006080">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span style="color: #006080">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span>&gt;
 &lt;html xmlns=<span style="color: #006080">"http://www.w3.org/1999/xhtml"</span>&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;script language=<span style="color: #006080">"JavaScript"</span>&gt;
     var isIE6=navigator.userAgent.indexOf(<span style="color: #006080">'MSIE 6'</span>)&gt;0;
     var isIE=navigator.userAgent.indexOf(<span style="color: #006080">'MSIE'</span>)&gt;0;


function setFooterPosition()
{    
     var objBodycontainer = document.getElementById(<span style="color: #006080">"ContentContainer"</span>);   
     var footerHeight=document.getElementById(<span style="color: #006080">'FooterContainer'</span>).offsetHeight;
          
    <span style="color: #0000ff">if</span>(!isIE)
    {
        <span style="color: #0000ff">if</span>(window.innerHeight &gt; footerHeight)
            document.getElementById(<span style="color: #006080">'ContentContainer'</span>).style.minHeight =  (window.innerHeight-footerHeight)+<span style="color: #006080">'px'</span>;
    }
    <span style="color: #0000ff">else</span>
    {
            <span style="color: #0000ff">if</span>(isIE6)
            {
                <span style="color: #0000ff">if</span>(document.documentElement.clientHeight &gt; footerHeight)
                    document.getElementById(<span style="color: #006080">'ContentContainer'</span>).style.height =  (document.documentElement.clientHeight-footerHeight)+<span style="color: #006080">'px'</span>;
            }
            <span style="color: #0000ff">else</span>
            {    
                                    <span style="color: #0000ff">if</span>(document.documentElement.clientHeight &gt; footerHeight)
                    document.getElementById(<span style="color: #006080">'ContentContainer'</span>).style.minHeight = (document.documentElement.clientHeight-footerHeight)+<span style="color: #006080">'px'</span>;

            }
    }
}
<span style="color: #0000ff">if</span>(isIE)
{
    window.attachEvent(<span style="color: #006080">"onload"</span>,setFooterPosition);
    window.attachEvent(<span style="color: #006080">"onresize"</span>,setFooterPosition);
}<span style="color: #0000ff">else</span>
{
    window.addEventListener(<span style="color: #006080">"load"</span>,setFooterPosition,<span style="color: #0000ff">false</span>);
    window.addEventListener(<span style="color: #006080">"resize"</span>,setFooterPosition,<span style="color: #0000ff">false</span>);
}
&lt;/script&gt;
&lt;style type=<span style="color: #006080">"text/css"</span>&gt;
body
{
margin:0;
}
#content
{
height:300px;
background-color:green;
}
#FooterContainer
{
height:30px;
background-color:red;
}
&lt;/style&gt;
&lt;body&gt;
&lt;div id=<span style="color: #006080">"ContentContainer"</span>&gt;
&lt;div id=<span style="color: #006080">"content"</span>&gt;aa
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=<span style="color: #006080">"FooterContainer"</span>&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></div>
<p>&nbsp;</p>
<p>另外，这种方法有个小漏洞，如果有些层使用了float，可能导致浏览器返回的高度值不准确，所以必须使用<a href="http://www.quirksmode.org/css/clearing.html" target="_blank">clear大法</a>来解决这个问题，告诉浏览器这些float的高度是需要计算的。</p>
<p>&nbsp;</p>
<p>心得：</p>
<p>a. 浏览器的很多自带属性有时比上层代码计算出来的值更加准确，毕竟是浏览器负责调用渲染引擎的，它比谁都了解自己呈现出来的东西</p>
<p>b. 适当调整页面结构（添加容器），能够使问题更容易解决。（原本我们的页面中没有ContentContainer这样的同时包含header和content的容器）</p><img src="http://www.cnblogs.com/tonyqus/aggbug/1546956.html?type=1" width="1" height="1" alt=""/><p>评论: 10　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/15/adaptive_footer.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/15/adaptive_footer.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>NPOI 1.2教程 – 3.1 基于.xls模板生成Excel文件</title><link>http://www.cnblogs.com/tonyqus/archive/2009/08/10/1543242.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Mon, 10 Aug 2009 15:22:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/08/10/1543242.html</guid><description><![CDATA[<p>阅读: 1554 评论: 8 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-08-10 23:22 <a href="http://www.cnblogs.com/tonyqus/archive/2009/08/10/1543242.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>
<p>NPOI官方网站：<a target="_blank" href="http://npoi.codeplex.com/">http://npoi.codeplex.com/</a></p><p>NPOI QQ交流群: 78142590&nbsp;</p><p>&nbsp;</p>
<p>尽管NPOI能够从头开始生成Excel文件，但在实际生产环境中有很多现成的表格，我们不可能没事就去从头开始生成一个Excel，更多时候我们更愿意选择比较偷懒的方法&#8212;&#8212;那就是用模板文件。NPOI一大特色之一就是能够轻松读取Office Excel 97-2003的格式，即使里面有NPOI不支持的VBA宏、图表以及Pivot表之类的高级记录，NPOI也能够保证不丢失数据（说实话，要完全能够识别所有的Excel内部记录几乎是不可能的，更何况如今又多出了Office Excel 2007 binary file，即.xlsb）。</p>
<p>现在我们转入正题，出于演示目的，我做了一个简单的销售量表，里面应用了文字颜色、背景色、文本居中、公式、千分位分隔符、边框等效果，当然实际的生产环境里可能还有更加复杂的Excel模板。如下图</p>
<p><a target="_blank" href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI.xlsExcel_943B/image_2.png"><img style="border: 0px none ; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI.xlsExcel_943B/image_thumb.png" border="0" height="361" width="305" /></a> </p>
<p>我们的程序就是要填充12个月的销售量，Total能够自动根据填充的值计算出总量。</p>
<p>（这里要提一下，以往如果我们用HTML方式输出xls，我们必须在服务器端做Total计算，并且这个值在下载后永远都是静态的，没有公式，即使用户要修改里面的数据，总值也不会改变。这也是为什么NPOI一直提倡生成真正的Excel文件。）</p>
<p>代码其实很简单：</p>
<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;"><pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><p><span style="color: #008000;">//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.</span>
<span style="color: #008000;">//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added. </span>
FileStream file = <span style="color: #0000ff;">new</span> FileStream(<span style="color: #006080;">@"template/book1.xls"</span>, FileMode.Open,FileAccess.Read);<br /><br />HSSFWorkbook hssfworkbook = <span style="color: #0000ff;">new</span> HSSFWorkbook(file);<br />HSSFSheet sheet1 = hssfworkbook.GetSheet(<span style="color: #006080;">"Sheet1"</span>);<br />sheet1.GetRow(1).GetCell(1).SetCellValue(200200);<br />sheet1.GetRow(2).GetCell(1).SetCellValue(300);<br />sheet1.GetRow(3).GetCell(1).SetCellValue(500050);<br />sheet1.GetRow(4).GetCell(1).SetCellValue(8000);<br />sheet1.GetRow(5).GetCell(1).SetCellValue(110);<br />sheet1.GetRow(6).GetCell(1).SetCellValue(100);<br />sheet1.GetRow(7).GetCell(1).SetCellValue(200);<br />sheet1.GetRow(8).GetCell(1).SetCellValue(210);<br />sheet1.GetRow(9).GetCell(1).SetCellValue(2300);<br />sheet1.GetRow(10).GetCell(1).SetCellValue(240);<br />sheet1.GetRow(11).GetCell(1).SetCellValue(180123);<br />sheet1.GetRow(12).GetCell(1).SetCellValue(150);<br /><br /><span style="color: #008000;">//Force excel to recalculate all the formula while open</span>
sheet1.ForceFormulaRecalculation = <span style="color: #0000ff;">true</span>;</p><p>FileStream file = new FileStream(@"test.xls", FileMode.Create);<br />hssfworkbook.Write(file);<br />file.Close();</p></pre></div>
<p>首先打开模板文件时要使用FileAccess.Read，这样可以保证文件不被占用。</p>
<p>这里的ForceFormulaRecalculation是强制要求Excel在打开时重新计算的属性，在拥有公式的xls文件中十分有用，大家使用时可别忘了设。</p>
<p>&nbsp;</p>
<p>是不是比你想象的简单？你甚至不用去了解它是在何时读取文件内容的，对于NPOI的使用者来说基本上和读取普通文件没有什么两样。</p>
<p>&nbsp;</p>
<p>最终生成的效果如下所示：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a target="_blank" href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI.xlsExcel_943B/image_4.png"><img style="border: 0px none ; display: inline;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI.xlsExcel_943B/image_thumb_1.png" border="0" height="367" width="299" /></a> </p>
<p>发觉没，就连千分位分隔符也都保留着，一切就像人工填写的一样。</p>
<p>&nbsp;</p>
<p>本范例完整代码请见NPOI.Examples中的GenerateXlsFromXlsTemplate项目。</p><img src="http://www.cnblogs.com/tonyqus/aggbug/1543242.html?type=1" width="1" height="1" alt=""/><p>评论: 8　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/10/1543242.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/10/1543242.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>NPOI 1.2教程 - 1 认识NPOI</title><link>http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541606.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Sat, 08 Aug 2009 00:21:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541606.html</guid><description><![CDATA[<p>阅读: 1465 评论: 0 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-08-08 08:21 <a href="http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541606.html" target="_blank">原文链接</a></p><p>本章将介绍NPOI的一些基本信息，包括以下几个部分</p>
<ul><li>什么是NPOI</li><li>版权说明</li><li>相关资源</li><li>团队介绍</li><li>未来展望</li><li>各Assembly的作用 </li></ul>
<p>&nbsp;</p>
<p>1.1 什么是NPOI</p>
<p>NPOI，顾名思义，就是POI的.NET版本。那POI又是什么呢？POI是一套用Java写成的库，能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件，支持的文件格式包括xls, doc, ppt等。在本文发布时，POI的最新版本是3.5 beta 6。</p>
<p>NPOI 1.x是基于POI 3.x版本开发的，与poi 3.2对应的版本是NPOI 1.2，目前最新发布的版本是1.2.1，在该版本中仅支持读写Excel文件和Drawing格式，其他文件格式将在以后的版本中得到支持。</p>
<p>&nbsp;</p>
<p>1.2 版权说明</p>
<p>NPOI采用的是Apache 2.0许可证（poi也是采用这个许可证），这意味着它可以被用于任何商业或非商业项目，你不用担心因为使用它而必须开放你自己的源代码，所以它对于很多从事业务系统开发的公司来说绝对是很不错的选择。</p>
<p>当然作为一个开源许可证，肯定也是有一些义务的，例如如果你在系统中使用NPOI，你必须保留NPOI中的所有声明信息。对于源代码的任何修改，必须做出明确的标识。</p>
<p>完整的apache 2.0许可证请见<a title="http://www.phpx.com/man/Apache-2/license.html" href="http://www.phpx.com/man/Apache-2/license.html" target="_blank">http://www.phpx.com/man/Apache-2/license.html</a></p>
<p>&nbsp;</p>
<p>1.3 相关资源</p>
<p>官方网站：<a title="http://npoi.codeplex.com/" href="http://npoi.codeplex.com/" target="_blank">http://npoi.codeplex.com/</a></p>
<p>POIFS Browser 1.2</p>
<p>下载地址：<a href="http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24305" target="_blank">http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24305</a></p>
<p>QQ交流群:&nbsp; 78142590<br /></p><p>&nbsp;</p>
<p>1.4 团队介绍</p>
<p>Tony Qu来自于中国上海，是这个项目的发起人和开发人员，时区是GMT+8，2008年9月开始了NPOI的开发，负责NPOI所有底层库的开发、测试和bug修复。</p>
<p>个人blog地址为<a href="http://tonyqus.cnblogs.com/" target="_blank">http://tonyqus.cnblogs.com/</a></p>
<p>&nbsp;</p>
<p>H&#252;seyin T&#252;fek&#231;ilerli来自于土耳其的伊斯坦布尔，也是这个项目的开发人员，时区是GMT+2，2008年11月参与了NPOI的开发，主要负责POIFS Browser 1.0的开发工作。</p>
<p>个人blog地址为<a title="http://huseyint.com/" href="http://huseyint.com/" target="_blank">http://huseyint.com/</a></p>
<p>&nbsp;</p>
<p>aTao.Xiang，来自中国，2009年8月开始参与该项目，主要参与了NPOI 1.2中文版的撰写工作和推广工作</p>
<p>个人blog地址为<a title="http://www.cnblogs.com/atao/" href="http://www.cnblogs.com/atao/" target="_blank">http://www.cnblogs.com/atao/</a></p>
<p>&nbsp;</p>
<p>1.5 回顾与展望</p>
<p>目前POI版本中的HWPF（用于Word的读写库）还不是很稳定，并非正式发布版本，且负责HWPF的关键开发人员已经离开，所以NPOI可能考虑自己重新开发HWPF。另外，目前微软正在开发Open XML Format SDK，NPOI可能会放弃对ooxml的支持，当然这取决于用户的需求和Open XML Format SDK的稳定性和速度。从目前而言，NPOI有几大优势</p>
<p>第一，完全基于.NET 2.0，而非.NET 3.0/3.5。</p>
<p>第二，读写速度快（有个国外的兄弟回复说，他原来用ExcelPackage生成用了4-5个小时，现在只需要4-5分钟）</p>
<p>第三，稳定性好（相对于用Office OIA而言，毕竟那东西是基于Automation做的，在Server上跑个Automation的东西，想想都觉得可怕），跑过了将近1000个测试用例（来自于POI的testcase目录）</p>
<p>第四，API简单易用，当然这得感谢POI的设计师们</p>
<p>第五，完美支持Excel 2003格式（据说myxls无法正确读取xls模板，但NPOI可以），以后也许是所有Office 2003格式</p>
<p>希望NPOI把这些优势继续发扬下去，这样NPOI才会更有竞争力。</p>
<p>&nbsp;</p>
<p>1.6 NPOI 1.2中各Assembly的作用</p>
<p>NPOI目前有好几个assembly，每个的作用各有不同，开发人员可以按需加载相应的assembly。在这里大概罗列一下：</p>
<p>NPOI.Util&nbsp;&nbsp; 基础辅助库 <br />NPOI.POIFS&nbsp;&nbsp; OLE2格式读写库 <br />NPOI.DDF&nbsp;&nbsp; Microsoft Drawing格式读写库 <br />NPOI.SS&nbsp;&nbsp; Excel公式计算库 <br />NPOI.HPSF&nbsp;&nbsp; OLE2的Summary Information和Document Summary Information属性读写库 <br />NPOI.HSSF&nbsp;&nbsp; Excel BIFF格式读写库</p><img src="http://www.cnblogs.com/tonyqus/aggbug/1541606.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541606.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541606.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>NPOI 1.2教程 - 2.1.6 创建页眉和页脚</title><link>http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541604.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Sat, 08 Aug 2009 00:00:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541604.html</guid><description><![CDATA[<p>阅读: 725 评论: 0 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-08-08 08:00 <a href="http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541604.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>  <p>NPOI官方网站：<a href="http://npoi.codeplex.com/">http://npoi.codeplex.com/</a></p>  <p>&#160;</p>  <p>很多人并不知道Excel的页眉和页脚功能，因为在界面上是显示不了页眉和页脚的，必须在打印页面中才能看到，这也直接导致了其设置界面也显得更隐秘，你必须进入页面设置 –&gt; 页眉和页脚才能设置。以下是Office 2007中的设置界面。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_thumb_1.png" width="438" height="441" /></a> </p>  <p>当你按“自定义页眉”或“自定义页脚”时，你会看到以下界面，Excel把页眉、页脚分成了左中右三部分，这一点绝非单纯体现在界面上，在底层的存储中也是如此。如果你设置的是“左”的内容，底层的存储字符串就会在开头加上&amp;L，如果是“右”的内容则会加上&amp;R，所以HeaderRecord中的字符串看上去是这样的：&quot;&amp;C&amp;LFooter A&amp;R”，这个字符串的意思是仅设置了“左”的内容，内容是Footer A。</p>  <p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_thumb_2.png" width="697" height="338" /></a> </p>  <p>看了这些我想你应该对页眉和页脚有所了解了，回过头来说NPOI，NPOI中主要是靠HSSFSheet.Header和HSSFSheet.Footer来设置的，这两个属性分别是HSSFHeader和HSSFFooter类型的。</p>  <p>&#160;</p>  <p>参考代码如下：</p>  <div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px">   <pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">HSSFSheet s1 = hssfworkbook.CreateSheet(<span style="color: #006080">&quot;Sheet1&quot;</span>);
s1.CreateRow(0).CreateCell(1).SetCellValue(123);

<span style="color: #008000">//set header text</span>
s1.Header.Center = <span style="color: #006080">&quot;This is a test sheet&quot;</span>;
<span style="color: #008000">//set footer text</span>
s1.Footer.Left = <span style="color: #006080">&quot;Copyright NPOI Team&quot;</span>;
s1.Footer.Right = <span style="color: #006080">&quot;created by Tony Qu（瞿杰）&quot;</span>;</pre>
</div>

<p>&#160;</p>

<p>以上代码中我添加了页眉的Center内容，Footer的Left和Right内容，在打印预览中看到的效果大概是这样的：</p>

<p>页眉</p>

<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_thumb_3.png" width="560" height="44" /></a>&#160;</p>

<p>页脚</p>

<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_10.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.1.6_6C8B/image_thumb_4.png" width="561" height="53" /></a> </p>

<p>至于一些Excel特殊字符，比如说页码可以用&amp;P，当前日期可以用&amp;D，其他的东西你就自己研究吧。</p>

<p>&#160;</p>

<p>本范例完整代码请见NPOI.Examples中的CreateHeaderFooterInXls项目。</p><img src="http://www.cnblogs.com/tonyqus/aggbug/1541604.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541604.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/08/08/1541604.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>NPOI 1.2教程 - 2.5 打印相关设置</title><link>http://www.cnblogs.com/tonyqus/archive/2009/05/10/1453589.html</link><dc:creator>Tony  Qu</dc:creator><author>Tony  Qu</author><pubDate>Sun, 10 May 2009 04:06:00 GMT</pubDate><guid>http://www.cnblogs.com/tonyqus/archive/2009/05/10/1453589.html</guid><description><![CDATA[<p>阅读: 988 评论: 1 作者: <a href="http://www.cnblogs.com/tonyqus/" target="_blank">Tony  Qu</a> 发表于 2009-05-10 12:06 <a href="http://www.cnblogs.com/tonyqus/archive/2009/05/10/1453589.html" target="_blank">原文链接</a></p><p>作者：Tony Qu</p>
<p>NPOI官方网站：<a href="http://npoi.codeplex.com/"><font color="#a91718">http://npoi.codeplex.com/</font></a></p>
<p>&nbsp;</p>
<p>打印设置主要包括方向设置、缩放、纸张设置、页边距等。NPOI 1.2支持大部分打印属性，能够让你轻松满足客户的打印需要。</p>
<p>&nbsp;</p>
<p>首先是方向设置，Excel支持两种页面方向，即纵向和横向。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_2.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="132" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_thumb.png" width="445" border="0" /></a> </p>
<p>在NPOI中如何设置呢？你可以通过HSSFSheet.PrintSetup.Landscape来设置，Landscape是布尔类型的，在英语中是横向的意思。如果Landscape等于true，则表示页面方向为横向；否则为纵向。</p>
<p>&nbsp;</p>
<p>接着是缩放设置，</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_6.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="81" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_thumb_2.png" width="400" border="0" /></a> </p>
<p>&nbsp;</p>
<p>这里的缩放比例对应于HSSFSheet.PrintSetup.Scale，而页宽和页高分别对应于HSSFSheet.PrintSetup.FitWidth和HSSFSheet.PrintSetup.FitHeight。要注意的是，这里的PrintSetup.Scale应该被设置为0-100之间的值，而不是小数。</p>
<p>&nbsp;</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_8.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="35" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_thumb_3.png" width="404" border="0" /></a> </p>
<p>接下来就是纸张设置了，对应于HSSFSheet.PrintSetup.PaperSize，但这里的PaperSize并不是随便设置的，而是由一些固定的值决定的，具体的值与对应的纸张如下表所示：</p>
<table cellspacing="0" cellpadding="0" border="0">
    <tr>
            <td width="84">值</td>
            <td width="262">纸张</td>
        </tr>
        <tr>
            <td>1</td>
            <td>US Letter 8 1/2 x 11 in</td>
        </tr>
        <tr>
            <td>2</td>
            <td>US Letter Small 8 1/2 x 11 in</td>
        </tr>
        <tr>
            <td>3</td>
            <td>US Tabloid 11 x 17 in</td>
        </tr>
        <tr>
            <td>4</td>
            <td>US Ledger 17 x 11 in</td>
        </tr>
        <tr>
            <td>5</td>
            <td>US Legal 8 1/2 x 14 in</td>
        </tr>
        <tr>
            <td>6</td>
            <td>US Statement 5 1/2 x 8 1/2 in</td>
        </tr>
        <tr>
            <td>7</td>
            <td>US Executive 7 1/4 x 10 1/2 in</td>
        </tr>
        <tr>
            <td>8</td>
            <td>A3 297 x 420 mm</td>
        </tr>
        <tr>
            <td>9</td>
            <td>A4 210 x 297 mm</td>
        </tr>
        <tr>
            <td>10</td>
            <td>A4 Small 210 x 297 mm</td>
        </tr>
        <tr>
            <td>11</td>
            <td>A5 148 x 210 mm</td>
        </tr>
        <tr>
            <td>12</td>
            <td>B4 (JIS) 250 x 354</td>
        </tr>
        <tr>
            <td>13</td>
            <td>B5 (JIS) 182 x 257 mm</td>
        </tr>
        <tr>
            <td>14</td>
            <td>Folio 8 1/2 x 13 in</td>
        </tr>
        <tr>
            <td>15</td>
            <td>Quarto 215 x 275 mm</td>
        </tr>
        <tr>
            <td>16</td>
            <td>10 x 14 in</td>
        </tr>
        <tr>
            <td>17</td>
            <td>11 x 17 in</td>
        </tr>
        <tr>
            <td>18</td>
            <td>US Note 8 1/2 x 11 in</td>
        </tr>
        <tr>
            <td>19</td>
            <td>US Envelope #9 3 7/8 x 8 7/8</td>
        </tr>
        <tr>
            <td>20</td>
            <td>US Envelope #10 4 1/8 x 9 1/2</td>
        </tr>
        <tr>
            <td>21</td>
            <td>US Envelope #11 4 1/2 x 10 3/8</td>
        </tr>
        <tr>
            <td>22</td>
            <td>US Envelope #12 4 \276 x 11</td>
        </tr>
        <tr>
            <td>23</td>
            <td>US Envelope #14 5 x 11 1/2</td>
        </tr>
        <tr>
            <td>24</td>
            <td>C size sheet</td>
        </tr>
        <tr>
            <td>25</td>
            <td>D size sheet</td>
        </tr>
        <tr>
            <td>26</td>
            <td>E size sheet</td>
        </tr>
        <tr>
            <td>27</td>
            <td>Envelope DL 110 x 220mm</td>
        </tr>
        <tr>
            <td>28</td>
            <td>Envelope C5 162 x 229 mm</td>
        </tr>
        <tr>
            <td>29</td>
            <td>Envelope C3 324 x 458 mm</td>
        </tr>
        <tr>
            <td>30</td>
            <td>Envelope C4 229 x 324 mm</td>
        </tr>
        <tr>
            <td>31</td>
            <td>Envelope C6 114 x 162 mm</td>
        </tr>
        <tr>
            <td>32</td>
            <td>Envelope C65 114 x 229 mm</td>
        </tr>
        <tr>
            <td>33</td>
            <td>Envelope B4 250 x 353 mm</td>
        </tr>
        <tr>
            <td>34</td>
            <td>Envelope B5 176 x 250 mm</td>
        </tr>
        <tr>
            <td>35</td>
            <td>Envelope B6 176 x 125 mm</td>
        </tr>
        <tr>
            <td>36</td>
            <td>Envelope 110 x 230 mm</td>
        </tr>
        <tr>
            <td>37</td>
            <td>US Envelope Monarch 3.875 x 7.5 in</td>
        </tr>
        <tr>
            <td>38</td>
            <td>6 3/4 US Envelope 3 5/8 x 6 1/2 in</td>
        </tr>
        <tr>
            <td>39</td>
            <td>US Std Fanfold 14 7/8 x 11 in</td>
        </tr>
        <tr>
            <td>40</td>
            <td>German Std Fanfold 8 1/2 x 12 in</td>
        </tr>
        <tr>
            <td>41</td>
            <td>German Legal Fanfold 8 1/2 x 13 in</td>
        </tr>
        <tr>
            <td>42</td>
            <td>B4 (ISO) 250 x 353 mm</td>
        </tr>
        <tr>
            <td>43</td>
            <td>Japanese Postcard 100 x 148 mm</td>
        </tr>
        <tr>
            <td>44</td>
            <td>9 x 11 in</td>
        </tr>
        <tr>
            <td>45</td>
            <td>10 x 11 in</td>
        </tr>
        <tr>
            <td>46</td>
            <td>15 x 11 in</td>
        </tr>
        <tr>
            <td>47</td>
            <td>Envelope Invite 220 x 220 mm</td>
        </tr>
        <tr>
            <td>48</td>
            <td>RESERVED--DO NOT USE</td>
        </tr>
        <tr>
            <td>49</td>
            <td>RESERVED--DO NOT USE</td>
        </tr>
        <tr>
            <td>50</td>
            <td>US Letter Extra 9 \275 x 12 in</td>
        </tr>
        <tr>
            <td>51</td>
            <td>US Legal Extra 9 \275 x 15 in</td>
        </tr>
        <tr>
            <td>52</td>
            <td>US Tabloid Extra 11.69 x 18 in</td>
        </tr>
        <tr>
            <td>53</td>
            <td>A4 Extra 9.27 x 12.69 in</td>
        </tr>
        <tr>
            <td>54</td>
            <td>Letter Transverse 8 \275 x 11 in</td>
        </tr>
        <tr>
            <td>55</td>
            <td>A4 Transverse 210 x 297 mm</td>
        </tr>
        <tr>
            <td>56</td>
            <td>Letter Extra Transverse 9\275 x 12 in</td>
        </tr>
        <tr>
            <td>57</td>
            <td>SuperA/SuperA/A4 227 x 356 mm</td>
        </tr>
        <tr>
            <td>58</td>
            <td>SuperB/SuperB/A3 305 x 487 mm</td>
        </tr>
        <tr>
            <td>59</td>
            <td>US Letter Plus 8.5 x 12.69 in</td>
        </tr>
        <tr>
            <td>60</td>
            <td>A4 Plus 210 x 330 mm</td>
        </tr>
        <tr>
            <td>61</td>
            <td>A5 Transverse 148 x 210 mm</td>
        </tr>
        <tr>
            <td>62</td>
            <td>B5 (JIS) Transverse 182 x 257 mm</td>
        </tr>
        <tr>
            <td>63</td>
            <td>A3 Extra 322 x 445 mm</td>
        </tr>
        <tr>
            <td>64</td>
            <td>A5 Extra 174 x 235 mm</td>
        </tr>
        <tr>
            <td>65</td>
            <td>B5 (ISO) Extra 201 x 276 mm</td>
        </tr>
        <tr>
            <td>66</td>
            <td>A2 420 x 594 mm</td>
        </tr>
        <tr>
            <td>67</td>
            <td>A3 Transverse 297 x 420 mm</td>
        </tr>
        <tr>
            <td>68</td>
            <td>A3 Extra Transverse 322 x 445 mm</td>
        </tr>
        <tr>
            <td>69</td>
            <td>Japanese Double Postcard 200 x 148 mm</td>
        </tr>
        <tr>
            <td>70</td>
            <td>A6 105 x 148 mm</td>
        </tr>
        <tr>
            <td>71</td>
            <td>Japanese Envelope Kaku #2</td>
        </tr>
        <tr>
            <td>72</td>
            <td>Japanese Envelope Kaku #3</td>
        </tr>
        <tr>
            <td>73</td>
            <td>Japanese Envelope Chou #3</td>
        </tr>
        <tr>
            <td>74</td>
            <td>Japanese Envelope Chou #4</td>
        </tr>
        <tr>
            <td>75</td>
            <td>Letter Rotated 11 x 8 1/2 11 in</td>
        </tr>
        <tr>
            <td>76</td>
            <td>A3 Rotated 420 x 297 mm</td>
        </tr>
        <tr>
            <td>77</td>
            <td>A4 Rotated 297 x 210 mm</td>
        </tr>
        <tr>
            <td>78</td>
            <td>A5 Rotated 210 x 148 mm</td>
        </tr>
        <tr>
            <td>79</td>
            <td>B4 (JIS) Rotated 364 x 257 mm</td>
        </tr>
        <tr>
            <td>80</td>
            <td>B5 (JIS) Rotated 257 x 182 mm</td>
        </tr>
        <tr>
            <td>81</td>
            <td>Japanese Postcard Rotated 148 x 100 mm</td>
        </tr>
        <tr>
            <td>82</td>
            <td>Double Japanese Postcard Rotated 148 x 200 mm</td>
        </tr>
        <tr>
            <td>83</td>
            <td>A6 Rotated 148 x 105 mm</td>
        </tr>
        <tr>
            <td>84</td>
            <td>Japanese Envelope Kaku #2 Rotated</td>
        </tr>
        <tr>
            <td>85</td>
            <td>Japanese Envelope Kaku #3 Rotated</td>
        </tr>
        <tr>
            <td>86</td>
            <td>Japanese Envelope Chou #3 Rotated</td>
        </tr>
        <tr>
            <td>87</td>
            <td>Japanese Envelope Chou #4 Rotated</td>
        </tr>
        <tr>
            <td>88</td>
            <td>B6 (JIS) 128 x 182 mm</td>
        </tr>
        <tr>
            <td>89</td>
            <td>B6 (JIS) Rotated 182 x 128 mm</td>
        </tr>
        <tr>
            <td>90</td>
            <td>12 x 11 in</td>
        </tr>
        <tr>
            <td>91</td>
            <td>Japanese Envelope You #4</td>
        </tr>
        <tr>
            <td>92</td>
            <td>Japanese Envelope You #4 Rotated</td>
        </tr>
        <tr>
            <td>93</td>
            <td>PRC 16K 146 x 215 mm</td>
        </tr>
        <tr>
            <td>94</td>
            <td>PRC 32K 97 x 151 mm</td>
        </tr>
        <tr>
            <td>95</td>
            <td>PRC 32K(Big) 97 x 151 mm</td>
        </tr>
        <tr>
            <td>96</td>
            <td>PRC Envelope #1 102 x 165 mm</td>
        </tr>
        <tr>
            <td>97</td>
            <td>PRC Envelope #2 102 x 176 mm</td>
        </tr>
        <tr>
            <td>98</td>
            <td>PRC Envelope #3 125 x 176 mm</td>
        </tr>
        <tr>
            <td>99</td>
            <td>PRC Envelope #4 110 x 208 mm</td>
        </tr>
        <tr>
            <td>100</td>
            <td>PRC Envelope #5 110 x 220 mm</td>
        </tr>
        <tr>
            <td>101</td>
            <td>PRC Envelope #6 120 x 230 mm</td>
        </tr>
        <tr>
            <td>102</td>
            <td>PRC Envelope #7 160 x 230 mm</td>
        </tr>
        <tr>
            <td>103</td>
            <td>PRC Envelope #8 120 x 309 mm</td>
        </tr>
        <tr>
            <td>104</td>
            <td>PRC Envelope #9 229 x 324 mm</td>
        </tr>
        <tr>
            <td>105</td>
            <td>PRC Envelope #10 324 x 458 mm</td>
        </tr>
        <tr>
            <td>106</td>
            <td>PRC 16K Rotated</td>
        </tr>
        <tr>
            <td>107</td>
            <td>PRC 32K Rotated</td>
        </tr>
        <tr>
            <td>108</td>
            <td>PRC 32K(Big) Rotated</td>
        </tr>
        <tr>
            <td>109</td>
            <td>PRC Envelope #1 Rotated 165 x 102 mm</td>
        </tr>
        <tr>
            <td>110</td>
            <td>PRC Envelope #2 Rotated 176 x 102 mm</td>
        </tr>
        <tr>
            <td>111</td>
            <td>PRC Envelope #3 Rotated 176 x 125 mm</td>
        </tr>
        <tr>
            <td>112</td>
            <td>PRC Envelope #4 Rotated 208 x 110 mm</td>
        </tr>
        <tr>
            <td>113</td>
            <td>PRC Envelope #5 Rotated 220 x 110 mm</td>
        </tr>
        <tr>
            <td>114</td>
            <td>PRC Envelope #6 Rotated 230 x 120 mm</td>
        </tr>
        <tr>
            <td>115</td>
            <td>PRC Envelope #7 Rotated 230 x 160 mm</td>
        </tr>
        <tr>
            <td>116</td>
            <td>PRC Envelope #8 Rotated 309 x 120 mm</td>
        </tr>
        <tr>
            <td>117</td>
            <td>PRC Envelope #9 Rotated 324 x 229 mm</td>
        </tr>
        <tr>
            <td>118</td>
            <td>PRC Envelope #10 Rotated 458 x 324 mm</td>
        </tr>
    </table>
<p>（此表摘自《Excel Binary File Format (.xls) Structure Specification.pdf》）</p>
<p>HSSFSheet下面定义了一些xxxx_PAPERSIZE的常量，但都是非常常用的纸张大小，如果满足不了你的需要，可以根据上表自己给PaperSize属性赋值。所以，如果你要设置纸张大小可以用这样的代码：</p>
<p>HSSFSheet.PrintSetup.PaperSize=HSSFSheet.A4_PAPERSIZE;</p>
<p>或</p>
<p>HSSFSheet.PrintSetup.PaperSize=9; (A4 210*297mm)</p>
<p>&nbsp;</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_10.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="30" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_thumb_4.png" width="146" border="0" /></a> </p>
<p>再下来就是打印的起始页码，它对应于HSSFSheet.PrintSetup.PageStart和HSSFSheet.PrintSetup.UsePage，如果UsePage=false，那么就相当于&#8220;自动&#8221;，这时PageStart不起作用；如果UsePage=true，PageStart才会起作用。所以在设置PageStart之前，必须先把UsePage设置为true。</p>
<p>&nbsp;</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_14.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="403" alt="image" src="http://images.cnblogs.com/cnblogs_com/tonyqus/WindowsLiveWriter/NPOI1.22.5.1_D5BE/image_thumb_5.png" width="562" border="0" /></a> </p>
<p>&#8220;打印&#8221;栏中的&#8220;网格线&#8221;设置对应于HSSFSheet.IsPrintGridlines，请注意，这里不是HSSFSheet.PrintSetup下面，所以别搞混了。这里之所以不隶属于PrintSetup是由底层存储该信息的record决定的，底层是把IsGridsPrinted放在GridsetRecord里面的，而不是PrintSetupRecord里面的，尽管界面上是放在一起的。另外还有一个HSSFSheet.IsGridsPrinted属性，这个属性对应于底层的gridset Record，但这个record是保留的，从微软的文档显示没有任何意义，所以这个属性请不要去设置。</p>
<p>&#8220;单色打印&#8221;则对应于HSSFSheet.PrintSetup.NoColors，这是布尔类型的，值为true时，表示单色打印。</p>
<p>&#8220;草稿品质&#8221;对应于HSSFSheet.PrintSetup.IsDraft，也是布尔类型的，值为true时，表示用草稿品质打印。</p>
<p>这里的打印顺序是由HSSFSheet.PrintSetup.LeftToRight决定的，它是布尔类型的，当为true时，则表示&#8220;先行后列&#8221;；如果是false，则表示&#8220;先列后行&#8221;。</p>
<p>&nbsp;</p>
<p>在NPOI 1.2中，&#8220;行号列标&#8221;、&#8220;批注&#8221;和&#8220;错误单元格打印为&#8221;、&#8220;页边距&#8221;暂不支持，将在以后的版本中支持。</p>
<p>&nbsp;</p>
<p>有关打印的范例可以参考 <a href="http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=21991" target="_blank"><font color="#a91718">NPOI 1.2正式版</font></a> 中的 SetPrintSettingsInXls 项目。</p>
 <img src="http://www.cnblogs.com/tonyqus/aggbug/1453589.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/tonyqus/archive/2009/05/10/1453589.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tonyqus/archive/2009/05/10/1453589.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>