关于c#使用Npoi库的一些随笔

  • Post author:
  • Post category:其他




1.XSSFWorkbook和HSSFWorkbook的不同

二者都可以生成excel,但是格式上有所区别。

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls

XSSFWorkbook:是操作Excel2007 +的版本,扩展名是.xlsx



2.excel最后一行和最后一列的定义

可以利用下面的代码读取最后一行和某一行的最后一列,sheet是指sheet的名称。

sheet.LastRowNum
sheet.GetRow(i).LastCellNum

但是需要注意的是,最后一行检索的行数,是包括改变了行高的行数。而最后一列需要设置格式(例如内容的格式,文本、数字等,单纯改变列宽不作数)。



3. npoi对于excel的索引

行和列都从0开始。



4.excel空单元格的读取。

首先,需要改变excel单元格的格式,否则sheet.GetRow(i).GetCell(j)的时候会报错,提示没有引用对象。

第二,空单元格读取结果为空,而不是null

sheet.GetRow(i).GetCell(j).ToString()



5.excel单元格的写入

利用npoi创建一个新的sheet时,必须先createrow,在createcell,在setvalue,否则同样报错,提示没有引用对象。

XSSFWorkbook newWorkBook = new XSSFWorkbook();
ISheet newSheet = newWorkBook.CreateSheet("newsheet");
int creatRowIndex = 0;
newSheet.CreateRow(creatRowIndex);
sheet.GetRow(i).CreateCell(j).SetCellValue();



6.读取excel中的图片

需要注意的是 workbook.GetAllPictures(),可以读取所有的图片,但是在foreach中遍历的顺序与图片位置无关,只与插入excel的顺序有关

 			XSSFWorkbook workbook;
            FileStream file;
            file = new FileStream(@"E:\运输资源.xlsx", FileMode.Open, FileAccess.Read);
            workbook = new XSSFWorkbook(file);
            XSSFSheet sheet = (XSSFSheet)workbook.GetSheet("导出资源");
            System.Collections.IList pictures = workbook.GetAllPictures();
            foreach (XSSFPictureData pic in pictures)
            {
               
                string ext = pic.SuggestFileExtension();//获取扩展名
                string path = string.Empty;
                BitmapImage GeneralLayoutImage = new BitmapImage();
                GeneralLayoutImage.BeginInit();
                GeneralLayoutImage.StreamSource = new MemoryStream(pic.Data);
                GeneralLayoutImage.EndInit();
                img.Source = GeneralLayoutImage;
            }



7.npoi读取excel中的图片 (及其位置信息)

使用npoi读取excel图片,我在网上找了很久的资源,这里提供一种大概的方法,xlxs文件是可以解压的,通过解压后的drawing文件里面会有图片的关键信息,通过读取drawing.xml文件可以找到图片中的信息。

这篇博文给了一种实现方法,不过我使用的时候,在运行到npoiextend.cs类中var anchor = picture.GetPreferredSize();这一句代码时会卡主,看了下评论区其他人也有类似的问题,我才疏学浅无法解决。只能提供一个连接给大家。

https://www.cnblogs.com/hanzhaoxin/p/4442369.html


重点来了


博主自己想了想,读取图片的难点是因为图片不在excel的单元格内,他的位置信息难以获取。那么可不可以将图片放到单元格内呢,最后我想出了通过超链接的形式来实现,在excel文件中存储图片的单元格放置超链接,npoi读取该超链接连接的地址,再把图片转为二进制就能够间接实现读取excel中的图片。(由于博主自己是想读取后导入数据库中的,因此这么处理放而能加快整理导入信息的excel文件的效率)


excel的超链接处理如下


很抱歉需要遮掉一些信息,其中最后一列的信息为超链接地址,a2表示单元格a2,.png表示文件的格式。这样处理就可以了。(文件夹中需要放置名字对应的图片,我这里让图片的名字和a2单元格的文本一样)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在c#中处理下即可读取


由于博主贫穷困苦,这里放置了一个我处理的源代码连接给大家。大家可以通过连接直接下载,我也稍稍赚点积分。大家自己琢磨也可以,其实说到这里基本也就通透了。

感谢大家,多多支持

https://download.csdn.net/download/autistic_fish/13632220



版权声明:本文为autistic_fish原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。