EPPlus:在单元格中定位图像

2024-01-26

我正在尝试使用 Epplus 将图像“插入” Excel 中的单元格。

使用以下代码

private static void SetImage(ExcelWorksheet sheet, ExcelRange cell)
{
    using (WebClient client = new WebClient())
    using (Stream stream = client.OpenRead("https://..."))
    using (Bitmap bitmap = new Bitmap(stream))
    {
        var picture = sheet.Drawings.AddPicture(Guid.NewGuid().ToString(), bitmap);
        picture.From.Column = cell.Start.Column - 1;
        picture.From.Row = cell.Start.Row - 1;

        picture.To.Column = cell.Start.Column;
        picture.To.Row = cell.Start.Row;
    }
}

-

var cell = sheet.Cells[2, 2];
SetImage(sheet, cell);

cell = sheet.Cells[3, 2];
SetImage(sheet, cell);

然而,它似乎总是与右侧重叠。

如果我调整单元格宽度和高度,重叠会发生变化但永远不会消失


所以我放弃了

picture.To.Column = cell.Start.Column;
picture.To.Row = cell.Start.Row;

因为我无法让它工作并决定使用以下方法计算我自己的尺寸:

picture.SetSize(width, height);

诀窍是了解 Excel 实际如何计算宽度和高度。

单元格的高度:它以点为单位进行测量,但我们需要像素。一英寸有 72 个点。可以使用以下公式将点转换为像素:点* (1/72.0) * DPI。 DPI 是每英寸点数,可以使用以下方法找到:

using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
    float dpiY = graphics.DpiY;
}

因此,为了计算单元格的高度(以像素为单位),我使用了

private static int GetHeightInPixels(ExcelRange cell)
{
    using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
    {
        float dpiY = graphics.DpiY;
        return (int)(cell.Worksheet.Row(cell.Start.Row).Height * (1 / 72.0) * dpiY);
    }
}

单元格的宽度:这有点棘手。基本上,Excel 中单元格的宽度等于单元格可以水平包含的字符数(使用默认字体格式化)。

例如

该列的长度为 12,可以包含 12 个 Calibri(11) 字体的数字。

That is also my excel default since my body default is calibri(11) enter image description here

这是一个article https://support.microsoft.com/en-us/help/214123/description-of-how-column-widths-are-determined-in-excel更深入地解释它。

下一个问题是如何将其转换为像素。

首先,我们需要了解默认字体中字符的长度是多少。可以在 System.Windows.Forms 命名空间中使用 TextRenderer.MeasureText。但是我正在使用 .Net Core 并且需要另一种方式。另一种方法是使用 System.Drawing.Common 核心库,该库现在处于预览状态。

public static float MeasureString(string s, Font font)
{
    using (var g = Graphics.FromHwnd(IntPtr.Zero))
    {
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

        return g.MeasureString(s, font, int.MaxValue, StringFormat.GenericTypographic).Width;
    }
}

然后我使用该方法来计算像素宽度,如下所示

private static int GetWidthInPixels(ExcelRange cell)
{
    double columnWidth = cell.Worksheet.Column(cell.Start.Column).Width;
    Font font = new Font(cell.Style.Font.Name, cell.Style.Font.Size, FontStyle.Regular);

    double pxBaseline = Math.Round(MeasureString("1234567890", font) / 10);

    return (int)(columnWidth * pxBaseline);
}

编辑:请注意,当显示设置下缩放系数设置为超过 100% 时,仍然会发生重叠

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EPPlus:在单元格中定位图像 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将 MS 转换为秒

    我发现这个公式可以用来将 MS 转换为秒 但它是为 Excel 2002 编写的 而我正在使用 2010 CONCATENATE TEXT INT B1 1000 86400 hh mm ss B1 INT B1 1000 1000 以下是
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 重载<<的返回值

    include
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • JavaScript 中的重入

    我想提高对可重入这个词的理解 这个函数是可重入的吗 function foo yield 1 yield 2 和这个 function foo return 1 和这个 var x 0 function foo return x 和这个 f
  • 文件写入 - PrintStream 附加

    我试图将一些信息附加到文本文件中 但该文件仅显示最后写入的元素 有许多Engineers 但它仅将读取的最后一个元素打印到文件中 例如 Engineer e new Engineer firstName surName weeklySal
  • 使用多平台模拟 kotlin 中的常见测试

    我无法将通用模拟库 mockk io 与 kotlin 多平台一起使用 在他们的网站上 它说要在 kotlin 多平台中使用 mockk 你只需要将这一行添加到你的 gradle 中 testImplementation io mockk
  • 快速创建和播放声音

    所以我想做的是在 swift 中创建并播放一个声音 当我按下按钮时就会播放 我知道如何在 Objective C 中做到这一点 但是有人知道如何在 Swift 中做到吗 对于 Objective C 来说是这样的 NSURL soundUR
  • 远程服务,旋转时泄漏活动

    我在远程服务中遇到回调问题 注册回调轮换后会导致活动泄漏 你能给我一些建议吗 我做错了什么 IRemoteApi aidl import com example remoteservice IRemoteListener interface
  • Visual Studio 部署项目 - 创建已部署可执行文件的快捷方式

    我意识到可能有一种简单的方法可以做到这一点 但是如何为使用 Visual Studio 部署项目构建的 MSI 部署的可执行文件创建桌面快捷方式 我想我需要使用文件系统编辑器 但是当我在用户桌面上创建快捷方式时 我无法定位可执行文件 我只能
  • 带有彩色海洋的极地立体投影中的 Geopandas 世界地图

    对此添加进一步的要求question https stackoverflow com questions 55646598 polar stereographic projection of geopandas world map 我还需要
  • 解析 XML 并填充到列表框中

    我是 C 新手 我要发展C List box in Windows Form 我发现this http dotnetperls com listbox链接会有帮助 但列表框的输入将是以下格式的 XML
  • AWS S3 读取是否保证返回新创建的对象?

    我一直在阅读有关 AWS S3 的写后读一致性的文档 但我仍然不确定这一点 如果我向 S3 写入一个对象 并在从写入操作获得成功响应后 我立即地尝试读取它 读取操作是否保证返回该对象 换句话说 有没有可能因为找不到对象而导致读操作失败 因为
  • FatFree 路由在生产中不起作用

    我有一个具有许多路由路径的应用程序 如下所示 F3 route GET Main gt get front page F3 route GET login check for login Login gt check for login 第
  • Python 发行版有哪些用例?

    我正在为我正在编写的 Python 包开发一个发行版 以便我可以发布 它在 PyPI 上 这是我第一次使用 distutils setuptools distribute pip setup py 等等 我在学习曲线上有点挣扎 这比我预期的
  • 将 php 表单中的发件人电子邮件地址更改为收件人

    我正在尝试创建一个简单的 php 电子邮件表单 将提交的内容发送到指定的地址 但我试图解决的问题是电子邮件发送的地址 目前 它发送自 电子邮件受保护 cdn cgi l email protection 但我希望能够将其更改为简单的 电子邮
  • 为什么 GETDATE() 是无效标识符

    当我调试此代码时 为什么 Oracle Sql Developer 工具显示 GETDATE 是无效标识符 CREATE OR REPLACE TRIGGER SPName AFTER UPDATE ON TableName FOR EAC
  • Firebase querySnapshot 未根据 where 条件实时更新

    我使用带有 flutter 的 cloud firestore 来存储聊天内容 并使用 where 条件来获取聊天内容 文档正确返回 但添加新数据时聊天列表不会实时更新 聊天记录如何存储 collection gt message mess
  • 无法导入数据类模块

    今天我从 apt get 安装了 python 3 7 来尝试新的 dataclasses 模块 我单独安装了它 因为 python3 6 无法升级到 3 7 当我输入 python3 7 version 它给了我 gt gt gt Pyt
  • 代理和 fetchMore()/canFetchMore() 背后的 Qt 模型

    我很想知道当具有增量数据获取的主数据模型位于代理或代理链后面时 视图将如何表现 代理如何进行项目重新排列 例如取消分组代理 示例 http lynxline com jongling qt models http lynxline com
  • 如何在修改后更新 Android 视图?

    我的视图中有一些方法可以修改调用时绘制的一些形状 在 Java 中 为了确保组件已更新 我会调用repaint 有什么可以确保我的视图正确更新吗 我曾在某处读到过这样的呼唤invalidate in the onDraw 方法将使事情保持最
  • HTTP_INTERCEPTORS 仅在 AppModule 中

    我正在尝试在我的 Angular 6 应用程序中实现延迟加载 我所有的 http 调用都是在FeatureModule 延迟加载 但我仍然必须添加HttpClientModule in my AppModule并且不在FeatureModu
  • Node.js 中的 HTTP.request 不断收到错误请求

    我刚刚安装了 Node js 也许我遗漏了一些东西 但我正在尝试一个简单的 http request 但除了 400 个响应之外什么也没有得到 我已经尝试了几个主机但没有运气 我从他们的网站安装了 Node 这不起作用 所以我卸载并通过 H
  • EPPlus:在单元格中定位图像

    我正在尝试使用 Epplus 将图像 插入 Excel 中的单元格 使用以下代码 private static void SetImage ExcelWorksheet sheet ExcelRange cell using WebClie