C#如何用NPOI创建、读取、更新Excel文件

一.获取引用NPOI

 VS2017,通过Nuget工具包下载NPOI到指定的项目中,如下

二.添加如下命名空间,其中HSSF是操作*.xls文件,XSSF操作*.xlsx文件.

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

三.关于NPOI关键类/接口:

工作表:IWorkbook,XSSFWorkbook(*.xlsx);HSSFWorkbook(*.xls)

工作表:ISheet,Sheet

行:IRow,

obj_sh.LastRowNum获取最后一行的index

obj_row.LastCellNum;获取当前行的列数

单元格:ICell

四,创建Excel创建excel常规操作过程如下:

1.创建workbook对象

IWorkbook wbk = new XSSFWorkbook();

2.创建sheet到workbook中

ISheet mysheet = wbk.CreateSheet("mySheet");

3.在sheet对象中创建row

IRow myRow = mysheet.CreateRow(i);

4.在row中创建cell

ICell cell = myRow.CreateCell(i);

5.给cell赋值

cell.SetCellValue("单元格的值")

6.保存workbook对象的数据到电脑磁盘

using (FileStream fs_write = File.OpenWrite(path))
{
    wbk.Write(fs_write);
}

或者如下方式也可以

using(FileStream fs_write = File.Open(path,FileMode.Create))

{

        wbk.Write(fs_write);

}

//或如下,不用File.Open(...),直接new一个Filestream对象也可以
using (FileStream fs_write = new FileStream(path, FileMode.Create))
{
    wbk.Write(fs_write);
}
//上面两种保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏打不开!!!

五.创建Excel文件Demo如下:

        private void Form1_Load(object sender, EventArgs e){//声明工作本对象(XSSFWorkbook后缀名.xlsx;HSSFWorkbook后缀名.xls)IWorkbook wbk = new XSSFWorkbook();//创建一个sheetISheet mysheet = wbk.CreateSheet("mySheet");for (int i = 0; i < 3; i++){//创建行IRow myRow = mysheet.CreateRow(i);//创建单元格,写入值myRow.CreateCell(0).SetCellValue($"Row{i + 1}Col0");myRow.CreateCell(1).SetCellValue($"Row{i + 1}Col1");myRow.CreateCell(2).SetCellValue($"Row{i + 1}Col2");}int cellCnt = mysheet.GetRow(0).LastCellNum;//自动调整列宽for (int i = 0; i < cellCnt; i++){mysheet.AutoSizeColumn(i);}string path = @"D:\dwang\myWBK.xlsx";//将excel数据赋值给文件流,并excel文件的Write方法参数,保存wbk文件到本地磁盘//using (FileStream fs = File.OpenWrite(path))//{//    wbk.Write(fs);//}//或如下,不用File.OpenWrite(Path),直接new一个Filestream对象也可以using (FileStream fs_write = new FileStream(path, FileMode.Create)){wbk.Write(fs_write);}//上面的保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏.}

六.读取Excel文件:

读取excel文件过程如下:

1.通过指定的excel文件路径,读取到文件流中

2.创建workbook对象,将excel文件流作为workbook的构造函数传给工作本对象

3.读取sheet,row,cell,获取指定的内容,常见操作如下

3.1. 获取工作簿对象
IWorkbook workbook = new XSSFWorkbook(fs);    // 2007
// IWorkbook workbook = new HSSFWorkbook(fs); // 2003
3.2. 获取工作表对象(第一个表,序号从0开始)
ISheet sheet = workbook.GetSheetAt(0);
3.3. 获取工作表的行(第一行)
IRow row = sheet.GetRow(0);
3.4. 获取指定行的单元格
ICell cell = row.GetCell(0);
3.5. 获取单元格样式
ICellStyle cellStyle = cell.CellStyle;
3.6. 创建工作簿对象
XSSFWorkbook workBook= new XSSFWorkbook();
3.7. 创建工作表对象
XSSFSheet newSheet = (XSSFSheet)workBook.CreateSheet("new sheet");
3.8. 创建工作表的行
XSSFRow newRow = (XSSFRow)newSheet.CreateRow(0);
3.9. 创建单元格
XSSFCell newCell = (XSSFCell)newRow.CreateCell(0);
3.10. 单元格写值
newCell.SetCellValue(1);
3.11. 设置Sheet名称
workBook.SetSheetName(0, "第一张表");
3.12. 设置单元格内容
newCell.SetCellValue(11);
3.13. 得到工作簿中Sheet数量
workBook.NumberOfSheets
如下代码是读取Exel文件的常规操作:

private void Form1_Load(object sender, EventArgs e)
{string path = @"D:\dwang\mywbk.xlsx";if(!File.Exists(path)){MessageBox.Show("文件不存在,退出");return;}//读取excel,需要通过filestream读取excel,然后文件流对象作为参数传给workbook构造函数参数FileStream fs_read = File.OpenRead(path);//将文件流中的eexcel文件数据读取到workbook对象中IWorkbook wbk = new XSSFWorkbook(fs_read);//获取wbksheet数量int sheetCnt = wbk.NumberOfSheets;//激活第一个sheetwbk.SetActiveSheet(0);//获取sheet对象ISheet sh = wbk.GetSheetAt(0);//获取最后一行的行indexint rowCnt = sh.LastRowNum;List<string> lst = new List<string>();string cellContents = null;IRow currRow = null;for (int i = 0; i <= rowCnt; i++){//当前行赋值currRow = sh.GetRow(i);//获取当前行的单元格数量,注意,这个数字是列数,不是最后一个单元格索引int cellCnt = currRow.LastCellNum;for (int j = 0; j < cellCnt; j++){//获取当前行的每个单元格内容,并连接给字符串cellContents += $"{currRow.GetCell(j).ToString()},";}lst.Add(cellContents);cellContents = "";}foreach (var item in lst){MessageBox.Show(item);}//更新单元格值,并保存sh.GetRow(0).GetCell(0).SetCellValue("ASDFGH");sh.AutoSizeColumn(0);//关闭excel文件的读取流fs_read.Close();//wbk内容写入到新建的写入流,再到磁盘文件//保存到磁盘:workbook ->filestream -> 磁盘文件using (FileStream fs_write = File.OpenWrite(path)){wbk.Write(fs_write);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/611274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

linux进阶篇:下载工具wget的安装以及应用

1 wget工具介绍 wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。 wget支持HTTP&#xff0c;HTTPS和FTP协议&#xff0c;可以使用HTTP代理。所谓的自动下载是指&a…

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…

【PHP程序设计(高阶版)】——PHP操作MySQL教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

嵌入式学习53-ARM2

知识零碎&#xff1a; 跳转指令b&#xff1a; b 指令类似c语言的goto语句&#xff0c;能够实现无条件跳转。跳…

sonar搭建(linux系统)

前景 静态代码扫描是CI/CD中重要的一环&#xff0c;可以在代码提交到代码仓库之后&#xff0c;在CI/CD流程中加入代码扫描步骤&#xff0c;从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本&#xff0c;优化产品质量&#xff0c;提高产品交付速度。同时&#xf…

数字IC/FPGA——复位篇

本文主要介绍以下几点&#xff1a; 复位的作用及什么时候需要复位复位的分类全局复位、局部复位的目的如何选择全局复位和局部复位同步复位、异步复位及异步复位同步释放的原理、优缺点 注&#xff1a;参考文章在文末给出 目录 一、复位信号的作用和分类1.复位信号的作用2.复…

神经矩阵:数字进化的新生命形式

随着人工智能技术的快速发展&#xff0c;有些人害怕机器人的崛起&#xff0c;有些人担心人工智能将会接管世界。但是人们需要了解人工智能的未来发展&#xff0c;以及电子生命形式将会如何诞生。 本文不仅介绍电子生命形式将如何诞生&#xff0c;而且还将详细描述神经矩阵的关键…

MySQL选择普通索引还是唯一索引(2/16)

普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引&#xff0c;这两种索引的区别是&#xff1a; 普通索引&#xff08;Non-Unique Index&#xff09;&#xff0c;也称为非唯一索引&#xff0c;它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询…

【回溯】Leetcode 17. 电话号码的字母组合【中等】

电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 **输入&#xff1a;**digits “23” 输出&am…

io流的学习

目录 io流 FileOutputStream 字节输出流的细节: FileOutputStream写数据的方式 FilelnputStream FilelnputStream书写细节 FilelnputStream读取方式 计算机的存储规则 ASCll规则&#xff08;英文&#xff09; GBK(汉字) Unicode字符集的UTF-8编码格式 java中的编码和…

FPGA在医疗的应用,以4K医疗内窥镜为例

前言 随着技术的发展&#xff0c;医学影像作为科学技术的主要成就之一&#xff0c;在无创诊断和治疗领域已经有了多种应用。其中一个应用是内窥镜&#xff0c;在20世纪90年代&#xff0c;当利用电荷耦合装置将图像传输到显示器上成为可能时&#xff0c;内窥镜变得更加广泛。为…