NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。

NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。

使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。 

优势

编辑

(一)传统操作Excel遇到的问题:

1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。

2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。

3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。

4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。

(二)使用NPOI的优势

1、您可以完全免费使用该框架

2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)

3、专业的技术支持服务(24*7全天候) (非免费)

4、支持处理的文件格式包括xls, xlsx, docx.

5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)

6、同时支持文件的导入和导出

7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)

8、来自全世界大量成功且真实的测试Cases

9、大量的实例代码

11、你不需要在服务器上安装微软的Office,可以避免版权问题。

12、使用起来比Office PIAAPI更加方便,更人性化。

13、你不用去花大力气维护NPOINPOI Team会不断更新、改善NPOI,绝对省成本。

14、不仅仅对与Excel可以进行操作,对于doc、ppt文件也可以做对应的操作

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

构成

编辑

NPOI 1.2.x主要由POIFS、DDF、HPSF、HSSF、SS、Util六部分组成。

NPOI.POIFS

OLE2/ActiveX文档属性读写库

NPOI.DDF

Microsoft Office Drawing读写库

NPOI.HPSF

OLE2/ActiveX文档读写库

NPOI.HSSF

Microsoft Excel BIFF(Excel 97-2003)格式读写库

NPOI.SS

Excel公用接口及Excel公式计算引擎

NPOI.Util

基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发

表1 NPOI组成部分

NPOI 1.x的最新版为NPOI 1.2.5,其中包括了以下功能:

1、读写OLE2文档

2、读写DocummentSummaryInformationSummaryInformation

3、基于LittleEndian的字节读写

4、读写Excel BIFF格式

5、识别并读写Excel BIFF中的常见Record,如RowRecord, StyleRecord, ExtendedFormatRecord

6、支持设置单元格的高、宽、样式等

7、支持调用部分Excel内建函数,比如说sum, countif以及计算符号

8、支持在生成的XLS内嵌入打印设置,比如说横向/纵向打印、缩放、使用的纸张等。

NPOI 2.0主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats组成,具体列表如下:

Assembly名称 模块/命名空间 说明
NPOI.DLL

NPOI.POIFS

OLE2/ActiveX文档属性读写库

NPOI.DLL

NPOI.DDF

微软Office Drawing读写库

NPOI.DLL

NPOI.HPSF

OLE2/ActiveX文档读写库

NPOI.DLL

NPOI.HSSF

微软Excel BIFF(Excel 97-2003, doc)格式读写库

NPOI.DLL

NPOI.SS

Excel公用接口及Excel公式计算引擎

NPOI.DLL

NPOI.Util

基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发

NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式读写库
NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式读写库
NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底层zip包读写库
NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微软Office OpenXml对象关系库

项目近况:

编辑

在2013年10月8日,NPOI 2.0 beta 1发布,并已经支持Excel 2007和Word 2007。

系统要求:

VS2012/VS2010,基于.NET 4.0或者.NET 2.0
  VS2005/VS2008,基于.NET 2.0 (SP1) 
  VS2003,基于.NET 1.1 (仅更新到1.2.1版本,之后不再支持.NET 1.1)
  medium trust environment in ASP.NET

NPOI作为国人开发的开源项目,文档完善,更新及时,为.NET开发者提供了便利,主要用于生成Excel报表,搜索引擎模块中Excel中的文本提取,批量生成Excel文件,基于Excel文件模板生成新的Excel等多方面。

开发团队

编辑

Tony Qu(中国)

加入时间:2008年9月8日

huseyin

加入时间:2008年10月17日

atao.Xiang (中国)

加入时间:2009年10月12日

系统要求

编辑

VS2010 with .NET 4.0 runtime
  VS2005 or VS2008 with .NET 2.0 Runtime (SP1) 
  vs2003 with .NET 1.1

namespace 使用NPOI操作Excel
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button2_Click(object sender, EventArgs e){//创建一个集合List<Person> list = new List<Person>() { new Person(){ Name="张楠", Age=18, Email="zhangnan@163.com"},new Person(){ Name="王鑫", Age=19, Email="wangxin@yahoo.com"},new Person(){ Name="刘翰", Age=17, Email="liuhan@sohu.com"}};//Excel导出数据的步骤//1.创建一个空的Workbook对象(工作簿)IWorkbook wk = new HSSFWorkbook();//2.创建一个工作表SheetISheet sheet = wk.CreateSheet("People");//3.创建sheet中的行//遍历listint rowIndex = 0;foreach (Person item in list){//每遍历一条数据创建一行IRow row = sheet.CreateRow(rowIndex);//创建行中的单元格row.CreateCell(0).SetCellValue(item.Name);row.CreateCell(1).SetCellValue(item.Age);row.CreateCell(2).SetCellValue(item.Email);rowIndex++;}//4.把内存当中的workbook写入到磁盘中using (FileStream fsWrite = File.OpenWrite("People.xls")){wk.Write(fsWrite);}MessageBox.Show("ok");}//读取Excelsprivate void button1_Click(object sender, EventArgs e){//1.创建一个workbook对象,该对象中包含了excel文件中的数据//1.1创建一个文件流using (FileStream fsRead = File.OpenRead("ReadExcel.xls")){//1.2根据指定的文件流,创建一个workbook对象IWorkbook wk = new HSSFWorkbook(fsRead);//1.3获取该“工作簿”中的每个sheet(每个工作表)(循环)for (int i = 0; i < wk.NumberOfSheets; i++){//1.4获取每个工作表ISheet sheet = wk.GetSheetAt(i);Console.WriteLine("=============={0}==================", sheet.SheetName);//1.5获取当前工作表中的每一行for (int r = 0; r <= sheet.LastRowNum; r++){//1.6获取每一行IRow currentRow = sheet.GetRow(r);if (currentRow != null){//1.7获取当前行中的每个单元格for (int c = 0; c < currentRow.LastCellNum; c++){1.8获取每个单元格的值//string val = currentRow.GetCell(c).ToString();//Console.Write(val + "\t|");ICell cell = currentRow.GetCell(c);if (cell != null){// cell.ToString();//把每个单元格中的值都当做字符串来处理了。//cell.NumericCellValue//cell.StringCellValue//cell.BooleanCellValueswitch (cell.CellType){case CellType.BLANK:break;case CellType.BOOLEAN:break;case CellType.ERROR:break;case CellType.FORMULA:break;case CellType.NUMERIC:break;case CellType.STRING:break;case CellType.Unknown:break;default:break;}}}Console.WriteLine();}}}}}}public class Person{public string Name{get;set;}public int Age{get;set;}public string Email{get;set;}}
}

利用NPOI从datagridview中导出数据到Excel(已验证)

利用NPOI从Excel中导出数据到datagridview(已验证)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;namespace NPOIANDXML
{public partial class Form1 : Form{public List<ordermsg> list = new List<ordermsg>();public List<ordermsg> list2 = new List<ordermsg>();public Form1(){InitializeComponent();}private void btnReadExcel_Click(object sender, EventArgs e){//1、创建一个workbook对象,该对象中包含了Excel文件中的数据//1.1 创建一个文件流using (FileStream fsRead = File.OpenRead("555.xls")){//1.2根据指定的文件流,创建一个workbook对象IWorkbook wk = new HSSFWorkbook(fsRead);//1.3获取该"工作薄"中的每个sheetfor (int i = 0; i < wk.NumberOfSheets; i++){//1.4获取每个工作表ISheet sheet = wk.GetSheetAt(i);//1.5获取当前工作表中的每一行for (int r = 1; r < sheet.LastRowNum; r++){ordermsg objordermsg = new ordermsg();//获取表中每一行的数据IRow currentRow = sheet.GetRow(r);      if (currentRow != null){objordermsg.ordernumber = currentRow.GetCell(0).ToString() ;objordermsg.materialcode = currentRow.GetCell(1).ToString();objordermsg.materialsname = currentRow.GetCell(2).ToString();objordermsg.materiasquantity = currentRow.GetCell(3).ToString();if (currentRow.GetCell(4) == null){objordermsg.barcode = "";}else{objordermsg.barcode = currentRow.GetCell(4).ToString();}objordermsg.actualquantity = currentRow.GetCell(5).ToString();objordermsg.barcodeconfirm = currentRow.GetCell(6).ToString();}list.Add(objordermsg);}    }}this.dataGridView1.DataSource = list;}private void btnWriteExcel_Click(object sender, EventArgs e){if (this.dataGridView1.Rows.Count == 0){MessageBox.Show("datagridview中无数据");}//遍历datagridview中的数据保存到list集合中for (int i = 0; i < this.dataGridView1.Rows.Count; i++){//for (int j = 0; j < dataGridView1.ColumnCount; j++)//{ordermsg objordermsg = new ordermsg();objordermsg.ordernumber = this.dataGridView1.Rows[i].Cells[0].Value.ToString();objordermsg.materialcode = this.dataGridView1.Rows[i].Cells[1].Value.ToString();objordermsg.materialsname = this.dataGridView1.Rows[i].Cells[2].Value.ToString();objordermsg.materiasquantity = this.dataGridView1.Rows[i].Cells[3].Value.ToString();if (this.dataGridView1.Rows[i].Cells[4].Value==null){objordermsg.barcode = "";}else{objordermsg.barcode = this.dataGridView1.Rows[i].Cells[4].Value.ToString();}objordermsg.actualquantity = this.dataGridView1.Rows[i].Cells[5].Value.ToString();objordermsg.barcodeconfirm = this.dataGridView1.Rows[i].Cells[6].Value.ToString();list2.Add(objordermsg);//}}//Excel导出数据的步骤//1、创建一个空的Workbook对象(工作簿)IWorkbook wk = new HSSFWorkbook();//2、创建一个工作表sheetISheet sheet = wk.CreateSheet("ToExcel");//3、创建sheet中的行int rowIndex = 0;foreach (ordermsg item in list2){//每遍历一条数据创建一行IRow row = sheet.CreateRow(rowIndex); //创建行//创建行中的单元格row.CreateCell(0).SetCellValue(item.ordernumber);row.CreateCell(1).SetCellValue(item.materialcode);row.CreateCell(2).SetCellValue(item.materialsname);row.CreateCell(3).SetCellValue(item.materiasquantity);row.CreateCell(4).SetCellValue(item.barcode);row.CreateCell(5).SetCellValue(item.actualquantity);row.CreateCell(6).SetCellValue(item.barcodeconfirm);rowIndex++;}//4、把内存当中的workbook写入到磁盘中using (FileStream fsWrite = File.OpenWrite("ToExcel.xls")){wk.Write(fsWrite);}MessageBox.Show("导出数据OK");}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace NPOIANDXML
{public class ordermsg{public string ordernumber {set;get;}public string materialcode { set; get;}public string materialsname { set; get;}public string materiasquantity { set; get;}public string barcode { set; get; }public string actualquantity { set; get;}public string barcodeconfirm { set; get;}}
}

C#操作Excel数据库方法相关推荐

  1. python怎么用excel-Python使用xlwt模块操作Excel的方法详解

    本文实例讲述了Python使用xlwt模块操作Excel的方法.分享给大家供大家参考,具体如下: 部分摘自官网文档. 该模块安装很简单 $ pip install xlwt 先来个简单的例子: #!/ ...

  2. 用VBS操作Excel常见方法总结!

    系列文章分类 C#专栏.VBS专栏.JAVA 专栏.IDEA 专栏 用VBS操作Excel常见方法总结 前言 一.实现代码 二.实现代码 三.实现代码 四.实现VBS操作Excel 总结 前言 vbs ...

  3. python设置excel自动换行_python操作excel的方法(xlsxwriter包的使用)

    本文介绍python操作excel的方法(xlsxwriter包的使用),具体内容如下 xlsxwriter包的安装 pip install xlsxwriter Workbook类 创建一个exce ...

  4. python编程和excel_python编程之赋值和拷贝的区别概述及操作excel数据库(图)

    python编程之赋值和拷贝的区别概述及操作excel数据库(图) 一.赋值 在Python中,对象的赋值就是简单的对象引用,这点和C++不同,如下所示: a = [1,2,"hello&q ...

  5. C#操作excel(多种方法比较)

    我们在做excel资料的时候,通常有以下方法. 一.导入导出excel常用方法: 1.用查询表的方式查询并show在数据集控件上. 代码 public static string strCon = & ...

  6. MFC中使用OLE/COM操作EXCEL的方法

    使用OLE的方法操作EXCEL,首先计算机必须安装excel,这样才会有接口暴露出来.本次使用大神封装好的类. excel作为OLE/COM库插件,定义好了各类交互接口,而且这些接口是跨语言的,可以导 ...

  7. 最简单的asp.net 操作 access 数据库方法

    在asp.net中,使用C#操作access的mdb数据库,简单实用,只需要几步就可以实现. 1.新建一个asp.net网站,作为整个程序的表现层,里面的aspx文件可以调用其他层的项目. 2.建立一 ...

  8. VC2010操作Excel的方法

    第一种方法是添加Microsoft的类库时,在注册表中可以直接找到类库 本文介绍VC2010环境如何实现EXCEL操作,介绍了详细步骤并给出了具体的程序代码. 1. 创建新的C++工程 创建基于对话框 ...

  9. java 操作 mongodb_Java操作MongoDB数据库方法详解

    Java与mongodb的连接 1. 连单台mongodb Mongo mg = new Mongo();//默认连本机127.0.0.1 端口为27017 Mongo mg = new Mongo( ...

  10. python处理excel的方法有哪些_Python操作Excel简单方法

    今天一同学给我发来一个Excel文件,让我帮他找一些信息,打开一开 8000多条数据.自己手工处理是不可能完成的的啦.作为一名程序员,当然要用程序来处理.处理生活中的问题当然是Python最为方便啦. ...

最新文章

  1. 微信小程序之录音与播放功能(完整示例demo)
  2. 一个老程序员的心里话(转载)
  3. 【飞谷六期】爬虫项目1
  4. 文末送书丨深度迁移学习方法的基本思路
  5. boost::iterator的用法测试实例
  6. cisco routemap 能在出接口调用吗_潍坊驰燃一号燃料能不能合法在家经营,手续好办吗?...
  7. Nginx命令配置到系统环境
  8. jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分
  9. 软件测试技术 homework2
  10. CSS3 :nth-child() 选择器
  11. 复合赋值位运算符“&=、| =”
  12. 用图形工具管理Server Core上的账号和组图文教程
  13. 【Storm总结-6】Twitter Storm: DRPC简介
  14. androidQ(10.0) 预装集成apk到data分区
  15. CefSharp 知道这些就完事了
  16. python 开发管理软件 ERP
  17. 信息学奥赛一本通 1296:开餐馆 | OpenJudge NOI 2.6 6045:开餐馆
  18. 卸载xampp并重装mysql
  19. 金字塔图案——Java
  20. php的四种基本算法

热门文章

  1. 教你快速攻破小区门禁系统
  2. linux驱动编译成kext,Hackintosh:制作AppleALC以驱动原生AppleHDA
  3. 解决Navicat激活、注册时候出现No All Pattern Found的问题
  4. CAN通讯、CAN协议、UDS
  5. IOS技术分享| 你画我猜小游戏快速实现
  6. STM8S103重映射
  7. 上市公司风险预警案例可视化演示系统(附代码)
  8. 《王阳明心学及其当代意义》观后总结
  9. KinhDown(度盘PC下载器)
  10. 专访李运华:程序员如何在技术上提升自己