当前位置: 首页 > news >正文

.NET Core NPOI 导出图片到Excel指定单元格并自适应宽度

NPOI:支持xlsx,.xls,版本=>2.5.3

XLS:HSSFWorkbook,主要前缀HSS,

XLSX:XSSFWorkbook,主要前缀XSS,using NPOI.XSSF.UserModel;

1、导出Excel添加图片效果,以及可自适应(以下有调整过宽度) 

2、Nuget安装NPOI

 直接安装最新版本 - 2.5.3

3、最新版本数据类型大小写有改动

 之前版本是全部大小,现在的是首字母大写

#region 程序集 NPOI, Version=2.5.3.0, Culture=neutral, PublicKeyToken=0df73ec7942b34e1
// C:\Users\DELL\.nuget\packages\npoi\2.5.3\lib\netstandard2.0\NPOI.dll
#endregion
 
namespace NPOI.SS.UserModel
{
    public enum CellType
    {
        Unknown = -1,
        Numeric = 0,
        String = 1,
        Formula = 2,
        Blank = 3,
        Boolean = 4,
        Error = 5
    }

4、JSON数据 

[{
    "id": 1,
    "productNum": 10,
    "addTime": "2021-07-15T08:59:49.997",
    "updateTime": "0001-01-01T00:00:00",
    "productCover": "AmazonProduct/20210715/bc21aee9-b35b-49e6-a50c-7d95178ff487.jpg",
    "productName": "DEERC DE22 GPS Drone with 4K Camera 2-axis Gimbal, EIS Anti-Shake, 5G FPV Live Video Brushless Motor, Auto Return Home, Selfie, Follow Me, Waypoints, Circle Fly 52Min Flight with Carrycase",
    "productPrice": 123.00
}, {
    "id": 2,
    "productNum": 66,
    "addTime": "2021-07-15T08:58:59.257",
    "updateTime": "0001-01-01T00:00:00",
    "productCover": "AmazonProduct/20210715/cea4ff1b-6d5f-46fa-9bea-3745cd80a7d5.jpg",
    "productName": "Neleus Men's Lightweight Workout Running Athletic Shorts with Pockets",
    "productPrice": 26.89
}] 

5、导出xls格式代码 

#region version=2021.07.15 导出 - Excel - xls - 例子
[HttpPost]
public IActionResult ExcelXls(Model_Request requestModel)
{
    try
    {
        HSSFWorkbook workbook = new HSSFWorkbook(); //创建一个工作簿
 
        ISheet sheet = workbook.CreateSheet("labelName"); //创建一个sheet
 
        //设置excel列宽,像素是1/256
        sheet.SetColumnWidth(0, 18 * 256);
        sheet.SetColumnWidth(1, 18 * 256);
 
        IRow rowTitle = sheet.CreateRow(0);//创建表头行
 
        rowTitle.CreateCell(0, CellType.String).SetCellValue("编号");
        rowTitle.CreateCell(1, CellType.String).SetCellValue("产品封面");
        rowTitle.CreateCell(2, CellType.String).SetCellValue("产品名称");
        rowTitle.CreateCell(3, CellType.String).SetCellValue("产品价格");
        rowTitle.CreateCell(4, CellType.String).SetCellValue("产品状态");
        rowTitle.CreateCell(5, CellType.String).SetCellValue("产品数量");
        rowTitle.CreateCell(6, CellType.String).SetCellValue("添加时间");
 
        List<Model_Response> list = new List<Model_Response>();
        list = new Data().List(requestModel);
 
        if (list.Count > 0)
        {
            int rowline = 1; //从第二行开始(索引从0开始)
 
            foreach (AmazonProductApplyModel_Response item in list)
            {
                IRow row = sheet.CreateRow(rowline);
                        
                row.Height = 80 * 20; //设置excel行高,像素点是1/20
                        
                row.CreateCell(0, CellType.String).SetCellValue(item.id); //编号
 
                //===产品封面===
                //将图片文件读入一个字符串
                byte[] bytes = System.IO.File.ReadAllBytes(PathHelper.BaseDirectory() + item.productCover); //路径(加载图片完整路径)
                int pictureIdx = workbook.AddPicture(bytes, PictureType.JPEG);
 
                //把图片添加到相应的位置
                HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
                HSSFClientAnchor anchor = new HSSFClientAnchor(70, 10, 0, 0, 1, rowline, 2, rowline + 1);
                HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
                //===/产品封面===
 
                row.CreateCell(2, CellType.String).SetCellValue(item.productName); //产品名称
                row.CreateCell(3, CellType.String).SetCellValue(item.productPrice.ToString()); //产品价格
                row.CreateCell(4, CellType.String).SetCellValue(item.productStatus); //产品状态
                row.CreateCell(5, CellType.String).SetCellValue(item.productNum.ToString()); //补货数量
                row.CreateCell(6, CellType.String).SetCellValue(item.addTime.ToString()); //添加时间
 
                rowline++;
            }
 
            //设置自适应宽度
            for (int columnNum = 0; columnNum < 7; columnNum++)
            {
                int columnWidth = sheet.GetColumnWidth(columnNum) / 256;
                for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++)
                {
                    IRow currentRow = sheet.GetRow(rowNum);
                    if (currentRow.GetCell(columnNum) != null)
                    {
                        ICell currentCell = currentRow.GetCell(columnNum);
                        int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
                        if (columnWidth < length)
                        {
                            columnWidth = length;
                        }
                    }
                }
                sheet.SetColumnWidth(columnNum, columnWidth * 256);
            }
        }
 
        //保存文件
        string name = Guid.NewGuid().ToString() + ".xls";
        string path = AppDomain.CurrentDomain.BaseDirectory + "\\" + name;
        using (Stream stream = System.IO.File.Create(path))
        {
            workbook.Write(stream);
        }
 
        return Json(new { c = 200, m = "导出成功", path = path });
    }
    catch (Exception ex)
    {
 
    }
    finally
    {
 
    }
 
    return Json(new { c = 200, m = "导出成功", path = path });
}
#endregion 

6、导出xlsx格式代码 

#region version=2021.07.15 导出 - Excel - xls - 例子
[HttpPost]
public IActionResult ExcelXls(Model_Request requestModel)
{
    try
    {
        XSSFWorkbook workbook = new XSSFWorkbook(); //创建一个工作簿
 
        ISheet sheet = workbook.CreateSheet("labelName"); //创建一个sheet
 
        //设置excel列宽,像素是1/256
        sheet.SetColumnWidth(0, 18 * 256);
        sheet.SetColumnWidth(1, 18 * 256);
 
        IRow rowTitle = sheet.CreateRow(0);//创建表头行
 
        rowTitle.CreateCell(0, CellType.String).SetCellValue("编号");
        rowTitle.CreateCell(1, CellType.String).SetCellValue("产品封面");
        rowTitle.CreateCell(2, CellType.String).SetCellValue("产品名称");
        rowTitle.CreateCell(3, CellType.String).SetCellValue("产品价格");
        rowTitle.CreateCell(4, CellType.String).SetCellValue("产品状态");
        rowTitle.CreateCell(5, CellType.String).SetCellValue("产品数量");
        rowTitle.CreateCell(6, CellType.String).SetCellValue("添加时间");
 
        List<Model_Response> list = new List<Model_Response>();
        list = new Data().List(requestModel);
 
        if (list.Count > 0)
        {
            int rowline = 1; //从第二行开始(索引从0开始)
 
            foreach (AmazonProductApplyModel_Response item in list)
            {
                IRow row = sheet.CreateRow(rowline);
                        
                row.Height = 80 * 20; //设置excel行高,像素点是1/20
                        
                row.CreateCell(0, CellType.String).SetCellValue(item.id); //编号
 
                //===产品封面===
                //将图片文件读入一个字符串
                byte[] bytes = System.IO.File.ReadAllBytes(PathHelper.BaseDirectory() + item.productCover); //路径(加载图片完整路径)
                int pictureIdx = workbook.AddPicture(bytes, PictureType.JPEG);
 
                //把图片添加到相应的位置
                XSSFDrawing patriarch = (XSSFDrawing)sheet.CreateDrawingPatriarch();
                XSSFClientAnchor anchor = new XSSFClientAnchor(70, 10, 0, 0, 1, rowline, 2, rowline + 1);
                XSSFPicture pict = (XSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
                //===/产品封面===
 
                row.CreateCell(2, CellType.String).SetCellValue(item.productName); //产品名称
                row.CreateCell(3, CellType.String).SetCellValue(item.productPrice.ToString()); //产品价格
                row.CreateCell(4, CellType.String).SetCellValue(item.productStatus); //产品状态
                row.CreateCell(5, CellType.String).SetCellValue(item.productNum.ToString()); //补货数量
                row.CreateCell(6, CellType.String).SetCellValue(item.addTime.ToString()); //添加时间
 
                rowline++;
            }
 
            //设置自适应宽度
            for (int columnNum = 0; columnNum < 7; columnNum++)
            {
                int columnWidth = sheet.GetColumnWidth(columnNum) / 256;
                for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++)
                {
                    IRow currentRow = sheet.GetRow(rowNum);
                    if (currentRow.GetCell(columnNum) != null)
                    {
                        ICell currentCell = currentRow.GetCell(columnNum);
                        int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
                        if (columnWidth < length)
                        {
                            columnWidth = length;
                        }
                    }
                }
                sheet.SetColumnWidth(columnNum, columnWidth * 256);
            }
        }
 
        //保存文件
        string name = Guid.NewGuid().ToString() + ".xls";
        string path = AppDomain.CurrentDomain.BaseDirectory + "\\" + name;
        using (Stream stream = System.IO.File.Create(path))
        {
            workbook.Write(stream);
        }
 
        return Json(new { c = 200, m = "导出成功", path = path });
    }
    catch (Exception ex)
    {
 
    }
    finally
    {
 
    }
 
    return Json(new { c = 200, m = "导出成功", path = path });
}
#endregion 

参考文章:【小5聊】C# NPOI添加图片到Excel指定单元格并自适应宽度_npoi excle 插入图片-CSDN博客 

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。  

相关文章:

.NET Core NPOI 导出图片到Excel指定单元格并自适应宽度

NPOI&#xff1a;支持xlsx&#xff0c;.xls&#xff0c;版本>2.5.3 XLS&#xff1a;HSSFWorkbook&#xff0c;主要前缀HSS&#xff0c; XLSX&#xff1a;XSSFWorkbook&#xff0c;主要前缀XSS&#xff0c;using NPOI.XSSF.UserModel; 1、导出Excel添加图片效果&#xff0…...

python bs4 selenium 查找a href=javascript:();的实际点击事件和url

在使用 BeautifulSoup 和 Selenium 时&#xff0c;处理 href"javascript:;" 的链接需要一些额外的步骤&#xff0c;因为这些链接不直接指向一个 URL&#xff0c;而是通过 JavaScript 代码来执行某些操作。这可能包括导航到另一个页面、触发模态窗口、显示/隐藏内容等…...

三 BH1750 光感驱动调试1

一 扫描设备 查看手册 BH1750 光感模块 寄存器地址为 0x23 官方手册 : http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf su 然后用 i2cdetect 扫描设备: 拨,插 对比, 探测设备挂载在 /dev/i2c-5 上, 从设备地址为 0x23 二 …...

UE材质节点Fresnel

Fresnel节点 ExponentIn 控制边缘透明度 BaseReflectFractionIn 控制中心透明度...

linux的大内核锁与顺序锁

大内核锁 Linux大内核锁&#xff08;Big Kernel Lock&#xff0c;BKL&#xff09;是Linux内核中的一种锁机制&#xff0c;用于保护内核资源&#xff0c;以下是关于它的详细介绍&#xff1a; 概念与作用 大内核锁是一种全局的互斥锁&#xff0c;在同一时刻只允许一个进程访问…...

用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑 1.1 接收参数 username request.POST.get(username) password request.POST.get(password) phone request.POST.get(phone) 1.2 校验参数 前端校验过的后端也要校验&#xff0c;后端的校验和前端的校验是⼀致的 # 判断参数是否⻬全 # 判断⽤户名是否…...

面向对象的基本概念

本篇,来介绍面向对象的基本概念。 1 面向过程与面向对象 面向过程与面向对象,是两种不同的编程思想。 1.1 面向过程 面向过程的思路,是按照问题的解决步骤,将程序分解为一个个具体的函数或过程,然后依次调用这些函数来实现程序的功能。 面向对象的程序设计,程序的执行…...

深度学习每周学习总结R4(LSTM-实现糖尿病探索与预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R6中的内容&#xff0c;为了便于自己整理总结起名为R4&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据预处理3. 数…...

如何使用 PHP 操作亚马逊 S3 对象云存储

以下是使用PHP与亚马逊S3对象云存储&#xff08;也有其他支持S3协议的云存储服务&#xff0c;原理类似&#xff09;进行交互的常见文档接口使用示例&#xff0c;涵盖了基本的操作如上传文件、下载文件、删除文件、列举文件等内容。 ### 前提条件 1. 首先&#xff0c;你需要获取…...

26_Redis RDB持久化

从这个模块开始带领大家来学习Redis分布式缓存的相关内容,主要学习目标见下: 数据丢失问题:实现Redis数据持久化(RDB和AOF)并发能力问题:搭建Redis主从集群,实现读写分离故障恢复问题:利用Redis哨兵模式,实现健康检测和自动恢复存储能力问题:搭建Redis分片集群,利用…...

标准Android开发jdk和gradle和gradle AGP和AndroidStudio对应版本

还在为用什么gradle版本烦恼吗&#xff1f;编译不过IDE不开始下载第三方库吗&#xff1f;是时候匹配下你的gradle编译版本了&#xff1a; 1.Gradle 各版本支持的 JDK 版本范围如下&#xff1a; Gradle 版本最低支持 JDK最高支持 JDK7.0 - 7.6JDK 8JDK 178.0 - 8.2JDK 11JDK 1…...

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…...

潜力巨大但道路曲折的量子计算

近一年来&#xff0c;由于工作的原因参观访问了一些量子产业园&#xff0c;接触了量子加密计算机、量子云计算等非常炫酷的概念性产品&#xff0c;这与自己一直认为的“量子技术仍然处于实验室研究阶段”的基本判断与认知产生了强烈的冲突&#xff0c;一刹那间&#xff0c;心中…...

LabVIEW驱动电机实现样品自动搜索

利用LabVIEW控制电机驱动相机在XY平面上进行扫描&#xff0c;以检测样品位置。样品最初可能位于相机视野范围之外&#xff0c;需要实现自动搜索样品位置并完成精确定位扫描的功能。该系统需具有以下特点&#xff1a; 高效搜索&#xff1a;能够快速确定样品位置&#xff0c;缩短…...

React Native Hooks开发指南

一、什么是Hooks Hooks 是 React 16.8 的新增特性。在不编写 class 的情况下使用 state 以及其他的 React 特性。Hooks 是一种在函数式组件中使用有状态函数的方法。 二、类组件 componentDidMount、componentDidUpdate 和 componentWillUnmount 这三个函数的组合。 三、常用…...

腾讯云AI代码助手编程挑战赛-厨房助手之AI大厨

腾讯云AI代码助手编程挑战赛-厨房助手之AI大厨 作品简介 身处当今如火箭般迅猛发展的互联网时代&#xff0c;智能聊天助手已然化身成为提升用户体验的关键利器&#xff0c;全方位渗透至人们的数字生活。 紧紧跟随着这股汹涌澎湃的时代浪潮&#xff0c;我毅然投身于极具挑战性…...

ubuntu22.04 gcc,g++从10.5切换到低版本9.5

一、安装gcc-9.5 mkdir gcc cd gcc sudo apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends gcc-9 | grep -v i386 | grep "^\w") sudo dpkg -i *.deb sudo…...

在 WSL 中使用 Jupyter Notebook 的 TensorBoard 启动问题与解决方法

在 WSL&#xff08;Windows Subsystem for Linux&#xff09;环境中&#xff0c;通过 Jupyter Notebook 使用 %tensorboard --logdir outputs有时会出现 “Timed out waiting for TensorBoard to start” 错误。常见原因通常是先前的 TensorBoard 进程尚未结束&#xff0c;占用…...

Spring Boot 2 学习全攻略

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今快速发展的 Java 后端开发领域&#xff0c;Spring Boot 2 已然成为一股不可忽视的强大力量。它简化了 Spring 应用的初始搭建以及开发过程&#xff0c;让开发者能够更加专注于业务逻辑的实现&am…...

海豚调度DolphinScheduler-3.1.9配置windows本地开发环境

源代码下载地址https://dolphinscheduler.apache.org/zh-cn/docs/3.1.9 1.Zookeeper安装与使用 如图下载解压zookeeper安装包&#xff0c;并创建data和log目录 下载地址 https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz 进入…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...