转载自: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. 理解 JavaScript 中的 this

    前言 理解this是我们要深入理解 JavaScript 中必不可少的一个步骤,同时只有理解了 this,你才能更加清晰地写出与自己预期一致的 JavaScript 代码. 本文是这系列的第三篇,往期 ...

  2. Spark SQL历险记

    现在的spark sql编程通常使用scala api 以及 java api的方式,相比于直接使用 spark sql语句,spark api灵活很多,毕竟可以基于dataset以及rdd两种方式进 ...

  3. Java 基础 多线程和线程池基础

    一,多线程 1.1 多线程介绍 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负 ...

  4. mac 添加环境变量(jmeter添加至环境变量中)

    Mac系统的环境变量,加载顺序为:a. /etc/profileb. /etc/pathsc. ~/.bash_profiled. ~/.bash_logine. ~/.profilef. ~/.ba ...

  5. python爬虫简单的添加代理进行访问

    在使用python对网页进行多次快速爬取的时候,访问次数过于频繁,服务器不会考虑User-Agent的信息,会直接把你视为爬虫,从而过滤掉,拒绝你的访问,在这种时候就需要设置代理,我们可以给proxi ...

  6. jquery.uploadify上传插件HTML5版中文api使用说明

    插件官网文档:http://www.uploadify.com/documentation/ H5版下载地址:https://download.csdn.net/download/u010075697 ...

  7. Centos7 下yum安装mysql

  8. rabbitMQ Management http://localhost:15672/ 打不开

    C:\RabbitMQ Server\rabbitmq_server-3.7.7\sbin>rabbitmq-plugins enable rabbitmq_management 安装rabbi ...

  9. 数据库表中不建索引,在插入数据时,通过sql语句防止重复添加

    sql 语句 INSERT IGNORE INTO table(aaa,bbb) SELECT '1111','2222' FROM DUAL WHERE NOT EXISTS( ' ) mybati ...

  10. [算法] 举一反三之n重复数组中找唯一m重复异类数

    n重复数组,是指数组中的数字都出现n次: 唯一m重复异类数,是指存在唯一一个没出现n次,只出现了m次的数: 这里我简记它为nX+my问题,求解y,其中m < n,数组中都是整数: 3X+y问题 ...