NPOI操作.docx

上传人:b****6 文档编号:5151864 上传时间:2022-12-13 格式:DOCX 页数:15 大小:380.06KB
下载 相关 举报
NPOI操作.docx_第1页
第1页 / 共15页
NPOI操作.docx_第2页
第2页 / 共15页
NPOI操作.docx_第3页
第3页 / 共15页
NPOI操作.docx_第4页
第4页 / 共15页
NPOI操作.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

NPOI操作.docx

《NPOI操作.docx》由会员分享,可在线阅读,更多相关《NPOI操作.docx(15页珍藏版)》请在冰豆网上搜索。

NPOI操作.docx

NPOI操作

本页仅作为文档封面,使用时可以删除

Thisdocumentisforreferenceonly-rar21year.March

 

NPOI操作Excel(总13页)

C#操作excel(NPOI篇)

          前一篇介绍了怎么用com操作excel,后来有朋友说用NPOI好,下面我也来介绍一些,下面是我收集的一些资料。

1.在Server端存取Excel档案的利器:

NPOILibrary

软件套件(Package)信息

套件名称

NPOI

作者

tonyqus,huseyin,atao

目前版本

1.2.1Stable(正式版)

URL

使用难易度

使用此套件时可用的辅助工具

VisualStudio2008

POIFSBrowser

基础知识

基本对象导向。

Excel基础操作。

在Server端控制Excel的难处

在今日MicrosoftExcel被广为业界接受之际,Excel已几乎是每个人必会的工具,不论是在校园或是职场,接触到Excel的机率很高,而且Excel靠着简单易用以及高度容错的能力,让使用者可以近乎无痛的操控Excel,它内建的强大试算以及数据整理的功能,也让很多使用者乐于使用它,这一点由Excel的高市占率得以印证,用Excel来整理与包装数据已经是司空见惯的事,因此很多的使用者会利用它来处理日常的业务资料或是基本文件等等,不过这可就苦了IT人员了。

在论坛上经常会看到一种需求,因为使用者不论如何都要用Excel文件来放数据,所以总是要求IT人员在系统中直接产出Excel档案直接下载给使用者,目前由官方公布,由服务器端存取Excel表格两种方法:

1.使用Excel对象模型来存取

这是官方公布最正统的方法,直接将Excel对象模型加入项目参考,并使用COM的方式来呼叫内含在Excel对象库中的对象,像是Workbook、Worksheet、Range、Formula、Row、Cell等等,它的好处是可以精确的控制Excel档案中的各种属性(储存格格式、样式、数据、公式以及条件等等),输出的档案也绝对是最正确的Excel数据文件,不过它却有下列缺点:

1.对象模型复杂不易学习。

2.在Excel对象库中,拥有数百种对象以及数以百计的列举常数值,每个对象之间又和数个不同的对象有交互关系,在程序的操控上相对不容易。

3.无法使用数据流方式控制Excel档案。

Excel对象模型是基于(Excel

的执行档)来存取档案的内容,对象显露出来的读取方法只有实体档案的方式,而无法使用数据流(如MemoryStream),这会迫使开发人员必须要另外处理产生的实体档案,对开发人员来说并不方便。

同时实体档案的操作系统I/O功能,也会涉及到权限控制的问题。

1.以单机为基础的执行引擎。

2.本身并不是针对网络环境来设计的,因此它基本上并不支持多人操作与共享的应用程序(简言之,就是Web应用程序),因此经常会在论坛上看到诸如『为什么Excel释放不掉』的问题,其根本原因就是Excel本身的行程特性,在多人产生执行个体以及多行程锁定的情况下,Excel行程会被占住无法释放,无法放掉的行程愈多,对服务器的内存就愈伤,甚至导致服务器不稳定。

 

NOTE

Excel对象模型可以在MSDNExcelDeveloperCenter中找到:

 

NOTE

微软官方并不建议在服务器端使用直接存取Excel对象模型的方式来控制Excel档案,除了上述的资源无法释放的问题外,还有像是权限的问题,以及安全性问题等等,详细的数据请参考:

 

2.使用OLEDBProviderforJet来存取

这是控制Excel档案的另一种作法,经由MicrosoftJetOLEDBProvider数据库引擎来存取,Jet引擎可以支持多种以档案为主的数据库(file-baseddatabase),像是Access、dBase等等,以SQL指令为主的存取能力,在Excel上也可以实现,开发人员可以不用特别熟悉Excel对象模型,就可以控制Excel档案的内容,不过它也不是一个好的服务器端Excel解决方案,因为:

4.不支持数据流存取。

5.Jet引擎和一样,也只能使用实体档案,无法使用数据流存取,因此也是要由开发人员自行管理使用过的档案,若疏于管理的话,会让服务器上充斥许多的无用档案。

6.控制数据的程度有限。

7.Jet引擎虽然可以存取Excel档案内容,但它毕竟不是Excel对象模型本身,对于Excel的控制无法做到跟对象模型完全相同的能力,而且也受限于Jet所支持的SQL指令,对于Excel档案只能使用SQL指令来操控,因此像是样式、条件以及高度依赖对象模型的功能,都没有办法被Jet控制。

由于官方本身所提供的Excel资料文件控制的方法基本上不支持伺服端的处理,因此开始有很多第三方软件厂商开始发展不需要Excel就可以处理的方法,像是Aspose的ExcelLibrary()、或是在ComponentSource中可以找到的许多组件,多数都可以在不需要安装Excel在伺服端的情况下就可以存取Excel档案,不过这些都是要$$的,所以有部份开发人员(包含开放原始码阵营)亦发展出一些免费且开放原始码的套件,像是ExcelLibrary(onGooglecode)以及Java阵营开发的ApachePOI项目(ApachePOIProject)。

 

NOTE

ApachePOI项目是为Java所设计可支持Office系列档案的存取类别库,目前已经可以支持到Excel97-2003XLS与最新的Excel2007XLSX格式等,可至ApachePOI项目网站参考它的功能:

 

在.NET上的POI:

NPOI

拜Apache的POI项目之赐,Java的开发人员可以轻松的存取Excel档案,而反观.NET阵营几乎只能在Excel对象模型以及Jet数据库引擎中打转,对于.NET阵营本身的开发人员似乎也不太公平,所以有几位佛心来的开发者另外开发可直接存取Excel的函式库,或是将Java中好用的函式库移植到.NET环境来,POI项目就是一例,在.NET上被称为NPOI。

POI项目本身是处理Office档案的函式库,包含Word、Excel、PowerPoint、Outlook、Visio、Publisher等档案,这些档案都有一个共通的特性,就是它们都是微软发展的OLECompoundDocument(复合文件),以OLEStructuredStorage(结构化储存)格式储存在档案中,OLE规范(以及处理OLEAPI呼叫等)对一般的开发人员来说是有相当的难度,因此利用Excel本身的对象模型是最容易的一件事。

但POI项目并没有使用到Excel的任何东西,它直接深入OLECompoundDocument格式内去存取数据,也可以直接控制到各种储存格的信息(颜色,储存格格式与样式等),并将它对象导向化,外部开发人员只需要利用POI提供的属性就可以控制Office格式的档案资料。

 

NOTE

OLECompoundDocument是一种档案储存的格式,它是植基在OLE结构化储存(StructuredStorage)的基础上,可以在同一个档案资料流中储存多种资料格式,以Excel为例,它可以同时储存电子表格(Spreadsheet)、图表(Chart)、样式(Style)、图片(Pictures)以及方程式(Equation)等不同型式的数据,这些不同型式的数据都是由一组独立格式的CLSID识别,再由CLSID在档案区段中找出不同的CLSID储存区,再深入储存区读出数据流,即可取回指定的数据。

图:

OLE复合文件结构(来源:

 

如果读者对Excel档案的实际内容有兴趣,可以在NPOI网站中下载POIFSExplorer,并用它开启Excel档案,就可以看到Excel档案的实际组成:

图:

POIFSExplorer

NPOI函式库

NPOI函式库可以在中下载,目前的版本为1.2.1,有分为.NET与.NET以上版本两种,支持主要的POI项目提供的功能,但项目中的范例程序代码都是以Excel为标的,原因应该是Excel在服务器端的处理远比Word和PowerPoint等文件要多太多了,故笔者在本篇文章也是以Excel档案为主要说明的标的。

NPOI函式库档案有七个,分别是:

NPOI核心函式库。

NPOI绘图区读写函式库。

NPOI文件摘要信息读写函式库。

NPOIExcelBIFF档案读写函式库。

NPOI工具函式库。

NPOIOLE格式存取函式库。

档案压缩函式库。

一般需要存取Excel97-2003格式(.xls)的档案时,需要使用NPOI、、与函式库,因此项目中要引用这四个DLL,若要一并存取文件摘要信息时,则也要引用档案,以取得必要的类别宣告。

开发人员通常只要集中精神在命名空间即可,它包含了控制Excel数据的各式类别对象供开发人员取用。

例如下列的程序代码可以生成一个空白的Excel档案,并且添加三个指定名称的电子表格:

[C#]

复制程序代码

HSSFWorkbookworkbook=newHSSFWorkbook();

MemoryStreamms=newMemoryStream();

//新增电子表格。

("电子表格A");

("电子表格B");

("电子表格C");

(ms);

("Content-Disposition",("attachment;filename="));

());workbook=null;();();

其执行结果就有如一般的档案下载般,不过它的数据却是一个完整的Excel数据文件:

将它用Excel打开来看,可以看到它的内容确实是以指定的电子表格名称所建立:

再试一些程序,我们可以在里面添加数据,例如下列的程序代码:

[C#]

复制程序代码

HSSFWorkbookworkbook=newHSSFWorkbook();

MemoryStreamms=newMemoryStream();

reateCell(0).SetCellValue("0");

(1).CreateCell(0).SetCellValue("1");

(2).CreateCell(0).SetCellValue("2");

(3).CreateCell(0).SetCellValue("3");

(4).CreateCell(0).SetCellValue("4");

(5).CreateCell(0).SetCellValue("5");

(ms);("Content-Disposition",("attachment;filename="));

());

workbook=null;

();

();

将它下载下来,用Excel开启,即可看到插入的数据值:

这样还不够,我们再设定一些东西,例如设定储存格的背景色:

[C#]

复制程序代码

HSSFWorkbookworkbook=newHSSFWorkbook();

MemoryStreamms=newMemoryStream();

reateCell(0);

=style1;

(0);

cell=

(1).CreateCell(0);

=style2;

(1);

cell=

(2).CreateCell(0);

=style1;

(2);

cell=(3).CreateCell(0);

=style2;(3);

cell=(4).CreateCell(0);

=style1;(4);

(ms);

("Content-Disposition",("attachment;filename="));

());workbook=null;();();

将它下载下来,用Excel开启,即可看到设定样式的电子表格:

输出没有问题,那么输入呢当然也没有问题啦。

例如目前手上有一个数据文件,它的内容是:

然后利用下列的程序代码:

[C#]

复制程序代码

ifHSSFWorkbookworkbook=newHSSFWorkbook

HSSFSheetsheet=(0);

DataTabletable=newDataTable();

HSSFRowheaderRow=(0);

intcellCount=;

for(inti=;i

{DataColumncolumn=newDataColumn(i).StringCellValue);

}

introwCount=;

for(inti=+1);i<;i++)

{

HSSFRowrow=(i);

DataRowdataRow=();

for(intj=;j

{if(j)!

=null)

dataRow[j]=(j).ToString();

}

}

workbook=null;

sheet=null;

=table;

执行结果如下:

实例应用:

将DataTable和Excel档案间互转

有了NPOI的支持,在伺服端将数据转换成Excel档案的功能将不再是大问题,也无须再使用汇出HTML表格的方式来仿真Excel档案的暂行方案来解决,只要使用NPOI就可以得到正规的Excel资料文件,笔者也特别撰写了一个简单的由DataTable对象自动转成Excel数据文件的小程序供读者自行取用。

[C#]

复制程序代码

usingSystem;

using;

using;

using;

using;

usingNPOI;using;

using;using;

using;

publicclassDataTableRenderToExcel{

publicstaticStreamRenderDataTableToExcel(DataTableSourceTable)

{HSSFWorkbookworkbook=newHSSFWorkbook();

MemoryStreamms=newMemoryStream();

HSSFSheetsheet=();

HSSFRowheaderRow=(0);

foreach(DataColumncolumnin

.SetCellValue;

introwIndex=1;

foreach(DataRowrowin

{

HSSFRowdataRow=(rowIndex);

foreach(DataColumncolumnin

{     

 .SetCellValue(row[column].ToString());

}

rowIndex++;

}

(ms);

();

=0;

sheet=null;

headerRow=null;

workbook=null;

returnms;}

publicstaticvoidRenderDataTableToExcel(DataTableSourceTable,stringFileName)

{MemoryStreamms=RenderDataTableToExcel(SourceTable)asMemoryStream;

FileStreamfs=newFileStream(FileName,,;

byte[]data=();

(data,0,;

();();

data=null;ms=null;fs=null;

}

publicstaticDataTableRenderDataTableFromExcel(StreamExcelFileStream,stringSheetName,intHeaderRowIndex){

HSSFWorkbookworkbook=newHSSFWorkbook(ExcelFileStream);

HSSFSheetsheet=(SheetName);

DataTabletable=newDataTable();

HSSFRowheaderRow=(HeaderRowIndex);

intcellCount=;

for(inti=;i

{

DataColumncolumn=newDataColumn(i).StringCellValue);

}

introwCount=;

for(inti=+1);i<;i++)

{HSSFRowrow=(i);

DataRowdataRow=();

for(intj=;j

dataRow[j]=(j).ToString();}

();workbook=null;sheet=null;returntable;}

publicstaticDataTableRenderDataTableFromExcel(StreamExcelFileStream,intSheetIndex,intHeaderRowIndex)

{HSSFWorkbookworkbook=newHSSFWorkbook(ExcelFileStream);

HSSFSheetsheet=(SheetIndex);

DataTabletable=newDataTable();

HSSFRowheaderRow=(HeaderRowIndex);

intcellCount=;

for(inti=;i

{DataColumncolumn=newDataColumn(i).StringCellValue);

}

introwCount=;

for(inti=+1);i<;i++)

{HSSFRowrow=(i);

DataRowdataRow=();

for(intj=;j

{if(j)!

=null)

dataRow[j]=(j).ToString();}

}

();

workbook=null;

sheet=null;

returntable;

}}

它的呼叫方法很简单,若是要将DataTable输出到Excel档案,只要将DataTable丢给RenderDataTableToExcel()方法即可。

[C#]

复制程序代码

DataTabletable=newDataTable();

//填充数据(由读者自行撰写)//产生Excel数据流。

MemoryStreamms=(table)asMemoryStream;

//设定强制下载标头。

("Content-Disposition",("attachment;filename="));

//输出档案。

());();();

若是要读取Excel档案并存到DataTable,只要设定上传的Excel档案数据流、电子表格索引(或名称)以及起始列索引值即可:

[C#]

复制程序代码

if

//读取Excel数据流并转换成DataTable。

DataTabletable=1,0);

=table;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1