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();

            //创建一个sheet
            ISheet 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;
    //激活第一个sheet
    wbk.SetActiveSheet(0);

    //获取sheet对象
    ISheet sh = wbk.GetSheetAt(0);
    //获取最后一行的行index
    int 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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】单调栈类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 单调栈 通常针对一维数组的问题&#xff0c;如果需要寻找一个元素右边或者左边第一个比自己大或者小的元素的位置&#xff0c;就可以使用单调栈&#xff0c;时间复杂度为O(n) 单调栈的本质是空间换时间&#…

泽众Testone自动化测试平台,测试用例支持单个调试执行,同步查看执行日志

泽众Testone自动化测试平台之前版本&#xff0c;测试用例批量和单个执行&#xff0c;必须要通过测试集操作执行&#xff0c;操作略繁琐&#xff0c;我们通过本轮优化升级&#xff0c;测试用例直接可以单个调试执行&#xff0c;同步查看执行日志&#xff0c;操作上去繁就简&…

新能源汽车“价格战”之后,充电桩主板市场将会怎样?

2024年2月底&#xff0c;国内新能源汽车市场开启了一场前所未有的“价格战”↓ 比亚迪率先抛出“王炸”车型——秦PLUS荣耀版和驱逐舰05荣耀版&#xff0c;起售价低至7.98万元&#xff0c;打响了价格战的“第一枪”&#xff0c;引爆了平静的汽车市场。 “电比油低”就此拉开序…

常用API时间Arrays

常用API MATH 代表数学&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法。 方法名说明public static int abs(int a)获取参数绝对值public static double ceil(double a)向上取整public static double floor(double a)向下取整public stati…

Python零基础从小白打怪升级中~~~~~~~模块+异常+Pycharm的debug调试

第十节&#xff1a;模块异常Debug 一、Python模块 Python 模块(Module)&#xff0c;是一个 Python 文件&#xff0c;以 .py 结尾&#xff0c;模块能定义函数&#xff0c;类和变量&#xff0c;模块里也能包含可执行的代码。 1、导入模块 导入模块的5中方式 import 模块名fr…

计算机网络知识等汇总补充

计算机网络知识汇总补充 一、四次挥手1、为什么TCP要等待2MSL2、如果说一个系统中&#xff0c;有大量的time_wait和close_wait&#xff0c;会是什么原因&#xff1f; 二、你是怎么解决粘包问题&#xff1f;三、你觉得哪些场景适合redis四、redis的持久化策略五、你会怎么保证my…

Leetcode算法训练日记 | day23

一、修剪二叉搜索树 1.题目 Leetcode&#xff1a;第 669 题 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff…

huggingface连不上的解决方案

不能科学上网的同学们, 代码中加载AI模型的时候, 会有下面的报错 We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like OFA-Sys/chinese-clip-vit-base-patch16 is not the path to a directory containi…

Flask基于flask_login实现登录、验证码

flask_login 是一个 Flask 扩展&#xff0c;用于在 Flask web 应用中实现用户会话管理。它允许你跟踪哪些用户已经登录&#xff0c;并管理他们的登录状态。flask_login 提供了用户认证的基础结构&#xff0c;但具体的用户验证&#xff08;如用户名和密码检查&#xff09;和存储…

3D Web轻量引擎HOOPS Communicator装配制造流程演示

介绍 该演示介绍了使用HOOPS Communicator的独特工作流程&#xff0c;该工作流程从零件列表中加载零件&#xff0c;并使用自定义配合操作符&#xff08;例如共线、同心和共面&#xff09;构建装配模型。该工作流程可用于各种行业&#xff0c;例如维护手册、工作指令或电子商务…

Python中sort()函数、sorted()函数的用法深入讲解(具体实例:蓝桥杯数位排序)

前置知识&#xff1a; 可迭代对象的定义&#xff1a;可迭代对象是指可以被迭代或遍历的对象&#xff0c;即可以使用循环结构对其进行逐个访问的对象。 在Python中常见的可迭代对象有&#xff1a;列表(list)、元组&#xff08;tuple&#xff09;、字符串&#xff08;sting&…

[CTF]使用浏览器firefox插件伪装IP地址

来源&#xff1a;https://jingyan.baidu.com/article/ab0b56306d9890c15bfa7d6a.html 浏览器想必是大家再熟悉不过的东东了&#xff0c;我们会经常使用它访问下载一些页面或文件。但是对于它的更深层次的功能可能就陌生了。比如说一些网站后台会记录我们的IP地址&#xff0c;假…

【AI面试】FPN、PANet、SPP、ASPP、Adaptive feature pooling

经常可以看到各个论文发出来,加入的各种trick。这些改进点,一般都是在前人的基础上,进行了一些修改。比如FPN到PANet的改进,就是为了改进前者存在的一些问题。 这里就把这些trick,给汇集到一起,看看他们的发展历史,看看他们之间有什么区别,又是在哪些地方做的改进。这…

OpenHarmony 3.2 Release版本Codec HDI适配过程

简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于 OpenMax 实现了视屏硬件编解码驱动&#xff0c;提供 Codec 基础能力接口供上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

uniapp h5项目实现多选按钮/多选标签/多选框

需求&#xff1a;实现简单多选功能&#xff0c;遍历数据&#xff0c;添加样式 1.效果图 2.以下代码粘贴到代码中&#xff0c;可直接运行&#xff0c;html代码 <view class"page index"><view class"list-box"><view v-for"(item,in…

智能网络新纪元:机器学习赋能未来计算机网络高速发展

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

赋能技术 助锂制造|青软青之助力锂电检测行业数字化升级

在全球范围内&#xff0c;新能源转型已成为时代的必然选择。随着“双碳”目标的深入推进&#xff0c;这一趋势愈发明显。而作为新能源领域的一颗璀璨明珠&#xff0c;锂电池的研发、产业链建设和技术创新&#xff0c;无疑是这场能源革命的核心所在。其产业链的日趋完善、技术的…

企业培训系统私有化解决方案:PlayEdu

PlayEdu&#xff1a;打造私有化的企业智慧教育平台&#xff0c;赋能全员高效成长&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 随着企业不断发展及市场竞争加剧&#xff0c;内部培训的重要性日益凸显。然而&#xff0c;在实施过程中&#xff0c;如何确保培训内容与…

2024个人动态线条导航HTML源码

源码介绍 2024个人导航HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码下载 2024个人导航HTML源码

进军俄罗斯市场,一站式Yandex广告开户与代运营服务

俄罗斯作为欧洲最大的经济体之一&#xff0c;拥有庞大的消费者群体和独特的市场环境&#xff0c;成为了众多国际商家关注的焦点。要有效地触达这片潜力无限的市场&#xff0c;精准且高效的网络营销策略至关重要。利用Yandex——俄罗斯最大的搜索引擎与数字广告平台&#xff0c;…