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:在单元格中定位图像 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • VBA删除列中的单元格并根据单元格的值左移?

    如果单元格为空 如何删除 B 列 和左移 中的单元格 下面是我所拥有的 但它给出了 应用程序定义或对象定义的错误 Sub DeleteCellShiftLeft For i 1000 To 1 Step 1 If Cells i B Val
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 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