c# npoi操作excel

  1. 今天在弄使用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) {}

        }

  1. 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的

  1. Cell样式

注意style通过workbook.createStyle(),而不是通过其他获得

有的api有font.isBold =true;但是我这个没有只有通过font.BoldWeight=800来设置,注意是对每一个cell来设置样式 cell.cellStyle= style;也就是for循环行和列来设置样式,

  1. 合并单元格

只需要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);
            }
        }

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

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

相关文章

力扣 LeetCode 235. 二叉搜索树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归 递归法没有中的逻辑 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return recur(root, p, q);}public TreeNode recur(TreeNode root, TreeNode p, TreeNode q) {if (root…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限&#xff0c;并且插入和删除操作效率低的问题 1.2概念 链表&#xff1a;链式存储的线性表&#xff0c;使用随机物理内存存储逻辑上连续的数据 链表的组成&#xff1a;由一个个结点组成 结点&#xff1a;由数据域和链接域组成&a…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Flink Lookup Join(维表 Join)

Lookup Join 定义&#xff08;支持 Batch\Streaming&#xff09; Lookup Join 其实就是维表 Join&#xff0c;比如拿离线数仓来说&#xff0c;常常会有用户画像&#xff0c;设备画像等数据&#xff0c;而对应到实时数仓场景中&#xff0c;这种实时获取外部缓存的 Join 就叫做维…

LeetCode 101题集(随时更新)

题集来源&#xff1a;GitHub - changgyhub/leetcode_101: LeetCode 101&#xff1a;力扣刷题指南 使用C完成相关题目&#xff0c;以训练笔试 贪心 采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候&#xff0c;需要用到百度站长平台&#xff08;资源平台&#xff09;的工具&#xff0c;在站长工具中【普通收录】-【资源提交】-【API提交】这个功能&#xff0c;对网站的抓取进行一个提交。 这里估计很多站长就有疑问&#xff0c;如果我主动推送&#xf…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具&#xff0c;是由JAVA开发而成 2. Jenkins是一个调度平台&#xff0c;本身不处理任何事情&#xff0c;调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature&#xff0c;AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了&#xff0c;这次瞄准了量子计算领域。 今天凌晨&#xff0c;新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

Unable to find image ‘hello-world:latest‘ locally

网上对于这个问题的解答有很多了&#xff0c;我尝试了后并有解决&#xff0c;最后发现重启指令并没有使用sudo导致的。这里写一下总的解决方法&#xff1a; 1 查看是否已经有了hello-world sudo docker info如果有hello-world&#xff0c;就先删除 sudo docker rmi hello-w…

Web3.0安全开发实践:Clarity最佳实践总结

在过去的一段时间里&#xff0c;CertiK团队对比特币生态系统及其发展进行了深入研究。同时&#xff0c;团队还审计了多个比特币项目以及基于不同编程语言的智能合约&#xff0c;包括OKX的BRC-20钱包和MVC DAO的sCrypt智能合约实现。 现在&#xff0c;我们的研究重点转向了Clar…

Chrome离线安装包下载

1、问Chrome的官网&#xff1a;https://www.google.cn/chrome/ 直接下载的是在线安装包&#xff0c;安装需要联网。 2、如果需要在无法联网的设备上安装Chrome&#xff0c;需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址&#xff1a;https://www.google.c…

【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏

给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中&#xff0c;Alice 可以从 nums 中选择所有个位数 或 所有两位数&#xff0c;剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和&#xff0c;则 Alice 获胜。 如果 Alice 能赢得这场游…

前端速通(JavaScript)

1 初识JavaScript 1 JavaScript是什么 JavaScript 是一种高层的、轻量级的、解释型的编程语言&#xff0c;最初由 Netscape 公司于 1995 年开发。它的特点包括&#xff1a; 动态性&#xff1a;JavaScript是动态类型语言&#xff0c;允许开发者灵活地操作数据。跨平台&#xf…

分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下&#xff0c;IM 系统采用分层架构方式&#xff0c;如下图。 分层架构的 IM 系统&#xff0c;整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】&#xff0c;我们在上篇文章&#xff08;分层架构 IM 系…

基于ToLua的C#和Lua内存共享方案保姆级教程

C#和Lua内存共享方案保姆级教程 前言 在介绍C#和Lua内存共享方案之前,先介绍下面两个点来支撑这个方案的必要性 跨语言交互很费 Lua和C#交互最早是基于反射的方式实现的,后来为了提升性能发展成Luajit+C#静态方法导出注入到lua虚拟机的方式至此Lua+Unity的性能才达到了实…

SpringSecurity创建一个简单的自定义表单的认证应用

1、SpringSecurity 自定义表单 在 Spring Security 中创建自定义表单认证应用是一个常见的需求&#xff0c;特别是在需要自定义登录页面、认证逻辑或添加额外的表单字段时。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义表单认证应用。 2、基于 SpringSecurity 的…

创客匠人老蒋:个人IP如何获取有效流量?

大家好&#xff0c;我是老蒋。 为什么我反复强调说&#xff0c;如果你想把个人IP、创始人IP做起来&#xff0c;想把自己直播间的流量变大变活&#xff0c;一定要去参加这场将在2024年底举办的《全球创始人IP领袖高峰论坛》&#xff1f;一定要走出去看看更高的世界&#xff1f;…