C#项目中操作Excel文件——使用NPOI库

标签: NPOI 读写Excel 操作Excel xls xlsx
25829人阅读 评论(8) 收藏 举报
分类:

实际C#项目中经常会涉及到需要对本地Excel文件进行操作,特别是一些包含数据记录、分析、汇总功能模块的项目。常用的操作Excel文件的方法主要有三个:


1. OleDb:

这种方式是把整个Excel文件当做一个数据源来进行数据的读取操作。

优点:实现方式简单,读取速度快;

缺点:读取Excel数据的过程不太灵活,对内存的占用比较高,当数据量变的很大时,容易由于内存空间不足导致内存溢出异常。(不过貌似对于今天电脑的硬件配置来说,内存问题不大)


2. Com组件

这种方式是通过Com组件 Microsoft.Office.Interop.Excel.dll实现Excel文件的操作。

优点:读取Excel数据非常灵活,可以实现Excel具有的各种数据处理功能;

缺点:对数据的访问时基于单元格方式实现的,所以读写数据较慢,特别是当数据量较大时,访问效率问题更为突出。另一点是要求本机安装了Microsoft Office组件。


3. NPOI

这种方式是通过NPOI库实现Excel文件操作,可以在没有安装微软Office的情况下使用。

优点:读取Excel数据速度较快,操作方式灵活;

缺点:试了再说!


NPOI支持的文件格式处理xls、xlsx外,还包括doc、ppt、vsd等,功能强大,人称Excel一哥。本文就准备单独谈一谈NPOI对Excel的基本操作。


NPOI是什么?


NPOI的log图标如下:


NPOI中N指代的是.Net,POI是一个完全开源的Java写成的库,能够在没有安装微软Office或者相应环境的情况下读写Excel、Word等微软OLE2组件文档,几乎支持所有的Office97~Office2007的文件格式。所以NPOI就是POI项目的.Net版本。目前NPOI的最新版本是今年5月份发布的V2.2.1,包含了.Net Framework2和.Net Framework4两个版本。


各个版本.Net Framework对应信息如下:




可以在C盘——C:\Windows\Microsoft.NET\Framework 下查看本机已经安装的.Net Framework版本,在我的机器上安装了以下版本:





NPOI库下载、解压



NPOI官网下载地址:点击打开链接,打开之后,点击红色框里的“NPOI 2.2.1 package”即可下载:



下载完成的压缩包大小只有3.5MB,解压后可以看到主要文件其实就是5个Dll文件(.Net 2.0和.Net 4.0):




使用的时候只要在自己的C#项目中添加这几个动态库文件的引用就可以了。


在C#工程中添加NPOI动态库引用


新建Visual Studio C# 控制台应用程序(或Windows窗体应用程序、WPF应用程序等均可),在解决方案管理器里项目下的“引用”上右击“添加引用”:




在弹出的“引用管理器”对话框中单击“浏览(B)”,选择NPOI所在的文件夹,根据机器上.Net Framework版本,选择Net20或Net40下的动态库。




添加完成之后展开项目下的“引用”项,可以看到刚才所添加的动态库。

经过简单的“添加引用”之后就可以在自己的代码中使用NPOI提供的接口实现各种Excel操作了。



Excel工作簿、工作表、xls、xlsx概念


在用NPOI编码之前,简单明确一下Excel中工作簿、工作表、xls、xlsx的概念,行、列、单元格等很明了的概念就不啰嗦了。


1. 每一个Excel文件都可以看做是一个工作簿,当打开一个Excel文件时,就等于打开了一个Excel工作簿。


2. 当打开了excel工作簿后在窗口底部看到的“Sheet”标签标示的是工作表,有几个标签就表示有几个工作表。

    简单做一个类比,一个Excel文件即一个工作簿可以看做一本书,一个工作表即一个Sheet页面是书内的一页,可以     有很多页。Excel2003最多可以添加255(有强迫症的程序猿最爱的数字之一)个,Excel2007随意加。


3. xls是Office 2003以及之前版本Excel的扩展名,xlsx是Office 2007及之后版本Excel所用的扩展名。xlsx用新的基于     XML的压缩文件格式取代了之前的默认文件格式,在传统的文件名后面添加了字面x(即.docx取代.doc、.xlsx取         代.xls,等等),使其占用的空间更小。xlsx向下兼容xls。



新建一个Excel工作表



除添加Dll文件的引用外,还需要添加名称空间:


using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;


HSSF使用于2007之前的xls版本,XSSF适用于2007及其之后的xlsx版本。

以下程序新建一个Excel 2003 xls和一个2007 xlsx文件,跟用Office建立的标准Excel格式一样,每一个Excel文件初始包含了3个工作表。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

namespace Excel_NPOI
{
    class Program
    {
        static void Main(string[] args)
        {
            HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿
            workbook2003.CreateSheet("Sheet1");  //新建3个Sheet工作表
            workbook2003.CreateSheet("Sheet2");
            workbook2003.CreateSheet("Sheet3");
            FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
            workbook2003.Write(file2003);
            file2003.Close();  //关闭文件流
            workbook2003.Close();

            XSSFWorkbook workbook2007 = new XSSFWorkbook();  //新建xlsx工作簿
            workbook2007.CreateSheet("Sheet1");
            workbook2007.CreateSheet("Sheet2");
            workbook2007.CreateSheet("Sheet3");
            FileStream file2007 = new FileStream(@"E:\Excel2007.xlsx", FileMode.Create);
            workbook2007.Write(file2007);
            file2007.Close();
            workbook2007.Close();
        }
    }
}


运行之后会在E盘根目录下生成Excel2003.xls和Excel2007.xlsx两个文件。



写入Excel文件数据



以xls文件为例,介绍把数据写入Excel文件的方法。

写数据要遵循一定的顺序,可以概括为:读取(或新建一个工作簿)->获取工作表->对工作表添加行->对每一行添加单元格->对单元格赋值


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

namespace Excel_NPOI
{
    class Program
    {
        static void Main(string[] args)
        {
            HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建工作簿
            workbook2003.CreateSheet("Sheet1");  //新建1个Sheet工作表            
            HSSFSheet SheetOne = (HSSFSheet)workbook2003.GetSheet("Sheet1"); //获取名称为Sheet1的工作表
            //对工作表先添加行,下标从0开始
            for (int i = 0; i < 10; i++)
            {
                SheetOne.CreateRow(i);   //创建10行
            }
            //对每一行创建10个单元格
            HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(0);  //获取Sheet1工作表的首行
            HSSFCell[] SheetCell = new HSSFCell[10];
            for (int i = 0; i < 10; i++)
            {
                SheetCell[i] = (HSSFCell)SheetRow.CreateCell(i);  //为第一行创建10个单元格
            }
            //创建之后就可以赋值了
            SheetCell[0].SetCellValue(true); //赋值为bool型         
            SheetCell[1].SetCellValue(0.000001); //赋值为浮点型
            SheetCell[2].SetCellValue("Excel2003"); //赋值为字符串
            SheetCell[3].SetCellValue("123456789987654321");//赋值为长字符串
            for (int i = 4; i < 10; i++)
            {
                SheetCell[i].SetCellValue(i);    //循环赋值为整形
            }
            FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
            workbook2003.Write(file2003);
            file2003.Close();
            workbook2003.Close();            
        }
    }
}


运行之后在生成的Exce2003.xls中的内容为:




读取Excel文件数据



HSSFWorkbook类和XSSFWorkbook类都继承自IWorkbook类,所以在不知道所要读取的Excel文件时xls还是xlsx时,可以使用IWorkbook来声明一个通用的工作簿变量,随后根据传入的文件名判断是xls还是xlsx。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

namespace Excel_NPOI
{
    class Program
    {
        static void Main(string[] args)
        {
            IWorkbook workbook = null;  //新建IWorkbook对象
            string fileName = "E:\\Excel2003.xls";
            FileStream fileStream = new FileStream(@"E:\Excel2003.xls", FileMode.Open, FileAccess.Read);
            if (fileName.IndexOf(".xlsx") > 0) // 2007版本
            {
                workbook = new XSSFWorkbook(fileStream);  //xlsx数据读入workbook
            }
            else if (fileName.IndexOf(".xls") > 0) // 2003版本
            {
                workbook = new HSSFWorkbook(fileStream);  //xls数据读入workbook
            }
            ISheet sheet = workbook.GetSheetAt(0);  //获取第一个工作表
            IRow row;// = sheet.GetRow(0);            //新建当前工作表行数据
            for (int i = 0; i < sheet.LastRowNum; i++)  //对工作表每一行
            {
                row = sheet.GetRow(i);   //row读入第i行数据
                if (row != null)
                {
                    for (int j = 0; j < row.LastCellNum; j++)  //对工作表每一列
                    {
                        string cellValue = row.GetCell(j).ToString(); //获取i行j列数据
                        Console.WriteLine(cellValue);
                    }
                }
            }
            Console.ReadLine();
            fileStream.Close();
            workbook.Close();
        }
    }
}


这段代码实现读取一个Excel文件内第一个工作表中的所有单元格内容,并打印输出。

取在上段代码中生成的xml文件作为输入,运行结果为:





查看评论

NPOI的下载、引用、基本使用

前言总渴望去拥有那些自己没有的东西,比如经验、能力;但自己拥有的更为重要的东西,却如此的不珍惜,比如青春。所以啊,趁着青春多写点代码,就能让自己早一步去渴望重新拥有青春了。问题背景工作中,需要将dat...
  • wf824284257
  • wf824284257
  • 2017年08月12日 12:37
  • 1885

NPOI

我在博客上看到很多人在用NPOI,发现很管用,不如就自己写一篇推荐给大家,但是后来自己整理还不如别人的好,所以我把NPOI的介绍转大家看吧,很详细。那我就自己写一下我写NPOI的步骤吧: NPOI...
  • tsj11514oo
  • tsj11514oo
  • 2015年01月15日 23:34
  • 2307

NPOI 2.2.1

  • 2016年06月15日 19:24
  • 3.52MB
  • 下载

如何添加NPOI引用

首先创建一个项目,如下图所示,然后根据自己的项目类型新建项目然后,在解决方案下(一般在右上角),找到引用(在此,我新建的是winform窗体)然后,在“引用”上面,右键添加引用然后选择浏览,找到你下载...
  • yanshuai_tek
  • yanshuai_tek
  • 2016年05月24日 16:21
  • 2560

NPOI使用手册

NOPI使用手册 目录 1. 认识NPOI   2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1 创建Workbook和Sheet 2.1.2 创建DocumentSummaryIn...
  • pan_junbiao
  • pan_junbiao
  • 2014年10月01日 11:43
  • 88982

NPOI小结

1. 准备工作 (1) 下载 到http://npoi.codeplex.com/releases/下载stable包,最好不要下载Beta包,解包。 (2) 添加引用 以.net4为例,项目-添加引...
  • jhycjhyc
  • jhycjhyc
  • 2016年12月04日 22:04
  • 1636

NPOI导出Excel并下载到客户端

利用NPOI导出Excel,把Excel发送到客户端
  • u012835032
  • u012835032
  • 2017年11月27日 22:27
  • 974

使用NPOI读取Excel到DataTable

一、NPOI介绍: 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Offic...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年08月23日 17:24
  • 3603

C# 使用NPOI操作Excel文件

什么是NPOI? What’s NPOI This project is the .NET version of POI Java project at http://poi.apache....
  • jmh1996
  • jmh1996
  • 2017年10月13日 14:29
  • 330

NPOI 通过excel模板写入数据并导出

private void ToExcel(string id) { //模板文件 string TempletFileName = Server.MapPath...
  • chuntian1983
  • chuntian1983
  • 2014年01月17日 08:50
  • 20162
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 127万+
    积分: 1万+
    排名: 1289
    博客专栏
    最新评论