有个妹纸找我请教如何获取图片坐标,因此我到家后花了点时间,写了这份代码。

实测下来,可以正确获取 Excel 2003 版本的形状和图片这两种的坐标/锚点,以及 Excel 2007 版本的图片的坐标/锚点。

暂未解决如何将 Excel 2007 以上版本的形状(XSSFSimpleShape)转换成图片(XSSFPicture)的问题?

如有大佬懂的,还请多多指教。

class Program
{
static void Main(params string[] args)
{
string excel2003FilePath = @"D:\Users\Allen\Desktop\image.xls";
GetPictureAnchorTest(excel2003FilePath); string excel2007FilePath = @"D:\Users\Allen\Desktop\image.xlsx";
GetPictureAnchorTest(excel2007FilePath); Console.ReadKey();
} static void GetPictureAnchorTest(string excelFilePath)
{ IWorkbook workbook = WorkbookFactory.Create(excelFilePath);
ISheet sheet = workbook.GetSheetAt(0);
IEnumerable<IPicture> pictures = sheet.GetPictures();
foreach (IPicture picture in pictures)
{
PictureAnchor anchor = picture.GetPictureAnchor();
Console.WriteLine($"PictureType:{picture.GetType().FullName}, LeftmostCellIndex: {anchor.LeftmostCellIndex}, RightmostCellIndex: {anchor.RightmostCellIndex}, TopmostRowIndex: {anchor.TopmostRowIndex}, BottommostRowIndex: {anchor.BottommostRowIndex}");
}
}
} public readonly struct PictureAnchor
{
public PictureAnchor(int leftmostCellIndex, int rightmostCellIndex, int topmostRowIndex, int bottommostRowIndex)
{
LeftmostCellIndex = leftmostCellIndex;
RightmostCellIndex = rightmostCellIndex;
TopmostRowIndex = topmostRowIndex;
BottommostRowIndex = bottommostRowIndex;
} public int LeftmostCellIndex { get; } public int RightmostCellIndex { get; } public int TopmostRowIndex { get; } public int BottommostRowIndex { get; } public override string ToString()
{
return $"LeftmostCellIndex: {LeftmostCellIndex}, RightmostCellIndex: {RightmostCellIndex}, TopmostRowIndex: {TopmostRowIndex}, BottommostRowIndex: {BottommostRowIndex}";
}
} public static class NPOIExtensions
{
public static IEnumerable<IPicture> GetPictures(this ISheet sheet)
{
var dp = sheet.DrawingPatriarch; // Excel 2003
if (dp is HSSFPatriarch patriarch)
{
return patriarch.GetShapes().Select(x =>
{
if (x is HSSFPicture picture)
{
return picture;
}
else
{
return new HSSFPicture(x, x.Anchor);
}
}).Cast<IPicture>();
} // Excel 2007 above
if (dp is XSSFDrawing dr)
{
//TODO: How convert XSSFSimpleShape to XSSFPicture ???
return dr.GetShapes().Where(x => x is XSSFPicture).Cast<IPicture>();
} throw new NotSupportedException($"Unsupported DrawingPatriarch object type:{dp.GetType().FullName}");
} public static PictureAnchor GetPictureAnchor(this IPicture picture)
{
var anchor = picture.ClientAnchor;
return new PictureAnchor(anchor.Col1, anchor.Col2, anchor.Row1, anchor.Row2);
}
}

PS: WPS的插入图片函数 DISPIMG,是 WPS 特有的,不属于 Office 规范,因此获取的坐标不准。

NPOI获取Excel文件里的形状/图片的坐标/锚点的更多相关文章

  1. C#利用NPOI操作Excel文件

    NPOI作为开源免费的组件,功能强大,可用来读写Excel(兼容xls和xlsx两种版本).Word.PPT文件.可是要让我们记住所有的操作,这便有点困难了,至此,总结一些在开发中常用的针对Excel ...

  2. 使用NPOI导出Excel文件

    使用NPOI导出Excel文件,本实例使用了ASP.NET MVC. 1.使用NPOI导出Excel文件 实例:导出商品列表. 要求:1.通过NPOI导出导出商品列表信息: 2.使用Excel函数计算 ...

  3. VB6.0 获取Excel文件工作表Sheet的名称

    获取Excel文件工作表Sheet的名称 '产生Excel文档 Dim xlapp, xlbook As Object Dim sSheetName As String Set xlapp = Cre ...

  4. C#可以获取Excel文件中Sheet的名字

    C#可以获取Excel文件中Sheet的名字吗 C#可以获取Excel文件中Sheet的名字吗 我试过WPS的表格可以 可以 要代码么 百度都有 [深圳]Milen(99696619)  14:13: ...

  5. C#中获取Excel文件的第一个表名

    //    2.以数据库方式打开并输入数据//      此方式将xls文件所在目录看作数据库,其中的xls文件看作数据库表,表名即文件名(不加扩展名).//      函数importExcelTo ...

  6. asp.net 使用NPOI读取excel文件

    asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...

  7. asp.net Mvc 使用NPOI导出Excel文件

    1.新建MVC项目,新建控制器.视图 添加控制器: 添加视图(将使用布局页前面的复选框里的勾勾去掉) 2.在Models里新建一个类 public class Shop { /// <summa ...

  8. 基于Vue + axios + WebApi + NPOI导出Excel文件

    一.前言 项目中前端采用的Element UI 框架, 远程数据请求,使用的是axios,后端接口框架采用的asp.net webapi,数据导出成Excel采用NPOI组件.其业务场景,主要是列表页 ...

  9. excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)

    将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...

  10. NPOI对excel文件的导入导出

    现理解:将一个Excel文件(工作簿-IWorkBook)看做是一个你要操作的对象,每个工作簿包含多个工作表(ISheet)对象,每个工作表中又包含多个行对象(IRow),每行又包含多个单元格(ICe ...

随机推荐

  1. Power AutoMate: 变量专栏

    背景 本篇对Power AutoMate的变量功能进行记录与讲解 设置变量 拖拽功能块并赋值 测试一些数据类型 测试中发现与程序中的类型,并没有什么差别 截断数字 对浮点数进行一些操作 选择需要操作的 ...

  2. vs(visual stuiod)中vc++工程的Filter和Folder及vcxproj知识

    vs中创建Filter 在一个新项目中右键 - Add - New,默认只有一选项 New Filter. 创建出来的Filter可以理解为是VS的过滤器(虚拟目录),它不会在本地的磁盘上新建目录,而 ...

  3. 【Qt6】QWidgetAction 的使用

    在开始主题前,先看一个 C++ 例子: #include <iostream> struct Data { int a; int b; }; // 注意这里 struct Data *s; ...

  4. [python]使用diagrams绘制架构图

    简介 diagrams是python的一个第三方库,用于实现使用代码绘制架构图. 安装 依赖于 Graphviz,安装diagrams之前需要先安装 Graphviz(下载压缩包后,将bin目录添加到 ...

  5. centos7升级内核到最新稳定版

    前言 centos7默认的内核版本才3.10,诸如VXLAN.eBPF等特性无法体验,因此需要升级.目前(2022.02)Linux的内核版本已更新到5.16. 步骤 更新仓库 yum update ...

  6. 【动画进阶】神奇的 3D 磨砂玻璃透视效果

    最近,群友分享了一个很有意思的效果: 原效果的网址:frosted-glass.该效果的几个核心点: 毛玻璃磨砂效果 卡片的 3D 旋转跟随效果 整体透明度和磨砂感.以及卡片的 3D 形态会随着用户移 ...

  7. api接口对接如何实现,php如何对接api

    API接口对接是现代软件开发中不可或缺的一部分,它允许不同的应用程序之间进行数据交换和服务调用.在PHP中,可以使用多种方式实现API接口的对接,包括基于HTTP协议的传统方法以及现代的API客户端库 ...

  8. [Python] 今天开始学习Python3了, 纪念一下

    #! /usr/bin/env python3 import time print("你好, 请告诉我你的名字.") name = input("名前: ") ...

  9. Spring Event 观察者模式, 业务解耦神器

    观察者模式在实际开发过程中是非常常见的一种设计模式. Spring Event的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式. 一.什么是观察者模式 概念: 观察者 ...

  10. SpringCloud搭建保姆级教程

    一.搭建服务注册与发现中⼼ 使⽤Spring Cloud Netflix 中的 Eureka 搭建服务注册与发现中⼼ 1.创建SpringBoot应用添加依赖 1.spring web 2.eurek ...