c#与NPOI

news2024/12/23 0:28:47

简介

操作指南
某些API参考
视频讲解
完整代码
1、简介

  • NPOI是源于一个用于读取xls,doc,ppt文档的POI 项目,POI是Java项目,后面因为有.Net的市场,于是将POI移植到.Net上。
  • Npoi 可以在没有安装Office 的情况写 对 Word 或 Excel 文档进行读写操作。另外一种方法是使用.NET自带的excel API,但是这种方法需要运行环境安装微软的excel才行。
  • NPOI尤其适合在服务器端生成数据文件!因为服务器一般是不安装office这么庞大的办公软件的

2、名词介绍

  • 整个Excel:工作簿
  • Sheet页:页签,一个工作簿中可以包含多个Sheet页
  • 表格: 对应一个Sheet
  • 行、列、单元格

3、C#中的常规操作:

  • 导出一个Excel:其实就是要生成一个Excel文件,Excel文件对应的文件流
  • 导入一个Excel:读取一个文件,读取文件流,需要从文件流中读取我们需要的各种数据,解析Excel的数据

4、安装
在这里插入图片描述

5、细节

  • 里面的行列都是从0开始计数的,也即第一行和第一列都是0(但是表格中写的是1开始)
  • 注意操作每个步骤的时候要创建、写入、然后关闭文件流

生成

在这里插入图片描述

在这里插入图片描述

主函数

        private void creatBut_Click(object sender, EventArgs e)
        {
            IWorkbook workbook = ExcelOperationHelper.CreateExcelWorkbook();
            FileStream file = new FileStream("E:\\StudyData_ele\\testnew\\NPOI\\Test.xls", FileMode.Create);
            workbook.Write(file);
            file.Close();
        }

类库

        /// <summary>
        /// 创建一个ExcelWorkbook
        /// </summary>
        /// <returns></returns>
        public static IWorkbook CreateExcelWorkbook()
        {
            HSSFWorkbook _Workbook = new HSSFWorkbook();
            ISheet sheet1 = _Workbook.CreateSheet("Sheet1");
            //创建第一行
            {
                IRow Row0 = sheet1.CreateRow(0);
                MessageBox.Show("row:" + Row0);

                ICell cell = Row0.CreateCell(0);
                cell.SetCellValue("姓名");
                ICell cel2 = Row0.CreateCell(1);
                cel2.SetCellValue("成绩");
            }
            //创建第二行
            {
                IRow Row1 = sheet1.CreateRow(1);

                ICell cell = Row1.CreateCell(0);
                cell.SetCellValue("王刚");
                ICell cel2 = Row1.CreateCell(1);
                cel2.SetCellValue("70");
            }
            return _Workbook;
        }

获取数据

在这里插入图片描述
在这里插入图片描述

读取Excel

      //读取 Excel 文件
        public IWorkbook ReadWorkbook = null;
        public string FilePath = "E:\\StudyData_ele\\testnew\\NPOI\\Test.xls";//输错地址会报错
        private void read_Click(object sender, EventArgs e)
        {
            // 获取扩展名
            string ExtensionName = System.IO.Path.GetExtension(FilePath);
            // 文件流
            FileStream FileStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite);
            // 把xls写入workbook中 2003版本
            if (ExtensionName.Equals(".xls"))
            {
                ReadWorkbook = new HSSFWorkbook(FileStream);
            }
            // 把xlsx 写入workbook中 2007版本
            else if (ExtensionName.Equals(".xlsx"))
            {
                ReadWorkbook = new XSSFWorkbook(FileStream);
            }
            else
            {
                ReadWorkbook = null;
            }
            FileStream.Close();
        }

读取sheet

      //获取 Sheet
        public List<ISheet> Sheets = null;
        ISheet sheet1;
        ISheet sheet2;
        private void button1_Click(object sender, EventArgs e)
        {
            // 获取所有sheet
            Sheets = new List<ISheet>();
            var SheetCount = ReadWorkbook.NumberOfSheets;
            for (int i = 0; i < SheetCount; i++)
            {
                Sheets.Add(ReadWorkbook.GetSheetAt(i));
            }

            //获取单个sheet
            //1、通过sheetName获取sheet
             sheet1 = ReadWorkbook.GetSheet("Sheet1");

            // 2、a通过Sheet 名获取 Sheet数组对应的下标;
            int sheetIndex = ReadWorkbook.GetSheetIndex("光照度");
            //    b 通过 Sheet下标获取 对应的 Sheet 数据
             sheet2 = ReadWorkbook.GetSheetAt(sheetIndex);

        }

读取sheet数据

        //读取 Sheet 数据
        private void button2_Click(object sender, EventArgs e)
        {
            if (Sheets == default)
            {
                return ;
            }
            IRow row;
            // 1. 获取行数
            var rowCount = sheet1.LastRowNum;
            //因为Excel表中是从1开始的,而这个是从0开始的,所以行数比Excel中的行数值少1
            log.SaveLog("rowCount:" + rowCount);

            // 从第2行(下标为1)开始获取数据,第一行是表头
            // 如果从第一行开始,则i=0就可以了
            for (int i = 1; i <= rowCount; i++)
            {
                //var dataTable = new DataTable_Model();
                // 获取具体行
                row = sheet1.GetRow(i);
                //都打印了这个row:NPOI.HSSF.UserModel.HSSFRow
                log.SaveLog("row:"+row);
                if (row != null)
                {
                    // 2. 获取行对应的列数
                    var column = row.LastCellNum;
                    //计数到最后出现数据的那一列
                    log.SaveLog("column:" + column);
                    for (int j = 0; j < column; j++)
                    {
                        // 3. 获取某行某列对应的单元格数据
                        var cellValue = row.GetCell(j).ToString();
                        // 4. 输出单元格数据        
                        log.SaveLog(cellValue + " ");
                    }
                }
            }
        }

写入数据

在这里插入图片描述

在这里插入图片描述

修改某个数据

使用该方法,xls可以正常使用,但是xlsx不知道怎么使用玩了无法打开,但是确实可以更改了,因为我再点击插入图片就可以了。不知道为什么,但是另存为就不会出问题。可以打开

        //修改单元格数据
        private void button3_Click(object sender, EventArgs e)
        {
            // 创建文件流
            FileStream fsWrite = new FileStream(FilePath, FileMode.Open, FileAccess.Write);
            try
            {
                // 1. 通过Sheet名 获取对应的ISeet--其中 ReadWorkbook 为读取Excel文档时获取
                var sheet = ReadWorkbook.GetSheet("光照度");
                // 2. 获取行数
                int rowCount = sheet.LastRowNum;
                for (int i = 0; i < rowCount; i++)
                {
                    // 3. 获取行对应的列数
                    int columnount = sheet.GetRow(i).LastCellNum;
                    for (int j = 0; j < columnount; j++)
                    {
                        // 4. 获取某行某列对应的单元格数据
                        // 其中第一行设计为表头,故i+1,从第二行开始,这里可以自己定义
                        var sheetCellValue = sheet.GetRow(i + 1).GetCell(j);
                        if (sheetCellValue == null)
                        {
                            //创建第一行
                            {
                                IRow row = sheet.GetRow(i + 1);//这样就是插入了
                                // 为第一列设置文本 这里的列也是从0开始的
                                row.CreateCell(j).SetCellValue("空");
                            }
                        }
                        //碰到a改成这样 碰到aa也是不变的
                        else if (sheetCellValue.ToString() == "a")
                        {
                            sheetCellValue.SetCellValue("原本为a" );
                        }
                        else
                        {
                            //如果某个内容为空 还用了下面这句话 那么就会报错:
                            //未将对象引用设置到对象的实例
                            // 5. 向单元格传值,以覆盖对应的单元格数据
                            sheetCellValue.SetCellValue(sheetCellValue + "更新");
                        }

                    }
                }
                // 6. 对 Workbook 的修改写入文件流,对文件进行相应操作
                // 6. 对 Workbook 的修改写入文件流,对文件进行相应操作
                FileStream file = new FileStream("C:\\log\\new.xlsx", FileMode.CreateNew, FileAccess.Write);//这是要保存的地址
                ReadWorkbook.Write(file);
                ReadWorkbook.Write(fsWrite);
                file.Close();


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // 7. 关闭文件流:报不报错都关闭
                fsWrite.Close();
            }
        }

插入一行

      private void button4_Click(object sender, EventArgs e)
        {
            // 创建文件流
            FileStream fsWrite = new FileStream(FilePath, FileMode.Open, FileAccess.Write);
            try
            {
                // 1. 通过Sheet名 获取对应的ISeet--其中 ReadWorkbook 为读取Excel文档时获取
                var sheet = ReadWorkbook.GetSheet("光照度");
                // 2. 获取行数
                int rowCount = sheet.LastRowNum;
                //MessageBox.Show(rowCount.ToString());
                // 3、获取列数 列数也是从0开始的
                int columnount =3;            
                //创建第一行
                {
                    IRow Row0 = sheet.CreateRow(rowCount+1);

                    
                    for (int j = 0; j < columnount; j++)
                    {
                        ICell cell = Row0.CreateCell(j);
                        cell.SetCellValue("111");
                    }

                }
     
                
                // 6. 对 Workbook 的修改写入文件流,对文件进行相应操作
                ReadWorkbook.Write(fsWrite);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                // 7. 关闭文件流:报不报错都关闭
                fsWrite.Close();
            }
        }
    }

插入图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

        //插入图片 注意要用xlsx格式
        private void button5_Click(object sender, EventArgs e)
        {
            // 创建文件流
            FileStream fsWrite = new FileStream(FilePath, FileMode.Open, FileAccess.Write);

            // 第一步:读入图片数据
            byte[] bytes = System.IO.File.ReadAllBytes(@"E:\StudyData_ele\testnew\NPOI\12.png");
            //图片大小(不是图片占用字节)
            //MessageBox.Show("bytes.Length:" + bytes.Length.ToString());

            // 2.向Excel添加图片,获取到图片索引
            int picIdx = ReadWorkbook.AddPicture(bytes, PictureType.PNG);
            // 3.构建Excel图像
            sheet1 = ReadWorkbook.GetSheet("Sheet1");
            // 获取第二行,第一行是标题
            //IRow row = sheet1.CreateRow(1);//这个是新创建一行 原本第二行都没有了
            IRow row = sheet1.GetRow(1);//这样就是插入了
            // 为第一列设置文本 这里的列也是从0开始的
            row.CreateCell(1).SetCellValue("测试图片");
            // 设置行高和列宽
            //sheet1.SetColumnWidth(1, 413 * 32);   // Excel的宽将1个像素分为32份
            //row.Height = (short)(891 * 16);      // Excel的高将1个像素分为16份

            var drawing = sheet1.CreateDrawingPatriarch();
            // 4.确定图像的位置
            // new XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2)
            // 前四个参数是单元格内的偏移量,这里需要填满整个单元格所以不设置。
            // col1,row1表示图片的左上角在哪个单元格的左上角;col2,row2表示图片的右下角在哪个单元格的左上角
            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, 1, 1, 4, 4);
            // 5.将图片设置到上面的位置中
            drawing.CreatePicture(anchor, picIdx);

            // 6. 对 Workbook 的修改写入文件流,对文件进行相应操作
            ReadWorkbook.Write(fsWrite);

            // 7. 关闭文件流:报不报错都关闭
            fsWrite.Close();
        }

另存为

在这里插入图片描述

            // 创建文件流 这个是打开的源文件
            FileStream fsWrite = new FileStream(FilePath, FileMode.Open, FileAccess.Write);
			/*
					.................
			*/
            // 6. 对 Workbook 的修改写入文件流,对文件进行相应操作
            FileStream file = new FileStream("C:\\log\\new.xlsx", FileMode.CreateNew, FileAccess.Write);//这是要保存的地址
            ReadWorkbook.Write(file);

            // 7. 关闭文件流:报不报错都关闭
            file.Close();
            fsWrite.Close();

报错

Wrong Local header signature: 0xE011CFD0

文件应该是直接创建为后缀xlsx,而不是创建完成后改为这个。这样就会报错了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《如何向ChatGPT提问并获得高质量的答案》—Prompt技术的完整指南

本教程收集于:AIGC从入门到精通教程 目录 第1章:提示工程技术简介 第2章:说明提示技术(Instructions Prompt Technique)

OpenPCDet系列 | 5.3 PointPillars算法——BaseBEVBackbone伪图像特征提取模块

文章目录 BaseBEVBackbone模块1. BaseBEVBackbone初始化2. BaseBEVBackbone前向传播 OpenPCDet的整个结构图&#xff1a; BaseBEVBackbone模块 在进行了bev视图的特征转换后&#xff0c;随后进行backbone2d模块进行进一步的特征处理&#xff0c;在PointPillars中选择的是Bas…

AI绘画小程序开发流程

最近市场上出现了很多AI绘画的小程序和APP&#xff0c;这些小程序使用起来非常方便&#xff0c;用户体验也不错&#xff0c;可以解决一部分用户的实际需求。今天和大家分享如何开发一个AI类的绘画小程序以及要注意的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公…

电脑蓝屏怎么U盘重装系统详细图文教学

电脑蓝屏怎么U盘重装系统详细图文教学。很多用户遇到电脑蓝屏的问题之后&#xff0c;不懂怎么去进行问题的解决。蓝屏问题其实自己制作一起启动盘就可以轻松的解决问题了。一起来看看以下的详细处理方法分享吧。 准备工作&#xff1a; 1、U盘一个&#xff08;尽量使用8G以上的U…

如何获取和制作免费的icon图标素材

icon 图标在界面设计中虽然占比不大&#xff0c;但却是不可缺少的设计元素之一。设计师通过 icon 图标&#xff0c;将抽象的概念通俗化&#xff0c;降低用户理解某个操作的难度。而设计师也会通过改变 icon 图标的样式来展现整体界面的视觉效果。icon 图标的风格有很多&#xf…

Linux gdb调试

使用gdb进行调试 我们将使用GNU的调试器gdb调试这个程序。gdb是一个功能很强大的调试器&#xff0c;它是一个自由软件&#xff0c;能够用在许多UNIX平台上。它同时也是Linux系统中的默认调试器。gdb已被移植到许多其他的计算机平台上&#xff0c;并且能够用于调试嵌入式实时系统…

(转载)从0开始学matlab(第6天)—数据文件与运算

1数据文件 有许多的方法用于加载和保存 MATLAB 的数据文件&#xff0c;这些方法后面进行介绍。在这里我们只向大家介绍最简单的 save 和 load 命令。 save 命令用于保存当前 MATLAB 工作区内的数据到一个硬盘文件。这个命令的基本形式如下 save filename var1 var2 var3 …

《拥抱AGI时代,电信日前省级电信公司的一次“非电信”培训》

数字信息基础设施是数字中国的关键底座&#xff0c;打通数字基础设施大动脉&#xff0c;建设数字中国成为推进中国式现代化的重要引擎。作为算力时代的探险家&#xff0c;出海浪潮的逐浪人&#xff0c;中国电信正全面融入数字经济建设大局&#xff0c;展现出新发展新格局下央企…

飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?

之前小编为大家介绍过在飞凌嵌入式i.MX6ULL开发板上操作GPIO的方法。本期&#xff0c;让我们一起走近i.MX9352处理器&#xff0c;深入了解这位i.MX系列新成员的GPIO该如何操作&#xff0c;以及它与前辈i.MX6ULL处理器又有哪些异同。 01 硬件原理分析 以点灯和按键为例&#xf…

也谈零基础学编程,需要学什么

也谈零基础学编程&#xff0c;需要学什么 零基础人群语法1、注释2、变量2.1 变量命名2.2 数据类型2.3 类型强度 3、 运算符4、流程控制与代码块5、函数和方法6、类 算法学会使用第三方库小结 零基础人群 现在开发语言各种各样&#xff0c;越来越多&#xff0c;尤其是 python &…

算法训练-双指针

双指针 同向双指针3. 无重复字符的最长子串209. 长度最小的子数组713. 乘积小于 K 的子数组 相向双指针167. 两数之和 II - 输入有序数组15. 三数之和438. 找到字符串中所有字母异位词 滑动窗口接雨水 同向双指针 3. 无重复字符的最长子串 题目链接 class Solution { public:…

09——svg中path的使用

一、path 是 svg 中最强大的图形 用于定义一个 路径所有命令均允许小写字母。大写 表示绝对定位&#xff0c;小写 表示 相对定位 &#xff08;相对于上一个结束的坐标&#xff09;d 属性中包含所有路径的点&#xff0c;可根据命令缩写 自由组合 命令 名称 …

阿里云备案服务码是什么?备案服务码申请及限制说明

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

【刷题之路Ⅱ】LeetCode 475. 供暖器

【刷题之路Ⅱ】LeetCode 475. 供暖器 一、题目描述二、解题1、方法1——排序后二分法1.1、思路分析1.2、代码实现 2、方法2——排序后双指针2.1、思路分析2.2、代码实现 一、题目描述 原题连接&#xff1a; 475. 供暖器 题目描述&#xff1a; 冬季已经来临。 你的任务是设计一…

怎样能把两张照片拼成一张图片,5种工具分享

怎样能把两张照片拼成一张图片&#xff1f;图片拼合的应用场景是很多的。比如将几张相册中的照片拼成一张合影、将多个地图截图拼合在一起形成一个更大的区域地图、将多个漫画图像合并成一本漫画册等。这项技术可以方便地将多张图片整合为一张&#xff0c;节省时间和精力。 因此…

ThinkPHP6布局的方式之模板布局,全局配置方式,模板标签方式,动态方法布局

ThinkPHP6布局的方式之模板布局 ThinkPHP的模板引擎内置了布局模板功能支持&#xff0c;可以方便的实现模板布局以及布局嵌套功能。 有三种布局模板的支持方式&#xff1a;全局配置方式&#xff0c;模板标签方式&#xff0c;动态方法布局。 第一种方式&#xff1a;全局配置方…

有价值项目分享,缺项目可直接搜索(持续更新中)

​近来统计一下最近发的一些资源&#xff0c;包括CSDNB站微信公众号三个平台&#xff0c;仅包括Java资源&#xff08;SSMSpringBootuniapp&#xff09;、部分硬件、安卓资源&#xff0c;一共30758492588275个&#xff0c;可覆盖95%的毕业题目&#xff0c;大家可在相关归档内获取…

2023 年破解 PDF 密码的 5 种最佳方法

世界越来越依赖数字文档和信息存储。最流行和广泛使用的数字文档文件格式之一是便携式文档格式 (PDF)。PDF 文件用途广泛、可靠&#xff0c;并提供高级别的安全性以保护敏感信息免遭未经授权的访问。保护 PDF 的一种常用方法是通过密码保护。在这篇博文中&#xff0c;我们将讨论…

从SRM到采购供应链,云时通SRM助力东明实现采购数字化再升级!

随着制造业不断向高端跃升&#xff0c;十年来&#xff0c;中国制造企业早已具备全球领先水平。而引领制造业向数字化、网络化、智能化转型升级&#xff0c;是中国智造进一步跨越的关键。 1995年&#xff0c;浙江东明不锈钢制品股份有限公司(以下简称“东明”)成立&#xff0c;作…

超细!从零安装压测工具 jmeter(附JDK下载安装教程,20230516的JDK8最新版)

两步走&#xff0c;安装 JDK 和 jmeter&#xff0c;如果安装了JDK的同志可以直接看第二步。 针对的操作系统&#xff1a;Windows。 下载JDK 官网指路&#xff08;处于稳定性考虑&#xff0c;安装的JDK8&#xff09;&#xff1a; Java Downloads | Oraclehttps://www.oracle.c…