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

news2024/11/26 14:45:46

由于数据方提供的数据在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) 

        }

        // 读取第一个 Sheet
        ISheet sheet = workbook.GetSheetAt(0);

        if (sExt == ".xlsx")
        {
            fnReadImageXSSF(sheet, _sDirImg);//新版本的Excel(.xlsx) 

        }
        else
        {
            fnReadImageHSSF(sheet, _sDirImg);//老版本的Excel(.xls) 
        }

        // 创建 DataTable
        DataTable 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.coloradmin.cn/o/1342763.html

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

相关文章

基于Spring Cloud + Spring Boot的企业电子招标采购系统源码

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

SSM驾校预约管理系统----计算机毕业设计

项目介绍 本项目分为管理员、教练、学员三种角色&#xff0c; 管理员角色包含以下功能&#xff1a; 学员管理、教练管理、车辆管理、关系管理、车辆维修管理、个人中心等功能。 教练角色包含以下功能&#xff1a; 我的课程、我的学员、车辆中心、个人中心等功能。 学员角色包…

软件测试/测试开发丨Python、pycharm 安装与环境配置

Python 安装与环境配置 1. Python 安装 版本推荐 3.10.0下载地址&#xff1a;www.python.org/downloads/w… 若需要安装旧版本&#xff0c;在页面下方选择对应版本即可&#xff0c;MacOS选择对应系统即可 图示下载windows 3.11.4版本 安装Python 执行安装程序&#xff0c;安…

FreeRTOS学习--53讲 任务通知

任务通知定义 a.任务通知像个用于通知的任务&#xff0c;由一个32位无符号整数和8位的通知状态组成&#xff0c;通过任务通知函数改写其他任务的32位无符号整数数据。 b.改写方式如下(1.可以让这个整数加1: 模拟信号量 2. 设置该整数的指定的某些位&#xff1a;模拟事件组 3.直…

C++ 类和对象 (上)

类的引入&#xff1a; 由于C语言是面向过程的编程语言&#xff0c;我们在完成一件事的时候通常习惯将一件事拆分成一个一个小过程来实现&#xff0c;而到了C就习惯将一件事分成不同的模块&#xff0c;交给不同的对象来处理&#xff0c;每一个对象中承载着数据类型和函数。 &am…

网格布局(大练习)

最近对网格布局研究了一下&#xff0c;写了一个简单的demo。可以参考参考~ 网格基础布局&#xff1a;github地址 挤占网格布局&#xff1a;github地址 基础网站格局&#xff1a;github地址 复杂网站格局&#xff08;方式一&#xff09;&#xff1a;github地址 复杂网站格局&am…

MySQL的高级SQL语句

目录 1.mysql高阶查询 select&#xff1a;显示表格中一个或数个字段的所有数据记录 distinct&#xff1a;不显示重复的数据记录 where&#xff1a;有条件查询 AND OR &#xff1a;且 或 in&#xff1a;显示已知值的数据记录 between&#xff1a;显示两个值范围内的数据记…

深入ArkUI:深入实战组件text和text input

文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…

SoniTranslate

示例效果 官方在线运行地址&#xff1a;https://huggingface.co/spaces/r3gm/SoniTranslate_translate_audio_of_a_video_content 环境配置 git clone --recurse-submodules https://github.com/R3gm/SoniTranslate.gitconda create -n soni python3.8conda activate sonipip…

解决Github无法上传>100M文件——只需两行代码

文章目录 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ 废话不多说&#xff0c;如果在githubpush文件太大时&#xff0c;会报错&#xff1a;this exceeds GitHub’s file size limit of 100.…

MySQL8.0聚合函数+over()函数

1、数据表内容为&#xff1a; CREATE TABLE chapter11 (shopname VARCHAR(255) NULL,sales VARCHAR(255) NULL,sale_date VARCHAR(255) NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;INSERT INTO chapter11 (shopname, sales, sale_date) VALUES(A…

基于YOLOv8的遥感SAR舰船小目标识别

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的遥感SAR舰船小目标&#xff0c;阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的…

1.2.0 IGP高级特性之FRR

理论部分参考文档&#xff1a;Segment Routing TI-LFA FRR保护技术 - 华为 一、快速重路由技术 FRR(Fast Reroute)快速重路由 实现备份链路的快速切换&#xff0c;也可以与BFD联动实现对故障的快速感知。 随着网络的不断发展&#xff0c;VoIP和在线视频等业务对实时性的要求越…

堪比Postman!这款IDEA插件真好用!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

Arduino驱动VL6180X光学测距传感器(OLED显示)

Arduino驱动VL6180X光学测距传感器&#xff08;OLED显示&#xff09; 简介原理模块参数接线图代码结果 简介 VL6108X三合一光电模块&#xff0c;芯片内集成了IR VSEL(vertical-cavity surface-emitting laser)红外垂直腔面发射激光器光源、接近传感器、环境光传感器&#xff0…

《网络是怎样连接的》1.2、1.3、1.4节图表(自用)

图2.1&#xff1a;浏览器调用socket库中的解析器&#xff0c;向DNS服务器询问域名的ip地址 &#xff08;图中的gethostbyname是解析器的名称&#xff1b;协议栈是操作系统的网络控制软件&#xff0c;也称协议驱动、TCP/IP驱动&#xff09; 图2.2 DNS服务器根据客户端查询信息查…

解析Web自动化测试工具能做什么?

随着互联网的蓬勃发展&#xff0c;Web应用程序在我们生活和工作中扮演着愈发重要的角色。为确保这些Web应用程序的质量、稳定性和安全性&#xff0c;Web自动化测试工具应运而生。本文将介绍Web自动化测试工具的多重功能&#xff0c;以及它们如何在软件开发生命周期中发挥关键作…

分享一套超有价值的JAVA开源MES系统

商业开源的一套超有价值的JAVA制造执行MES系统源码 亲测 带本地部署搭建教程 教你如何在本地运行运行起来。 开发环境&#xff1a;jdk11tomcatmysql8springbootmaven 需要源码&#xff0c;私信我获取。 一、系统概述&#xff1a; MES制造执行系统&#xff0c;其定位于制造执…

OKCC语音机器人的人机耦合来啦

目前市场上语音机器人的外呼形式基本就分为三种&#xff0c;一种纯AI外呼&#xff0c;第二种也是目前主流的AI外呼转人工。那么第三种也可能是未来的一种趋势&#xff0c;人机耦合&#xff0c;或者也叫人机协同。 那么什么是人机耦合呢&#xff1f; 人机耦合是为真人坐席创造相…

springCould中的OpenFeign-从小白开始【6】

目录 1.简单介绍❤️❤️❤️ 2.能干嘛❤️❤️❤️ 3.简单入门 ❤️❤️❤️ 4.超时控制 ❤️❤️❤️ 5.日志打印❤️❤️❤️ 1.简单介绍❤️❤️❤️ OpenFeign是一个用于微服务架构中的声明式、模板化的HTTP客户端库。它简化了编写服务间通信的代码&#xff0c;使得开…