c# npoi操作excel
- 今天在弄使用npoi对excel表的操作,遇到个问题就是使用workbook通过filestream打开后,让后workbook.write(filestream)居然报文件流关闭了,无法写入,弄了好久都不行,最后通过写2个excel文件来解决,现在看来我使用 HSSFWorkbook workbook = new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite));这种读写模式有问题,使用这种 using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read));既可以读,又可以写。
public void AppendDataToExistingExcel(string filePath)
{
try
{
IWorkbook workbook;
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
workbook = filePath.EndsWith(".xlsx") ? (IWorkbook)new XSSFWorkbook(stream) : new HSSFWorkbook(stream);
}
var sheet = workbook.GetSheetAt(0);
int lastRowNum = sheet.LastRowNum;
sheet.GetRow(0).CreateCell(0).SetCellValue("hahaha");
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Write))
{
workbook.Write(stream);
}
}
catch (Exception ex) {}
}
- Npoi的操作
New一个workbook,workbook通过createSheet()或者getSheetAt(index)获取sheet页面
sheet通过createRow(rowIndex)或者getRow(indexIndex),获取或者创建行
Sheet.lastRownum可以获取所有行
IRow row = sheet.createRow(rowIndex);获取行
Row.capacity 或者row.cells.count获取每一行的列个数,注意的是没有sheet的列个数,只有行的列个数
当向一个行中的一个单元格写数据的时候row.createCell(colIndex),cell.setCellValue(),如果没有向一个单元格写过数据,那么row.getCell()会返回null的
- Cell样式
注意style通过workbook.createStyle(),而不是通过其他获得
有的api有font.isBold =true;但是我这个没有只有通过font.BoldWeight=800来设置,注意是对每一个cell来设置样式 cell.cellStyle= style;也就是for循环行和列来设置样式,
- 合并单元格
只需要new CellRangeAddress()即可,然后sheet.addMergendRegion(cellRangeAddress),这样就合并了,但是合并后,需要写入信息,以及重新设置样式
public class WZExcelUtil
     {
         /// <summary>
         /// 设置一般表格样式
         /// </summary>
         /// <param name="workbook"></param>
         /// <param name="sheetIndex"></param>
         public void setNormalCellStyle(IWorkbook workbook, int sheetIndex)
         {
            ICellStyle style = workbook.CreateCellStyle();
             var font = workbook.CreateFont();
             font.FontHeightInPoints = 12;
             //font.FontName = "Arial";
             font.FontName = "仿宋";
             style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
             style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
             style.SetFont(font);
            ISheet sheet = workbook.GetSheetAt(sheetIndex);
             int rowNum = sheet.LastRowNum;
             for (int rowIndex = 0; rowIndex < rowNum + 1; rowIndex++)
             {
                 IRow row = sheet.GetRow(rowIndex);
                 //int cols = row.Cells.Capacity;
                 int cols = row.Cells.Count;
                 for (int colIndex = 0; colIndex < cols; colIndex++)
                 {
                     var cell = sheet.GetRow(rowIndex).GetCell(colIndex);
                     cell.CellStyle = style;
                     sheet.SetColumnWidth(colIndex, 15 * 256); // 设置第 1 列宽度为 20
                 }
                 row.HeightInPoints = 25; // 设置行高为 25 点
             }
         }
        /// <summary>
         /// 设置title表格样式
         /// </summary>
         /// <param name="workbook"></param>
         /// <param name="sheetIndex"></param>
         /// <param name="headTitleIndex"></param>
         public void setHeadTitleStyle(IWorkbook workbook, int sheetIndex, int headTitleIndex)
         {
             ISheet sheet = workbook.GetSheetAt(sheetIndex);
            ICellStyle style = workbook.CreateCellStyle();
             var font = workbook.CreateFont();
             font.FontHeightInPoints = 14;
             //font.FontName = "Arial";
             font.FontName = "仿宋";
             font.Boldweight = 800;
             style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
             style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
             style.SetFont(font);
            IRow headRow = sheet.GetRow(headTitleIndex);
             int cols = headRow.Cells.Count;
             for (int colIndex = 0; colIndex < cols; colIndex++)
             {
                 var cell = headRow.GetCell(colIndex);
                 cell.CellStyle = style;
             }
         }
        /// <summary>
         /// 设置合并单元格
         /// </summary>
         /// <param name="workbook"></param>
         /// <param name="sheetIndex"></param>
         /// <param name="picTitleRowIndex"> 内容行索引 </param>
         /// <param name="picTitleColIndex"> 内容列索引</param>
         /// <param name="titleInfo"> 显示信息</param>
         /// <param name="firstRow"></param>
         /// <param name="lastRow"></param>
         /// <param name="firstCol"></param>
         /// <param name="lastCol"></param>
         private void setMergeInfo(IWorkbook workbook, int sheetIndex, int picTitleRowIndex, int picTitleColIndex, string titleInfo,
             int firstRow, int lastRow, int firstCol, int lastCol)
         {
             ISheet sheet = workbook.GetSheetAt(sheetIndex);
             CellRangeAddress cellRangeAddress = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
             sheet.AddMergedRegion(cellRangeAddress);
             //sheet.GetRow(picTitleRowIndex).GetCell(picTitleColIndex).SetCellValue(titleInfo);
             IRow row = sheet.GetRow(picTitleRowIndex);
             ICell cell = row.CreateCell(picTitleColIndex); ///getCell(picTitleColIndex);失败,需要create
             cell.SetCellValue(titleInfo);
            ICellStyle style = workbook.CreateCellStyle();
             var font = workbook.CreateFont();
             font.FontHeightInPoints = 14;
             //font.FontName = "Arial";
             font.FontName = "仿宋";
             font.Boldweight = 800;
             style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
             style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
             style.SetFont(font);
             cell.CellStyle = style;
}
         private void insertPic(IWorkbook workbook, ISheet sheet,string picpath,int rowleft,int rowright,int colleft,int colright)
         {
             //string picpath = "C:\\Users\\wangzg\\Desktop\\ceshi.png";
            //第一步 获取图片bytes字节
             byte[] bytes = File.ReadAllBytes(picpath);
            //第二步 确定图片索引,注意图片类型
             int ip = workbook.AddPicture(bytes, PictureType.PNG);
             //第三步 创建画布
             IDrawing drawing = sheet.CreateDrawingPatriarch();
             //第三步 创建锚点
             IClientAnchor anchor = workbook.GetCreationHelper().CreateClientAnchor();
             //第四步 设置锚点左上角  右下角 也就是图片的大小,不过是通过左上点  和右下点来得到的
             //anchor.Row1 = 2;
             //anchor.Col1 = 1;
             //anchor.Row2 = 12;
             //anchor.Col2 = 12;
             anchor.Row1 = rowleft;
             anchor.Col1 = colleft;
             anchor.Row2 = rowright;
             anchor.Col2 = colright;
             //第五步 把图片插入到相应位置
             IPicture picture = drawing.CreatePicture(anchor, ip);
        }
     }
private void button12_Click(object sender, EventArgs e)
         {
             try
             {
                 string[] headtitle = { "aaaa", "bbb", "ccc", "ddd", "eee" };
                 List<List<string>> lists = new List<List<string>>();
                 string target = "C:\\Users\\wangzg\\Desktop\\112_4.xls";
                 IWorkbook workbook = target.EndsWith(".xlsx") ? (IWorkbook)new XSSFWorkbook() : new HSSFWorkbook();
                 ISheet sheet = workbook.CreateSheet("taoya");
int headTitleRowIndex = 15;
                for (int i = 0; i < 15; i++) {
                     sheet.CreateRow(i);
                 }
                //表头
                 IRow headRow = sheet.CreateRow(headTitleRowIndex);
                 for (int i = 0; i < headtitle.Length; i++)
                 {
                     headRow.CreateCell(i).SetCellValue(headtitle[i]);
                 }
                 //列值
                 for (int i = 0; i < 10; i++)
                 {
                     List<string> oil = new List<string>();
                     oil.Add("aa" + i);
                     oil.Add("bb" + i);
                     oil.Add("cc" + i);
                     oil.Add("dd" + i);
                     oil.Add("ee" + i);
                     lists.Add(oil);
                 }
                for (int i = 0; i < lists.Count; i++)
                 {
                     IRow row = sheet.CreateRow(sheet.LastRowNum + 1);
                     List<string> objs = lists[i];
                     for (int j = 0; j < headtitle.Length; j++)
                     {
                         row.CreateCell(j).SetCellValue(objs[j]);
                     }
                 }
                setNormalCellStyle(workbook, 0);
                 setHeadTitleStyle(workbook, 0, headTitleRowIndex);
                 setMergeInfo(workbook, 0,1,1, "aaaa");
                 insertPic(workbook, workbook.GetSheetAt(0));
                 using (var stream = new FileStream(target, FileMode.Create, FileAccess.Write))
                 {
                     workbook.Write(stream);
                 }
                MessageBox.Show("ok");
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
         }
相关文章:
c# npoi操作excel
今天在弄使用npoi对excel表的操作,遇到个问题就是使用workbook通过filestream打开后,让后workbook.write(filestream)居然报文件流关闭了,无法写入,弄了好久都不行,最后通过写2个excel文件来解决,现在看来我…...
十二:HTTP错误响应码:理解与应对
在现代网络技术中,HTTP(超文本传输协议)是浏览器与服务器之间沟通的基础。每当我们访问网站或发送请求,HTTP会返回一个响应码,这些代码不仅可以表示成功,还可以指示各种问题。本文将以HTTP错误响应码为主题,探讨其含义、常见类型及应对措施。 1. 400 Bad Request - 请求…...
Rust学习(六):函数式编程
Rust学习(六):函数式编程 我们在前一篇博客中已经介绍了如何通过trait和impl实现Rust的面向对象编程,但是Rust本身实际上并不提倡通过类来解决问题。Rust推崇的是函数式编程,强调将函数作为参数值或者其他函数的返回值…...
 
使用 Vue 和 Create-Vue 构建工程化前端项目
目录 前言1. 工程化的意义与 Vue 的生态支持2. 搭建 Vue 工程化项目2.1 环境准备2.2 使用 create-vue 创建项目2.2.1 初始化项目2.2.2 安装依赖2.2.3 本地运行 3. Vue 项目的目录结构解析4. Vue 开发流程详解4.1 项目入口与根组件4.1.1 main.js 的作用4.1.2 App.vue 的结构 4.2…...
opencv图片明暗度判断方法
OpenCV 的LAB 颜色空间(也称为 CIELAB)是一种颜色对手的颜色模型,它旨在模仿人类的色彩感知。LAB 颜色空间由三个分量组成: L: 亮度分量 (Lightness),范围从 0(黑色)到 100(白色&…...
 
QT6学习第三天
QT6学习第三天 第一个Widgets项目创建项目项目界面简单介绍编译文件介绍 我在第一天中将重点标了颜色,后边我把一些简单的东西都不写了,写了的都是实际用的东西,就不标颜色了。 第一个Widgets项目 首先我们创建一个widgets项目,…...
 
计算机网络-MSTP基础实验一(单域多实例)
前面我们已经大致了解了MSTP的基本概念和工作原理,但是我自己也觉得MSTP的理论很复杂不结合实验是很难搞懂的,今天来做一个配套的小实验以及一些配置命令。 一、网络拓扑 单域多实例拓扑 基本需求:SW1为VLAN10的网关,SW2为VLAN20的…...
React合成事件及其核心思想详解
相关联Javascript知识 1.JavaScript 的事件流 事件流是 JavaScript 处理事件的机制,它描述了事件从发生到被处理的过程。事件流主要包括两个阶段:捕获阶段和冒泡阶段。在捕获阶段,事件从文档的根元素开始,逐层向下传播到目标元素&…...
 
Datawhale模型减肥秘籍Tasking之模型量化
Datawhale模型减肥秘籍Tasking之模型量化 什么是量化?为什么量化?量化基本方法基于k-means的量化线性量化 训练后量化量化粒度动态量化参数的计算 ( Cliping )指数移动平均(EMA)Min-MaxKL 量化均方误差(MSE)…...
 
在云服务器搭建 Docker
操作场景 本文档介绍如何在腾讯云云服务器上搭建和使用 Docker。本文适用于熟悉 Linux 操作系统,刚开始使用腾讯云云服务器的开发者。如需了解更多关于 Docker 相关信息,请参见 Docker 官方。 说明: Windows Subsystem for Linuxÿ…...
 
Redis 的代理类注入失败,连不上 redis
在测试 redis 是否成功连接时,发现 bean 没有被创建成功,导致报错 根据报错提示,需要我们添加依赖: <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>&l…...
 
版本控制【Git Bash】【Gitee】
目录 一、什么是版本控制? 二、版本控制的种类: 1、本地版本控制 2、集中版本控制 3、分布式版本控制 三、下载Git Bash 四、Git Bash 配置 五、Git Bash使用 1、切换目录:cd 2.查看当前文件路径:pwd 3.列出当前目录下文件…...
 
Neo4j Desktop 和 Neo4j Community Edition 区别
Neo4j Desktop 和 Neo4j Community Edition 的主要区别在于它们的用途、功能以及安装和管理方式。以下是这两者的详细对比: 1. Neo4j Desktop Neo4j Desktop 是一个图形化的桌面应用程序,主要为开发人员和个人使用提供了一个便捷的环境来安装、管理和运…...
 
使用uniapp开发微信小程序使用uni_modules导致主包文件过大,无法发布的解决方法
在使用uniapp开发微信小程序时候,过多的引入uni_modules的组件库,会导致主包文件过大,导致无法上传微信小程序,主包要求大小不超过1.5MB.分包大小每个不能超过2M。 解决方法:分包。 1.对每个除了主页面navbar的页面进…...
 
HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)事件推荐开发者测试
意图框架向开发者提供真机测试能力,即开发者可连接设备进行调测。开发者完成代码开发之后,功能正式上架应用市场前,可以在HarmonyOS NEXT设备上面进行自验证,打磨体验。真机测试分为三个步骤:基础信息提供,…...
GD32F103 实践-- MCU编译运行
编译 打开固件库示例工程:在SDK路径下找到固件库示例工程,路径通常是SDK\GD32F10x_Firmware_Library_Template\Keil5_project\Project 选择芯片型号:根据你的MCU型号选择,例如GD32F103RCT6 修改宏定义:根据MCU型号修…...
 
SQL复杂数据类型处理
背景 数据处理中,经常碰到复杂数据类型,需要将他们进行解析才能利用。 复杂数据类型 1、MAP结构转为列 WITH tmp AS ( SELECT {"Users":{"4418":{"UserId":4418,"Score":0,"IsStudent":true},&q…...
 
ROS第九梯:ROS+VSCode+Python+C++自定义消息发布和订阅
首先,Python版本的ROS项目和C++版本的ROS项目前期创建功能包的步骤基本一致,具体可参考第二章。 费一步:新建msg文件 在功能包(data_input)目录下创建一个msg文件夹,并在msg文件夹下创建一个名为Box的msg文件,具体如下图所示: 该msg文件为一个用于描述3D Box的文件,…...
 
【Linux】指令 + 压缩与解压
Linux 一.Linux基本指令1.grep2.zip和unzip1.Linux中的压缩文件发送Windows中2.Linux中接收Windows中压缩文件 3.tar(重要)1.Linux与Linux互传压缩文件 4.bc5.uname 二.Linux相关知识点1.Linux常用热键2.关机操作 一.Linux基本指令 1.grep 行文本过滤工…...
 
力扣(leetcode)题目总结——动态规划篇
leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏:点击进入 leetcode题目分类 关注走一波 前言:本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目,…...
 
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
 
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
 
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
 
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
 
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
 
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
 
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
 
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
 
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
