Поэтому я отказался от
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);
}
}
Ширинаcell: Это немного сложнее.По сути, ширина ячейки в Excel равна количеству символов (отформатированных с использованием шрифта по умолчанию), которое ячейка может содержать горизонтально.
Например,
Этот столбец имеет длину 12 и может содержать 12 чисел шрифтом Calibri (11).
Это также мой стандарт по умолчанию, так как мой организм по умолчанию - калибри (11)
Вот статья , объясняющая это более подробно.
Следующий вопрос заключается в том, как на земле можно перевести это в пиксели.
Сначала нам нужно выяснить, какая длина символа в шрифте по умолчанию.Можно использовать TextRenderer.MeasureText в пространстве имен System.Windows.Forms.Однако я использую .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% в настройках дисплея