EPPlus: положение изображения в ячейке - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь вставить изображения "в" ячейку в Excel с помощью Epplus.

с использованием следующего кода

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);

Однако, кажется, что оно всегда перекрывается вправо.

enter image description here

Если я настраиваю ширину и высоту ячеек, перекрытие изменяется, но никогда не исчезает

enter image description here

1 Ответ

0 голосов
/ 16 мая 2018

Поэтому я отказался от

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 равна количеству символов (отформатированных с использованием шрифта по умолчанию), которое ячейка может содержать горизонтально.

Например,

enter image description here

Этот столбец имеет длину 12 и может содержать 12 чисел шрифтом Calibri (11).

Это также мой стандарт по умолчанию, так как мой организм по умолчанию - калибри (11) enter image description here

Вот статья , объясняющая это более подробно.

Следующий вопрос заключается в том, как на земле можно перевести это в пиксели.

Сначала нам нужно выяснить, какая длина символа в шрифте по умолчанию.Можно использовать 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% в настройках дисплея

...