NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
使用 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 PIA的API更加方便,更人性化。
13、你不用去花大力气维护NPOI,NPOI 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、读写DocummentSummaryInformation和SummaryInformation
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 list = new List() {
new Person(){ Name="张楠", Age=18, Email="[email protected]"},
new Person(){ Name="王鑫", Age=19, Email="[email protected]"},
new Person(){ Name="刘翰", Age=17, Email="[email protected]"}
};
//Excel导出数据的步骤
//1.创建一个空的Workbook对象(工作簿)
IWorkbook wk = new HSSFWorkbook();
//2.创建一个工作表Sheet
ISheet sheet = wk.CreateSheet("People");
//3.创建sheet中的行
//遍历list
int 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");
}
//读取Excels
private 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.BooleanCellValue
switch (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 list = new List();
public List list2 = new List();
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获取该"工作薄"中的每个sheet
for (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、创建一个工作表sheet
ISheet 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;}
}
}