转载自:http://blog.csdn.net/dcrmg/article/details/52356236#

感谢-牧野-

实际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文件的引用外,还需要添加名称空间:

  1. using NPOI.SS.UserModel;
  2. using NPOI.HSSF.UserModel;
  3. using NPOI.XSSF.UserModel;

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.SS.UserModel;
  7. using NPOI.HSSF.UserModel;
  8. using NPOI.XSSF.UserModel;
  9. using System.IO;
  10. namespace Excel_NPOI
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿
  17. workbook2003.CreateSheet("Sheet1");  //新建3个Sheet工作表
  18. workbook2003.CreateSheet("Sheet2");
  19. workbook2003.CreateSheet("Sheet3");
  20. FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
  21. workbook2003.Write(file2003);
  22. file2003.Close();  //关闭文件流
  23. workbook2003.Close();
  24. XSSFWorkbook workbook2007 = new XSSFWorkbook();  //新建xlsx工作簿
  25. workbook2007.CreateSheet("Sheet1");
  26. workbook2007.CreateSheet("Sheet2");
  27. workbook2007.CreateSheet("Sheet3");
  28. FileStream file2007 = new FileStream(@"E:\Excel2007.xlsx", FileMode.Create);
  29. workbook2007.Write(file2007);
  30. file2007.Close();
  31. workbook2007.Close();
  32. }
  33. }
  34. }

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

写入Excel文件数据

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.SS.UserModel;
  7. using NPOI.HSSF.UserModel;
  8. using NPOI.XSSF.UserModel;
  9. using System.IO;
  10. namespace Excel_NPOI
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建工作簿
  17. workbook2003.CreateSheet("Sheet1");  //新建1个Sheet工作表
  18. HSSFSheet SheetOne = (HSSFSheet)workbook2003.GetSheet("Sheet1"); //获取名称为Sheet1的工作表
  19. //对工作表先添加行,下标从0开始
  20. for (int i = 0; i < 10; i++)
  21. {
  22. SheetOne.CreateRow(i);   //创建10行
  23. }
  24. //对每一行创建10个单元格
  25. HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(0);  //获取Sheet1工作表的首行
  26. HSSFCell[] SheetCell = new HSSFCell[10];
  27. for (int i = 0; i < 10; i++)
  28. {
  29. SheetCell[i] = (HSSFCell)SheetRow.CreateCell(i);  //为第一行创建10个单元格
  30. }
  31. //创建之后就可以赋值了
  32. SheetCell[0].SetCellValue(true); //赋值为bool型
  33. SheetCell[1].SetCellValue(0.000001); //赋值为浮点型
  34. SheetCell[2].SetCellValue("Excel2003"); //赋值为字符串
  35. SheetCell[3].SetCellValue("123456789987654321");//赋值为长字符串
  36. for (int i = 4; i < 10; i++)
  37. {
  38. SheetCell[i].SetCellValue(i);    //循环赋值为整形
  39. }
  40. FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
  41. workbook2003.Write(file2003);
  42. file2003.Close();
  43. workbook2003.Close();
  44. }
  45. }
  46. }

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

读取Excel文件数据

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NPOI.SS.UserModel;
  7. using NPOI.HSSF.UserModel;
  8. using NPOI.XSSF.UserModel;
  9. using System.IO;
  10. namespace Excel_NPOI
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. IWorkbook workbook = null;  //新建IWorkbook对象
  17. string fileName = "E:\\Excel2003.xls";
  18. FileStream fileStream = new FileStream(@"E:\Excel2003.xls", FileMode.Open, FileAccess.Read);
  19. if (fileName.IndexOf(".xlsx") > 0) // 2007版本
  20. {
  21. workbook = new XSSFWorkbook(fileStream);  //xlsx数据读入workbook
  22. }
  23. else if (fileName.IndexOf(".xls") > 0) // 2003版本
  24. {
  25. workbook = new HSSFWorkbook(fileStream);  //xls数据读入workbook
  26. }
  27. ISheet sheet = workbook.GetSheetAt(0);  //获取第一个工作表
  28. IRow row;// = sheet.GetRow(0);            //新建当前工作表行数据
  29. for (int i = 0; i < sheet.LastRowNum; i++)  //对工作表每一行
  30. {
  31. row = sheet.GetRow(i);   //row读入第i行数据
  32. if (row != null)
  33. {
  34. for (int j = 0; j < row.LastCellNum; j++)  //对工作表每一列
  35. {
  36. string cellValue = row.GetCell(j).ToString(); //获取i行j列数据
  37. Console.WriteLine(cellValue);
  38. }
  39. }
  40. }
  41. Console.ReadLine();
  42. fileStream.Close();
  43. workbook.Close();
  44. }
  45. }
  46. }

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

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

C#项目中操作Excel文件——使用NPOI库的更多相关文章

  1. Vue项目中导入excel文件读取成js数组

    1. 安装组件 cnpm install xlsx --save 2. 代码 <template> <span> <input class="input-fil ...

  2. vue项目中导出Excel文件功能的前端代码实现

    在项目中遇到了两种不同情况, 1.get请求导出文件,实现起来相对简单 // 导出数据 exportData() { window.location.href = `/oes-content-mana ...

  3. vue项目中操作PDF文件

    以前从来没接触过前端要求显示PDF文件,一时之间有点懵逼,不知从哪下手啊... 无奈之下,去找度娘,方法还不少,iframe  embed  object这些标签就可以, 可是拿过来做个demo一试, ...

  4. 如何在 Laravel 项目中处理 Excel 文件

    1.Laravel Excel Laravel Excel 是一款基于PHPExcel开发的Laravel框架专用的Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便.它的Github地址 ...

  5. 用Python的pandas框架操作Excel文件中的数据教程

    用Python的pandas框架操作Excel文件中的数据教程 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其 ...

  6. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  7. Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  8. java 操作excel 文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  9. C#操作Excel文件(转)

    摘要:本文介绍了Excel对象.C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用. 关键词:受管代码:非受管代码:Excel对象:动态连接库 引言 Excel是微软公司办公自动化 ...

随机推荐

  1. PHP知识点

    目录 1. PHP函数前面添加@的作用 2. PHP连接MySQL数据库字符集设置 1. 通过PDO扩展连接MySQL数据库 2. 通过mysql扩展连接 3. php查询数据库出现中文乱码 3. 参 ...

  2. P3803 【模板】多项式乘法(FFT)

    传送门: 参考博客 1:大佬  attack 参考博客 2:大佬  胡小兔 在这里再膜拜一下这两位大佬 Orz%%% #include<iostream> #include<cstd ...

  3. 构造方法,this关键字,static关键字,封装,静态变量

    1.构造方法 构造方法是一种特殊的方法,是专门用于创建/实例化对象的方法. 构造方法根据是否有参数分为两类:1.无参构造方法  2.有参构造方法 1.1无参构造方法 无参构造方法就是构造方法中没有参数 ...

  4. 关于JS的原型与继承笔记

    1.什么是原型? 原型就是公用的方法或者属性. 1.prototype本质上还是一个JavaScript对象: 2.每个函数都有一个默认的属性prototype,而这个prototype的constr ...

  5. setup FTP server on CentOS 7

    Setup FTP Server on CentOS 7 Install vsftpd vsftpd (Very Secure File Transport Protocol Daemon) is a ...

  6. 关于Linux目录结构的理解

    dUI与刚接触Linux的学习者来说,那么多的根下目录足够让我们头疼不已,如下图: 那么对于初学者来说,我们首要了解的是哪些目录呢?  就是这个标黄绿色的tmp目录,此目录是一个存放临时文件夹的目录( ...

  7. Debian setup the time

    sudo gedit /etc/default/hwclock将 井HWCLOCKACCESS=yes 和 井HCTOSYS_DEVICE=rtc0 前的 井 符号去掉,再改 rtc0 为 rtc1 ...

  8. Jmeter笔记(Ⅱ)使用Jmeter实现轻量级的接口自动化测试

    接口测试虽然作为版本的一环,但是也是有一套完整的体系,有接口的功能测试.性能测试.安全测试:同时,由于接口的特性,接口的自动化低成本高收益的,使用一些开源工具或一些轻量级的方法,在测试用例开发的成本不 ...

  9. mutex,thread

    //#include <stdio.h> //#include <stdlib.h> //#include <unistd.h> #include <wind ...

  10. 爬取豆瓣电影影评,生成wordcloud词云,并利用监督学习根据评论自动打星

    本文的完整源码在git位置:https://github.com/OceanBBBBbb/douban-ml 爬取豆瓣影评 爬豆瓣的影评比较简单,豆瓣没有做限制,甚至你都不用登陆就可以看全部,我这里用 ...