.NetCore NPOI 读取excel内容及单元格内图片

由于数据方提供的数据在excel文件中不止有文字内容还包含图片信息,于是编写相关测试代码,读取excel文件内容及图片信息.

本文使用的是 NPOI-2.6.2 版本,此版本持.Net4.7.2;.NetStandard2.0;.NetStandard2.1;.Net6.0+。

测试文档内容,如下图:

保存后的图片:

打开图片显示正常:

编写读取数据方法,代码如:

static public DataTable ReadExcel(string filePath, string _sDirImg)
{using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)){IWorkbook workbook = null;string sExt = Path.GetExtension(filePath).ToLower();if (sExt == ".xlsx"){workbook = new XSSFWorkbook(file);//新版本的Excel(.xlsx) }else{workbook = new HSSFWorkbook(file);//老版本的Excel(.xls) }// 读取第一个 SheetISheet sheet = workbook.GetSheetAt(0);if (sExt == ".xlsx"){fnReadImageXSSF(sheet, _sDirImg);//新版本的Excel(.xlsx) }else{fnReadImageHSSF(sheet, _sDirImg);//老版本的Excel(.xls) }// 创建 DataTableDataTable dataTable = new DataTable(sheet.SheetName);// 读取表头IRow headerRow = sheet.GetRow(0);for (int i = 0; i < headerRow.LastCellNum; i++){ICell cell = headerRow.GetCell(i);dataTable.Columns.Add(cell.ToString(), typeof(string));}// 读取数据行for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++){IRow row = sheet.GetRow(rowNum);DataRow dataRow = dataTable.NewRow();for (int i = 0; i < row.LastCellNum; i++){ICell cell = row.GetCell(i);if (null == cell) continue;dataRow[i] = cell.ToString();}dataTable.Rows.Add(dataRow);}return dataTable;}
}

编写对应不同版本的excel文件,读取图片方法,读取excel .xlsx文件内图片:

/// <summary>
/// 读取excel .xlsx文件内图片
/// </summary>
/// <param name="sheet"></param>
/// <param name="_sDirImg"></param>
static public void fnReadImageXSSF(ISheet sheet, string _sDirImg)
{// 读取图像信息foreach (XSSFShape shape in ((XSSFDrawing)sheet.DrawingPatriarch).GetShapes()){if (shape is XSSFPicture){XSSFPicture picture = (XSSFPicture)shape;// 获取图片所在单元格的行号和列号int rowIndex = picture.GetPreferredSize().Row1;int colIndex = picture.GetPreferredSize().Col1;// 获取图像文件格式string imageFormat = picture.PictureData.MimeType switch{"image/jpeg" => "jpeg","image/png" => "png","image/gif" => "gif","image/bmp" => "bmp",_ => "jpg"};// 保存图像文件string outputFileName = _sDirImg + $"{rowIndex}-{colIndex}-{Guid.NewGuid()}.{imageFormat}";using (FileStream imageFile = new FileStream(outputFileName, FileMode.Create)){imageFile.Write(picture.PictureData.Data, 0, picture.PictureData.Data.Length);}Console.WriteLine($"Saved image: {outputFileName}");}}
}

读取excel .xls文件内图片,代码如下:

/// <summary>
/// 读取excel .xls文件内图片
/// </summary>
/// <param name="sheet"></param>
/// <param name="_sDirImg"></param>
static public void fnReadImageHSSF(ISheet sheet, string _sDirImg)
{// 读取图像信息foreach (HSSFShape shape in ((HSSFPatriarch)sheet.DrawingPatriarch).Children){if (shape is HSSFPicture){HSSFPicture picture = (HSSFPicture)shape;// 获取图片所在单元格的行号和列号int rowIndex = picture.GetPreferredSize().Row1;int colIndex = picture.GetPreferredSize().Col1;// 获取图像文件格式string imageFormat = picture.PictureData.MimeType switch{"image/jpeg" => "jpeg","image/png" => "png","image/gif" => "gif","image/bmp" => "bmp",_ => "jpg"};// 保存图像文件string outputFileName = _sDirImg + $"{rowIndex}-{colIndex}-{Guid.NewGuid()}.{imageFormat}";using (FileStream imageFile = new FileStream(outputFileName, FileMode.Create)){imageFile.Write(picture.PictureData.Data, 0, picture.PictureData.Data.Length);}Console.WriteLine($"Saved image: {outputFileName}");}}
}

正常处理应该是读取到图片保存成功后,处理datatable图片列的相关地址,如:uploads/xxx/xx.jpg ,返回保存在服务器上的地址,以便前端访问或保存到数据库等,本文并没有处理,有需要的伙伴自行处理吧,希望本文对你有帮助。

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

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

相关文章

IP地理位置定位技术基本原理

IP地理位置定位技术的基本原理是基于IP地址的特性。每个IP地址在网络中都有一个与之对应的地理位置信息&#xff0c;这是通过IP地址数据库来确定的。这个数据库由ISP&#xff08;Internet Service Provider&#xff09;或其它一些机构维护&#xff0c;其中包含了每个IP地址的地…

两向量叉乘值为对应平行四边形面积--公式推导

两向量叉乘值为对应平行四边形面积--公式推导 介绍 介绍

每日一题——LeetCode942

方法一 个人方法&#xff1a; 找规律&#xff0c;碰到I优先放最小的数&#xff0c;碰到D优先放最大的数&#xff0c;将0-n按照从小到大的顺序放入数组保存&#xff0c;碰到I就从数组前面取值&#xff0c;碰到D就从数组后面取值 var diStringMatch function(s) {var arr[],pe…

windows 安装multipass

安装说明 Multipass orchestrates virtual Ubuntu instances Launch an instance (by default you get the current Ubuntu LTS) multipass launch --name foo 下载 Multipass orchestrates virtual Ubuntu instances 安装 执行安装exe 前提 需要安装hyper-V 参考链接 …

【网络安全常用术语解读】SCAP详解

本文主要介绍什么是SCAP&#xff0c;SCAP的产生背景是怎样的&#xff0c;SCAP有什么用途&#xff0c;有哪些组件&#xff0c;各个组件的用途是什么&#xff1f; SCAP产生背景 由于计算机和网络技术的快速发展&#xff0c;越来越多的软件和系统被应用到企业和机构中&#xff0c…

slf4j+logback源码加载流程解析

Logger log LoggerFactory.getLogger(LogbackDemo.class);如上述代码所示&#xff0c;在项目中通常会这样创建一个Logger对象去打印日志。 然后点进去&#xff0c;会走到LoggerFactory的getILoggerFactory方法&#xff0c;如下代码所示。 public static ILoggerFactory getILo…

java go c++ 开源全文搜索引擎

Apache Lucene Java 全文搜索框架 许可证&#xff1a;Apache-2.0 开发语言&#xff1a;Java 官网&#xff1a;https://lucene.apache.org/ Apache Lucene 是完全用 Java 编写的高性能、功能齐全的全文检索引擎架构&#xff0c;提供了完整的查询引擎和索引引擎、部分文本分析引…

Java项目:101SpringBoot仓库管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 仓库管理系统基于SpringBootMybatis开发&#xff0c;系统使用shiro框架做权限安全控制&#xff0c;超级管理员登录系统后可根据自己的实际需求配角色&…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发&#xff0c;未设置地址转换的情况 2. 开启路由转发&#xff0c;并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 &#xff08;1&#xff09;打开网关的路由转发 &#xff08;2&#xff09;…

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉

文章目录 前言相关文章Nlog配置HandyControl配置简单使用显示效果文本内容 全局异常捕捉异常代码运行结果 前言 我将简单的HandyControl的消息打印系统和Nlog搭配使用&#xff0c;简化我们的代码书写 相关文章 .NET 控制台NLog 使用 WPF-UI HandyControl 控件简单实战 C#更改…

【动态规划精选题目】3、简单多状态模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解简单多状态模型中的9道经典题&#xff0c;会在讲解题目同时给出AC代码 目录 1、按摩师 2、力扣198:打家劫舍1 3、打家劫舍II 4、删除并获得点数 5、 粉刷房子 6、力扣309:买卖股票的最佳时机含冷冻期 7、 买…

如何确定微服务项目中Spring Boot、Spring Cloud、Spring Cloud Alibaba三者之间的版本

文章目录 1. 版本说明2. 版本依赖关系(推荐使用)3. 用脚手架快速生成微服务的pom.xml 本文描述如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本。 1. 版本说明 我们知道Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本选择一致性非常重要…