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

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

实际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图标如下:


image.png


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对应信息如下:


image.png


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


image.png

NPOI库下载、解压

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

image.png

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


image.png


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


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


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


image.png

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


image.png

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


经过简单的“添加引用”之后就可以在自己的代码中使用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文件的引用外,还需要添加名称空间:

[cpp]  view plain  copy
 print ?
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个工作表。


[csharp]  view plain  copy
 print ?
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文件的方法。


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


[csharp]  view plain  copy
 print ?
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中的内容为:


image.png

读取Excel文件数据


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


[csharp]  view plain  copy
 print ?
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文件作为输入,运行结果为:


image.png


相关文章
|
4月前
|
Python
使用OpenPyXL库实现Excel单元格其他对齐方式设置
本文介绍了如何使用Python的`openpyxl`库设置Excel单元格中的文本对齐方式,包括文本旋转、换行、自动调整大小和缩进等,通过具体示例代码展示了每种对齐方式的应用方法,适合需要频繁操作Excel文件的用户学习参考。
240 85
使用OpenPyXL库实现Excel单元格其他对齐方式设置
|
2月前
|
文字识别 Serverless 开发工具
【全自动改PDF名】批量OCR识别提取PDF自定义指定区域内容保存到 Excel 以及根据PDF文件内容的标题来批量重命名
学校和教育机构常需处理成绩单、报名表等PDF文件。通过OCR技术,可自动提取学生信息并录入Excel,便于统计分析和存档管理。本文介绍使用阿里云服务实现批量OCR识别、内容提取、重命名及导出表格的完整步骤,包括开通相关服务、编写代码、部署函数计算和设置自动化触发器等。提供Python示例代码和详细操作指南,帮助用户高效处理PDF文件。 链接: - 百度网盘:[链接](https://pan.baidu.com/s/1mWsg7mDZq2pZ8xdKzdn5Hg?pwd=8866) - 腾讯网盘:[链接](https://share.weiyun.com/a77jklXK)
194 5
|
2月前
|
文字识别 BI
【图片型PDF】批量识别扫描件PDF指定区域局部位置内容,将识别内容导出Excel表格或批量改名文件,基于阿里云OCR对图片型PDF识别改名案例实现
在医疗和政务等领域,图片型PDF文件(如病历、报告、公文扫描件)的处理需求广泛。通过OCR技术识别这些文件中的文字信息,提取关键内容并保存为表格,极大提高了信息管理和利用效率。本文介绍一款工具——咕嘎批量OCR系统,帮助用户快速处理图片型PDF文件,支持区域识别、内容提取、导出表格及批量改名等功能。下载工具后,按步骤选择处理模式、进行区域采样、批量处理文件,几分钟内即可高效完成数百个文件的处理。
252 8
|
3月前
|
C# 开发工具 C++
code runner 运行C#项目
本文介绍了如何修改Code Runner设置使 Visual Studio Code (VS Code) 能直接运行完整的 C# 项目。传统方式依赖 cscript 工具,仅支持 .csx 文件,功能受限且已停止维护。新配置使用 `dotnet run` 命令,结合一系列炫酷的cmd指令,将指令定位到具体的csproj文件上进行运行。
189 38
|
4月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
526 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
4月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
72 6
按条件将Excel文件拆分到不同的工作表
|
4月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
104 6
|
4月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
89 6
|
4月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
608 10
|
6月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
385 4