摘要: 作者:Tony Qu & aTao.Xiang NPOI官方网站:http://npoi.codeplex.com/  | QQ交流群:  78142590 声明:本教程未经许可不得用于任何商业目的 目录更新日期:2010年1月5日   很多人可能对NPOI还很陌生,别担心,通过本教程你将对NPOI有进一步的认识和理解。 在此,特别感谢aTao.xi...  阅读全文
posted @ 2009-04-12 17:19 Tony Qu| 编辑

作者:Tony Qu

 

在过去的一年里,我已确定把文件格式作为我的主要研究课题之一,NPOI就是在这样的研究课题下的产物。尽管从严格意义上讲NPOI只是POI的.NET版本,并不是我创造的,但是在开发过程中,我对OLE2有了深入的理解和认识,也对Office 97-2003的文件格式有了截然不同的认识。如果在过去,有人问我:你知道Office文件格式吗?作为开发人员的我会毫不犹豫的说:我当然知道!但如今,我会说:我只知道一部分。有句话说得好:学得越多越觉得自己无知。

很多研究生为毕业时写篇合格的论文而发愁,觉得3年压根没学到啥东西,充其量就是跟着导师做点能赚外快的项目,其实他们并没有意识到,很多研究课题就在他们眼前,只是他们并不懂得去挖掘而已,所以有人说:搞研究的人没事要钻钻牛角尖,要懂得“斤斤计较”,你觉得啥都“顺眼”,还研究个啥。文件格式之所以有研究价值是因为它可能涉及到很多算法、压缩、编码学方面的知识,另外它也能帮你理解前人的思路——为什么要用这种算法,而不用另外一种算法;为什么要用这种结构而不是另一种。

 

好了,开场白差不多了,呵呵。开始进入正题,希望以下内容对大家有帮助,特别是打算研究文件格式的朋友。

 

NPOI

语言: C#

官方网站: http://npoi.codeplex.com/

描述: NPOI是POI的.NET移植版本,目前稳定版本中仅支持对xls文件(Excel 97-2003)文件格式的读写。目前的NPOI版本主要是基于POI 3.2的,目前正在将部分POI 3.5的bug修整放入新版本中。

相关文件格式: xls, OLE2格式

工具:POIFS Browser

代码协议: Apache 2.0

 

Office Binary Translator to Open XML

语言: c#

官方网站: http://b2xtranslator.sourceforge.net/

描述: 这个项目的主要目的是把Office 97-2003的文件格式转换成Open XML格式,为其他软件提供参考。

相关工具: BiffView++ (下载zip文件)

相关文件格式:doc/docx, ppt/pptx, xls/xlsx

代码协议:BSD

 

Open XML Format SDK

官方网站:http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&DisplayLang=en

描述:微软官方提供的Open XML读写库,目前最新版是2.0 CTP版本。

相关文件格式:Open XML Formats (docx, xlsx, pptx等)

 

ZeraldotNet

语言: c#

官方网站: http://www.codeplex.com/ZeraldotNet

描述: Zeral .Net类库实现了BitTorrent协议、eMule协议、Overnet协议和Gnutella协议。

相关文件格式: .torrent

代码协议:Ms-CL v1.1

 

NAudio

语言: C#

官方网站: http://www.codeplex.com/naudio

描述: NAudio是一套实用的音频类库,目的是加快.NET上音频相关工具的开发。它诞生于2001年,现在已经有了很多功能。

相关文件格式: MP3, OGG, SFZ, MIDI, SoundFont, WAV

代码协议:Ms-PL

 

DotNetZip

语言: C#

官方网站: http://www.codeplex.com/DotNetZip

描述: DotNetZip是一个小巧、使用简便的zip类库。用VB.NET及C#写的应用程序都能简单方便的创建、阅读和更新zip文件。

相关文件格式: zip

代码协议:Ms-PL

 

7zSharp

语言: C#

官方网站: http://www.codeplex.com/7zsharp

描述: 7zSharp是基于.NET 2.0的7z LZMA二次开发包,提供了一套便捷的API用于解密和加密7z文件。

相关文件格式: 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)

代码协议:LGPL 2.1

 

iTextSharp

语言: C#

官方网站: http://sourceforge.net/projects/itextsharp/

描述: iText# (iTextSharp)是iText Java开源库的C#移植版本,它可以让你从头开始生成PDF。

相关文件格式: PDF, rtf, bmp, gif, png,tiff, jpeg

相关技术: OpenPGP, OpenSSL, TSP(时间戳协议), x509, ocsp, BigInterger, BCPG

 

GifLib

语言: C#

官方网站: http://www.codeplex.com/GifLibhttp://www.cndotnet.org/GifLib

描述: GifLib能够无损读写Gif格式

相关文件格式: gif

相关技术: LZW压缩

代码协议:BSD

 

.NET DiscUtil

语言:C#

官方网站:http://discutils.codeplex.com/

相关文件格式:ISO, FAT, NTFS, VHD, XVA, VMDK和VDI

描述:可读写ISO文件和虚拟机磁盘文件格式(VHD, VDI, XVA, VMDK等)的库,完全用C#实现,没有P-Invoke。

代码协议:MIT

 

UOF and OOXML translator

官方网站:http://uof-translator.sourceforge.net/

相关文件格式:UOF, Open XML Formats

描述:这是微软公司、北京大学、LiSoft、清华大学、北京科技大学共同开发的开源项目,目的是实现UOF和OOXML的双向转换。目前最新版本是2.0,貌似正在开发2.1版本。

 

JPEG Data

环境:.NET 3.5 sp1

官方网站:http://jpegdata.codeplex.com/

相关文件格式:jpeg

描述:从jpeg中获得需要的数据

代码协议:Ms-PL

 

Mp4 Explorer

官方网站:http://mp4explorer.codeplex.com/

相关文件格式:mp4格式

描述:可用于从MPEG-4 iso文件((ISO/IEC 14496-12, ISO/IEC 14496-14, ISO/IEC 14496-15))中读取各种信息,如mp4头,元数据和其他数据

代码协议:Ms-PL

 

大家如果还知道其他的.NET文件格式项目可以写在回复中,我会及时更新。

posted @ 2010-01-03 09:18 Tony Qu 阅读(2655) | 评论 (20)编辑

作者:Tony Qu

 

今天收到了Pivot浏览器的邀请函,心里一阵暗喜,迫不及待地安装了Pivot CTP版。据说Pivot是用WPF做的,用Snoop扫了下,2D模式可以,可惜每次切换到3D模式Pivot都会抛异常,不知道为啥。

由于最近在使用IE8过程中,经常发生网站不兼容、浏览器窗口黑屏(相当频繁),再加上在做兼容性项目中发现众多的IE8 Bug,更生厌恶之情!所以决定试一下这个ie家族的“私生子”。

 

进入Pivot的第一感觉就是界面很清爽,有点苹果Mac OS的感觉,个人十分喜欢。

image

 

从前的页面选项卡跑最底下去了,就是下面这张图,点击图示的小按钮,你就会看到你正在浏览的页面的缩略图。

image 

是不是看着有点像google toolbar的homepage。

image

接下来是Pivot比较有卖点的功能——History

我们来做个对比,左侧是IE8的History,右侧是Pivot的History,是不是有点Windows和Mac OS对比的味道,呵呵。

image  image

接下来是更炫的动画效果,左侧勾选checkbox将触发右侧的动画效果,我特地截了好几次才得到以下图形序列

image image image image

当然图形毕竟还是图形,要想知道这个界面到底有多酷,建议你自己装一下pivot。

另外在地址栏左侧有一个“胶卷”按钮,点了之后同样也可以看到每个History记录的缩略图,有点类似Windows7的taskbar。

image

话说,添加Favorite页面也比较炫,尽然有动画效果——那个小星星会从右边飞到左边。

 

image

image

你试过把垂直滚动条向左拖吗?呵呵,Pivot会告诉你将发生什么,如下:

image image image

其实这里Pivot提供的是全局预览功能,当网页内容很多很长时,可以用它来找到你最需要的区域。

 

先写到这,其他的大家自己体验吧~地址:http://www.getpivot.com/

posted @ 2009-12-26 07:14 Tony Qu 阅读(2739) | 评论 (23)编辑

作者:Tony Qu

官方网站:http://npoi.codeplex.com | NPOI QQ交流群:  78142590

 

NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。

如果你不相信NPOI能够很好的理解OLE2文档格式,那就去下载POIFS Brower。具体可以参考这篇文章的介绍:Office文件格式解惑。当然单单理解OLE2是不够的,因为Excel文件格式是BIFF,但BIFF是以OLE2为基础的,做个很形象的比喻就是:OLE2相当于磁盘的FAT格式,BIFF相当于文件和文件夹。NPOI负责理解BIFF格式的代码基本都在HSSF命名空间里面。

好了,刚才废话了一会儿,主要是给大家打打基础,现在进入正题。

 

本文将以DataTable为容器读入某xls的第一个工作表的数据(最近群里面很多人问这个问题)。

在开始之前,我们先来补些基础知识。每一个xls都对应一个唯一的HSSFWorkbook,每一个HSSFWorkbook会有若干个HSSFSheet,而每一个HSSFSheet包含若干HSSFRow(Excel 2003中不得超过65535行),每一个HSSFRow又包含若干个HSSFCell(Excel 2003中不得超过256列)。

为了遍历所有的单元格,我们就得获得某一个HSSFSheet的所有HSSFRow,通常可以用HSSFSheet.GetRowEnumerator()。如果要获得某一特定行,可以直接用HSSFSheet.GetRow(rowIndex)。另外要遍历我们就必须知道边界,有一些属性我们是可以用的,比如HSSFSheet.FirstRowNum(工作表中第一个有数据行的行号)、HSSFSheet.LastRowNum(工作表中最后一个有数据行的行号)、HSSFRow.FirstCellNum(一行中第一个有数据列的列号)、HSSFRow.LastCellNum(一行中最后一个有数据列的列号)。

基础知识基本上补得差不多了,现在开工!

 

首先我们要准备一个用于打开文件流的函数InitializeWorkbook,由于文件读完后就没用了,所以这里直接用using(养成好习惯,呵呵)。

HSSFWorkbook hssfworkbook;

void InitializeWorkbook(string path)
{
//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock. //book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added. using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
{
hssfworkbook = new HSSFWorkbook(file);
}
}

接下来我们要开始写最重要的函数ConvertToDataTable,即把HSSF的数据放到一个DataTable中。

 

HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
//TODO::Create DataTable row for (int i = 0; i < row.LastCellNum; i++)
{
HSSFCell cell = row.GetCell(i);
//TODO::set cell value to the cell of DataTables }

上面的结构大家都应该能看懂吧,无非就是先遍历行,再遍历行中的每一列。这里引出了一个难点,由于Excel的单元格有好几种类型,类型不同显示的东西就不同,具体的类型有 布尔型、数值型、文本型、公式型、空白、错误。

public enum HSSFCellType
{
Unknown = -1,
NUMERIC = 0,
STRING = 1,
FORMULA = 2,
BLANK = 3,
BOOLEAN = 4,
ERROR = 5,
}

 

这里的HSSFCellType描述了所有的类型,但细心的朋友可能已经发现了,这里没有日期型,这是为什么呢?这是因为Excel底层并没有一定日期型,而是通过数值型来替代,至于如何区分日期和数字,都是由文本显示的样式决定的,在NPOI中则是由HSSFDataFormat来处理。为了能够方便的获得所需要的类型所对应的文本,我们可以使用HSSFCell.ToString()来处理。

于是刚才的代码则变成了这样:

HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

DataTable dt = new DataTable();
for (int j = 0; j < 5; j++)
{
dt.Columns.Add(Convert.ToChar(((int)'A')+j).ToString());
}

while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();

for (int i = 0; i < row.LastCellNum; i++)
{
HSSFCell cell = row.GetCell(i);

if (cell == null)
{
dr[i] = null;
}
else { dr[i] = cell.ToString(); } } dt.Rows.Add(dr); }

是不是很简单,呵呵!

当然,如果你要对某个特定的单元格类型做特殊处理,可以通过判HSSFCell.CellType来解决,比如下面的代码:

        switch(cell.CellType)
{
case HSSFCellType.BLANK:
dr[i] = "[null]";
break;
case HSSFCellType.BOOLEAN:
dr[i] = cell.BooleanCellValue;
break;
case HSSFCellType.NUMERIC:
dr[i] = cell.ToString(); //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. break;
case HSSFCellType.STRING:
dr[i] = cell.StringCellValue;
break;
case HSSFCellType.ERROR:
dr[i] = cell.ErrorCellValue;
break;
case HSSFCellType.FORMULA:
default:
dr[i] = "="+cell.CellFormula;
break;
}

这里只是举个简单的例子。

 

完整代码下载:http://files.cnblogs.com/tonyqus/ImportXlsToDataTable.zip

注意,此代码中不包括NPOI的assembly,否则文件会很大,所以建议去npoi.codeplex.com下载。

posted @ 2009-12-25 16:50 Tony Qu 阅读(2177) | 评论 (15)编辑

作者:Tony Qu

 

Bug重现

这里我引用了我同事流星陨落的例子。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<style>
.table1
{
    border-collapse:collapse;
}
 .table1 th {
  -ms-filter:"progid:DXImageTransform.Microsoft.gradient(enabled='true',startColorstr=white, endColorstr=gray)";
   border:1px solid red;
 }
</style>
</head>

<body>

<table class="table1">
<tr>
<th>Give me a border</th>
<th>Give me a border</th>
</tr>
</table>

</body>
</html>

重现环境:IE8, Browser Mode: IE8, Document Mode: IE8 Standard

image

正确的效果:

image

问题描述:

a.上面、左边和单元格中间的边框不应该看不见。

b. 这个问题与border-collapse属性没有关系,即使去掉border-collapse,也是没有边框的。

 

解决方案

我看了我同事发的帖子,http://space.cnblogs.com/question/9322/邀月同学给出了他的回复,在此表示感谢。不过position:absolute似乎并不是一个很好的解决方案,至少对于我们公司的系统是这样的,因为我们公司的table会有最多300列,如果每一列都要给一个新样式,那就有些小题大做了。更何况我们的列要支持宽度可变、拖放等功能,所以这种方法并不推荐。

但邀月的方法给了我点启发,既然position不行,float也许能行,于是早上拿float:left试了一把,居然可以,修正代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<style>
.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;
 }
</style>
</head>

<body>

<table class="table1">
<tr>
<th>Give me a border</th>
<th class="last">Give me a border</th>
</tr>
</table>

</body>
</html>

说明:

a. 这里我之所以加上th.last样式,是因为这时的border失去了border-collapse的功能,所以位于单元格之间的border会产生2px的粗线,这样会很难看,QA也不会放过这样明显的bug。所以觉得采用border-right:none,然后在最后一个单元格补上一个border-right:1px solid red。当然这样做的代价是对于所有table的TH我都必须去遍历到最后一个元素,然后把那个元素加上last样式。

b. 有人也许会问,你为啥不用th:last-child,其实我一开始是想用这个,结果所有的IE均不支持这个属性,无奈放弃。

c. 也有人提出了另外一种解决方法,即用background-image,没错,background-image确实可以解决这个问题,但很遗憾,我们公司的产品要求允许客户使用任意2种颜色换肤,如果采用生成图片的方案,将会产生大量的图片,更何况,我们有些table的header高度是随机的,到底该生成多高的渐变色又是一个令人头疼的问题。

注:如果你有更好的方法,请告诉我,最好连float都不用,呵呵,先谢了

我的一些看法

很多时候,微软产品会出现很多很诡异的现象,比如说蓝屏,但是蓝屏的case在大多数情况下是由于第三方的驱动引起的,所以我们不该怪微软,只能说她的驱动架构还无法很好的限制第三方驱动程序开发人员的行为。

但IE8的这个bug我觉得有些太容易重现了,而且我在网上也看到了Beta RC1时就有人发了询问帖(http://www.eggheadcafe.com/software/aspnet/34097060/ie8-rc1-bug-th-loses-bor.aspx),可偏偏微软的SDET没有发现,或者是SDE嫌烦不愿意修,不管哪一种原因,作为一个市场占有率极高的产品,这种bug实在有些说不过去。如果微软的同仁看到这篇帖子,麻烦转给相关人员,最好能够直接forward给IE team的SDE Lead,希望这个bug能够在sp1中修复。

在IE8发布之前,IE8的主管曾经声称IE8不完全支持W3C标准,我当时以为只是少量的问题、少量的不支持,但从这个bug来看,这句话看来很有内涵,这其中也包括了很多没有修复的bug所导致的“不标准”情况。前段时间也看了Gerard Talbot整理的IE8 Bug列表,看完这列表,恐怕你对IE8会有另外一种想法——全力抵制。回头看微软ie8的发布,也许是怕被Firefox赶上,提前发布了IE8,结果导致了一堆没有修复的bug也随之延后到sp1才能修复,当然这只是我的猜测,真正的原因只有IE team知道。

 

最后提一下IE8最让人失望的东西:

a. 放弃对canvas的支持,要求ie team提供支持的投票人数 70人

https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=334060

b. 放弃对VML的支持,要求ie team提供支持的投票人数投票人数23人

https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333905

c. 放弃对SVG的支持,要求ie team提供支持的投票人数投票人数27人

https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=333795

这也就意味着,IE8没有提供任何可以在浏览器中画矢量图的东西,结果微软说你可以考虑用Silverlight,哎,拿这种回答来回避其浏览器的不足,实在让人无语。客户买我的产品,我还得要求客户安装Silverlight插件,那如果他没有装或者没法装咋办?难道我和客户说那我们也没有办法,要不你换其他公司的产品?老板不杀了我才怪!

posted @ 2009-10-26 07:42 Tony Qu 阅读(1737) | 评论 (5)编辑

作者:Tony Qu

 

很多人会有这样的疑问,为什么新建任何一个Office文件格式初始大小永远是几k,而不是0k,既然是空的,为什么会占用空间?当初我也有这种疑问,但在研究了OLE2文档格式之后,这些疑问全部得以解开。简单的说,Office文件就是OLE2文档的一种,由于这种文档中有一些附属信息和初始结构,所以初始就是有大小的。

本文中即将提到的POIFS Browser可以到http://npoi.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23409下载,它是基于NPOI项目的一个工具,专门用于分析OLE2文件格式。

什么是OLE2文档

OLE2文档,又叫ActiveX文档或Windows Compound File,它是一种广泛用于Windows平台上的格式,除了微软自己以外,很多第三方厂商也使用这种格式存放数据。虽然平时我们没有看到过.ole的文件格式,但确实有很多文件使用这种格式作为一种标准,只不过它的扩展名是.xls, .doc, .db等。一个更加常见的例子就是thumbs.db,几乎你可以在任何目录中看到这个隐藏文件,这个文件正如其名字所暗示的,就是用来存储缩略图的,其内部存了好多bmp或者jpg缩略文件,利用OLE2的灵活文件结构,它把每一个缩略图保存为一个记录,就像一个小型文件夹,如下图所示:

image

用POIFS Browser打开后thumbs.db,可以看到里面有4个缩略图,外加一个索引(catalog的作用纯属猜测,未经验证)。

看到这,你是不是觉得OLE2更像文件系统,确实,Windows Compound File的spec来看,这种文件格式的设计很像FAT格式。毕竟微软是做操作系统的,这方面可是微软的强项,所以那些鼓吹微软文件格式过于复杂的人,更多的是看到了表象,这也从侧面反应出了这些人的无知。

为什么.xls文件格式的初始化大小是11K

现在让我们来解开本文最初的那个疑问,之所以不是0k,是因为Office2003文件格式内部有两个默认的文档头,分别是DocumentSummaryInformation(简称DSI)和SummaryInformation(简称SI),这两个文档头中分别存储了作者(AUTHOR)、创建它的应用程序名(APPNAME)、编码页号(CODEPAGE)等信息,之所以平时我们很少关注这些信息,是因为我们很少需要这些信息,但这些信息对于文件版本管理、数据挖掘等还是很有帮助的,这也是为什么很多搜索引擎提供一些第三方文件解析器(包括OLE2文件解析器)。另外,一个默认的Excel文件通常会有三个sheet,而这三个sheet也是要占空间的,而且通常情况下里面有不少子记录。

image

上图,是按鼠标右键->属性,弹出的窗口,其中的详细信息有一部分就是来源于DSI和SI的,本文件的属性有作者、最后一次修改作者、公司、程序名称、最后一次保存日期等。

不同Office文件格式的区别

这一节,我们来分析一下不同的Office文件格式的区别,尽管使用了同样的文件结构,但是里面的内容还是很不同的。这里大家可以借助POIFS Browser来直观的了解这些文件格式,有好工具要学会利用。

Word文件格式 (.doc)

image

Word文件的内部记录比较多,有1Table(有时是0Table)、Data、WordDocument,其中WordDocument是最主要的数据记录,内部还有很多小型数据结构。CompObj是用来存储Office版本信息的,即用什么版本的Office来写的,具体数据如下:

image

虽然我们看不到其中的一些二进制数据,但基本的ASCII明文信息表明了这个结构的记录。

Excel文件格式 (.xls)

image

由于POIFS Browser能够识别Workbook记录,所以这里是用文件夹图标表示的,你可以展开它。Excel文件格式在没有VBA宏和嵌入对象的情况下是很简单的,只有Workbook和CompObj两个记录,CompObj的作用和Word文件中的是一样的,这里的Workbook存储了所有的Excel BIFF数据,内部有很多BIFF小型记录。

PowerPoint文件格式 (.ppt)

image

Viso文件格式 (.vsd)

image

 

请注意,以上这些文件包括的内容是最基本的,没有包括权限(Right Management)、VBA宏、加密等信息,所以其内部的记录只有4-5个,否则可能包括一大堆内部记录。这里限于篇幅,就不一一展开了。


附言
如果你有兴趣参加NPOI项目开发,为中国的开源事业做一份贡献,请与我取得联系。 

参考

a. Apache POI project - http://poi.apache.org/

b. Excel Binary File Format (.xls) Structure Specification

posted @ 2009-09-15 21:02 Tony Qu 阅读(2196) | 评论 (15)编辑
     摘要: 作者:Tony QuNPOI官方网站:http://npoi.codeplex.com/NPOI QQ交流群: 78142590尽管NPOI能够从头开始生成Excel文件,但在实际生产环境中有很多现成的表格,我们不可能没事就去从头开始生成一个Excel,更多时候我们更愿意选择比较偷懒的方法——那就是用模板文件。NPOI一大特色之一就是能够轻松读取Office Excel 9...  阅读全文
posted @ 2009-08-10 23:22 Tony Qu 阅读(1550) | 评论 (8)编辑
     摘要: 本章将介绍NPOI的一些基本信息,包括以下几个部分什么是NPOI版权说明相关资源团队介绍未来展望各Assembly的作用 1.1 什么是NPOINPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。在本文发布时,POI的...  阅读全文
posted @ 2009-08-08 08:21 Tony Qu 阅读(1461) | 评论 (0)编辑
     摘要: 作者:Tony Qu NPOI官方网站:http://npoi.codeplex.com/   很多人并不知道Excel的页眉和页脚功能,因为在界面上是显示不了页眉和页脚的,必须在打印页面中才能看到,这也直接导致了其设置界面也显得更隐秘,你必须进入页面设置 –> 页眉和页脚才能设置。以下是Office 2007中的设置界面。 当你按“自定义页眉”或“自定义页脚”时,你会看到以...  阅读全文
posted @ 2009-08-08 08:00 Tony Qu 阅读(724) | 评论 (0)编辑
     摘要: 作者:Tony QuNPOI官方网站:http://npoi.codeplex.com/打印设置主要包括方向设置、缩放、纸张设置、页边距等。NPOI 1.2支持大部分打印属性,能够让你轻松满足客户的打印需要。首先是方向设置,Excel支持两种页面方向,即纵向和横向。 在NPOI中如何设置呢?你可以通过HSSFSheet.PrintSetup.Landscape来设置,Landscape是布尔类型的...  阅读全文
posted @ 2009-05-10 12:06 Tony Qu 阅读(986) | 评论 (1)编辑