C#学习日记2017-04-22 NPOI用法小结(未完待续)

来源:互联网 发布:js设置全局cookie 编辑:程序博客网 时间:2024/05/20 07:33

NPOI基础

认识NPOI:

NPOI能够在用户没有安装office情况下仍然能够操作office对象,是POI 的.net版本。可支持的文件格式有.xls .doc .ppt等。在大多数要运用到Excel的情况下,优先考虑使用NPOI操作Excel文件。而不是直接利用C#操作Excel。

NPOI的优点:

NPOI的优点在于:

  1. 即使本地计算机上没有安装Office,NPOI仍可生产和操作Excel文件。不必担心Office版本和适应性问题
  2. 使用面向接口的设计,NPOI开发人员封装了Excel的很多有用的操作,我们仅需要知道某个功能怎么用,而不需要知道这个功能的具体实现
  3. NPOI是完全免费的,感谢NPOI开发团队的无私奉献,由于他们不断的进行更新升级。我们才得以拥有一款操作Excel的神器。

其他方式操作Excel的缺点:

  1. 通过OleDB读取Excel:使用Microsoft Jet 提供程序用于连接到 Excel工作簿读取数据。这种方法将Excel文件视
    为一个数据源,可以使用SQL语句进行链接操作,也不需要安装Office,
    但是使用这种方法只能够进行简单的的读 写操作,稍微复杂的操作使用OleDB无法完成(如单元格合并,着色等)。

  2. 调用Com组件操作Excel:使用该方法需要先引入Microsoft.Office.Interop.Excel,可以利用VSTO(Visual Studio Tools for Office)轻松调用Com组件完成Excel操作。但是如果是Web站点部署在IIS上时,要求服务器已安装了Excel,有时候还需要为配置IIS权限。最重要的一点是Com组件操作Excel基于单元格方式读取的,所以在读取数据很慢。大量操作数据的时候并不建议使用这种方式。

NPOI结构

NPOI2.0版本结构:

NPOI 2.0有几个DLL构成,他们分别是

NPOI.DLL,

NPOI.OOXML.DLL,

NPOI.OpenXml4Net.dll,

NPOI.OpenXmlFormats.dll,其中后三个是2.0新加的库。

NPOI.DLL中包含的模块

NPOI.Util 基础辅助库
NPOI.POIFS OLE2格式读写库,主要负责处理DocumentInformation
NPOI.DDF Microsoft Drawing格式读写库
NPOI.SS Excel 2003和Excel 2007操作库共用的接口库以及公用模块实现,如公式计算库
NPOI.HPSF OLE2的Summary Information和Document Summary Information属性读写库
NPOI.HSSF Excel BIFF格式读写库,这是用户用的最多的命名空间

NPOI.OOXML中包含的模块

NPOI.XSSF Excel 2007操作库,大部分对象都实现了NPOI.SS的接口
NPOI.XWPF Word 2007操作库

NPOI.OpenXml4Net.DLL中包含的模块

只有一个,即NPOI.OpenXml4Net,它是从POI的子项目OpenXml4j移植过来的,其功能类似于NPOI.POIFS,只是它操作的是OOXML格式。这个模块和微软提供的System.Packaging功能是一致的,只是System.Packaging支持.Net 3.0以上,这个支持.NET 2.0。

NPOI.OpenXmlFormats.DLL中包含的模块

也只有一个,即OpenXmlFormats,它定义了所有OOXML对象和C#对象的映射关系,并协助进行序列化和反序列化,从而使文件读写层和逻辑层分离。

NPOI操作

NPOI创建并操作Excel文件

添加引用

using NPOI.HSSF.UserModel;           //最常用的引用,可以操作excel 2003 的.xls文件using NPOI.XSSF.UserModel;           //操作excel 2007的.xlsx文件using ICSharpCode.SharpZipLib.Zip;   //引用这个可以实现文件的压缩和解压缩using NPOI.SS.UserModel;             //包括xls和xlsx共用的接口库和公用模式的实现using System.IO;

创建工作簿,工作表,行,单元格

            IWorkbook book1 = new HSSFWorkbook();        //创建了一个xls格式的工作簿            IWorkbook book2 = new XSSFWorkbook();       //创建了一个xlsx格式的工作簿            ISheet sheet1 = book1.CreateSheet();          //创建一个工作表            ISheet sheet2 = book1.CreateSheet("sheet1"); //创建一个带名称的工作表            IRow row = sheet1.CreateRow(0);              //创建工作表内的一行            ICell cell = row.CreateCell(0);              //创建工作表内一行的单元格

            //读取一个Excel表,path是文件路径            FileStream fileExcel = new FileStream(path,FileMode.Open,FileAccess.Read);             IWorkbook book1 = new HSSFWorkbook(fileExcel);    //创建了一个xls格式的工作簿,并填充工作簿            ISheet sheet = book1.GetSheetAt(0);               //获取工作簿的第一张表            IRow row = sheet.GetRow(0);               //获取工作表的第一行            ICell cell = row.CreateCell(0);           //获取一行数据的单元格的值

NPOI实例

DataTable转换Excel文件

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.Odbc;using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using System.Data;using System.IO;namespace PackageManagement{    public class ExcelHelper    {        readonly int ecxelRowMax = 65536;  //设置excel的最大行数        public byte[] mDataTable2Excel(DataTable dt, string SheetName)   //将datatable转换成Excel,并返回一个字节数组         {            IWorkbook book = new HSSFWorkbook();                         //定义一个工作簿            if (dt.Rows.Count < ecxelRowMax)                             //如果表的行数没超过最大值。            {                mDataWrite2Sheet(dt, 0, dt.Rows.Count - 1, book, SheetName);  //调用方法创建表格            }            else                                                         //超过一张表的最大数,进行分表存储            {                int page = dt.Rows.Count / ecxelRowMax;                for (int i = 0; i < page; i++)                           //循环页数,创建表格                {                    int iStartRow = i * ecxelRowMax;                           //获取分表起始索引值                    int iEndRow = (i * ecxelRowMax) + ecxelRowMax - 1;         //获取分表结束索引值                    mDataWrite2Sheet(dt, iStartRow, iEndRow, book, SheetName); //调用方法创建表格                }                mDataWrite2Sheet(dt, page * ecxelRowMax - 1, (dt.Rows.Count), book, SheetName);  //分表剩余不足一页的部分也创建一张表            }            MemoryStream ms = new MemoryStream();   //创建内存流对象            book.Write(ms);                         //将book工作簿的内容写到MemoryStream中            return ms.ToArray();                    //返回一个字节流数组        }        private void mDataWrite2Sheet(DataTable dt, int startRow, int endRow, IWorkbook book, string sheetName)        {            ISheet sheet = book.CreateSheet();          //创建一个工作簿            IRow header = sheet.CreateRow(0);           //创建工作簿的第一行,默认它为标题行            for (int i = 0; i < dt.Columns.Count; i++)  //循环建立标题行            {                ICell cell = header.CreateCell(i);      //创建标题行的单元格                string value = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName;  //获取列名                cell.SetCellValue(value);               //单元格赋值datatable的列名            }            int indexRow = 1;            for (int i = startRow; i < endRow; i++)     //循环行的数据            {                DataRow dr = dt.Rows[i];                //新建一个datarow对象                IRow row = sheet.CreateRow(indexRow++); //创建工作表的Row对象                for (int j = 0; j < dr.ItemArray.Length; j++)         //循环单元格的数据                {                    row.CreateCell(j).SetCellValue(dr[j].ToString()); //向行对象row中添加单元格数据                }       } }

excel文件转换DataTable

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.Odbc;using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using System.Data;using System.IO;namespace PackageManagement{    public class ExcelHelper    {        //读取数据        public DataTable mExcel2DataTable(string path)   //将excel转换成datatable        {            DataTable dt = new DataTable();    //定义一个DataTable表            DataColumn dc = new DataColumn();  //定义一个DataColumn列            ISheet sheet = null;               //声明一个工作表            IWorkbook book = null;             //声明一个工作簿            try            {                FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);  //用文件流读取Excel文件                book = new HSSFWorkbook(fs);   //获取流文件转换成工作簿对象            }            catch (Exception ex)            {                throw ex;               //抛出表占用问题            }                  if (book.NumberOfSheets <= 1)  //Excel只存在一张表格            {                sheet = book.GetSheetAt(0);           //获取第一个表格                MFillDataTable(book, sheet, dc, dt);  //调用方法转换成DataTable表            }            else                            //Excel有多个表格            {                for (int i = 0; i < book.NumberOfSheets; i++)  //循环表的数目                {                    sheet = book.GetSheetAt(i);                //获取多张表格                    MFillDataTable(book, sheet, dc, dt);       //调用方法转换成DataTable表                }            }            return dt;        }        private void MFillDataTable(IWorkbook book, ISheet sheet, DataColumn dc, DataTable dt)        {            if (sheet != null)     //如果表不为空            {                IRow HeaderRow = sheet.GetRow(0); //获取表的第一行,标题行                if (dt.Columns.Count == 0)        //如果datatable的列的数目为0,则是第一次设置列对象                {                    for (int j = HeaderRow.FirstCellNum; j < HeaderRow.LastCellNum; j++)  //循环标题行的单元格                    {                        if (HeaderRow.Cells[j] != null)                        {                            string str = HeaderRow.Cells[j].ToString();                            dc = new DataColumn(str);                            dt.Columns.Add(dc);           //添加列到datatable中                        }                    }                }                for (int n = 1; n <= sheet.LastRowNum; n++)   //循环行的数据                {                    IRow row = sheet.GetRow(n);               //获取工作表的行数据                    if (row != null)                          //行不为空                    {                        DataRow dr = dt.NewRow();                                     for (int m = row.FirstCellNum; m < row.LastCellNum; m++) //循环行的单元格数据                        {                            dr[m] = row.Cells[m].ToString();                        }                        dt.Rows.Add(dr.ItemArray);        //填充数据表                    }                }            }        }    }}

“`

0 0
原创粉丝点击