【问题标题】:Adding images into Excel using EPPlus使用 EPPlus 将图像添加到 Excel
【发布时间】:2016-07-30 06:04:22
【问题描述】:

我正在尝试使用 EPPlus 将同一图像多次添加到 Excel 文件中。我正在使用以下代码:

Image logo = Image.FromFile(path);
ExcelPackage package = new ExcelPackage(info);
var ws = package.Workbook.Worksheets.Add("Test Page");
for(int a = 0; a < 5; a++)
{
    ws.Row(a*5).Height = 39.00D;
    var picture = ws.Drawings.AddPicture(a.ToString(), logo);
    picture.SetPosition(a*5, 0, 2, 0);
}

一切正常,所有图像都正确添加,但它们被向下拉伸。以下是其中一张图片的外观:

但是在excel中是这样的:

我必须调整每张图片开头的每一行的大小,但我认为这不会影响它。有没有办法添加图片/做我想做的事,还是我必须手动复制粘贴图片? (我以图片为例)

谢谢。

【问题讨论】:

  • 你证明宽度是哪个单位?
  • @TusharChhabhaiya 你说的宽度是什么意思?你是说我要改变的每一行的高度吗?
  • 是的,您在哪个单位更改行高?平均 px,cm,point
  • 我不确定它是哪一个,但如果你进入 excel 并重新调整一行的大小,它会显示:Height: ##.## (## Pixels)。我正在更改第一个测量值:Height: 39.00。我希望这是有道理的。
  • 如何在Excel中使用Image Base64格式插入图片? (EPPlus)

标签: c# epplus


【解决方案1】:

我不确定这是否是最佳解决方案,但绝对可以解决您的问题。

这就是我所做的:

ExcelPackage package = new ExcelPackage();
var ws = package.Workbook.Worksheets.Add("Test Page");

for (int a = 0; a < 5; a++)
{
    ws.Row(a * 5).Height = 39.00D;
}

for (int a = 0; a < 5; a++)
{
    var picture = ws.Drawings.AddPicture(a.ToString(), logo);
    picture.SetPosition(a * 5, 0, 2, 0);
}

这是它的外观。

由于某种原因,当我们设置了行高时,它会干扰图片高度。

【讨论】:

  • 哦,我看错了你的帖子。让我看看我是否可以让图像进入行本身。
  • 您是否需要将图像排成一行?
  • 我需要更改行高的唯一原因是因为在我的实际 excel 工作表上,放置图像的同一行上有文本。我只是将此图像用作占位符。
  • 但是这个例子会拉伸图像吗?我不适合我。
  • 这对我来说有点牵强,但我认为那是因为我同时在测试另一个答案。明天我会好好尝试,但现在奖励你赏金,因为它对你有用,如果我不奖励它,它就会消失。
【解决方案2】:

这是您可以在 C# 中应用的一种解决方案。

private void AddImage(ExcelWorksheet oSheet, int rowIndex, int colIndex, string imagePath)
{
    Bitmap image = new Bitmap(imagePath);
    ExcelPicture excelImage = null;
    if (image != null)
    {
        excelImage = oSheet.Drawings.AddPicture("Debopam Pal", image);
        excelImage.From.Column = colIndex;
        excelImage.From.Row = rowIndex;
        excelImage.SetSize(100, 100);
        // 2x2 px space for better alignment
        excelImage.From.ColumnOff = Pixel2MTU(2);
        excelImage.From.RowOff = Pixel2MTU(2);
    }
}

public int Pixel2MTU(int pixels)
{
    int mtus = pixels * 9525;
    return mtus;
}

【讨论】:

    【解决方案3】:

    试试这个

    Image logo = Image.FromFile(path);
    ExcelPackage package = new ExcelPackage(info);
    var ws = package.Workbook.Worksheets.Add("Test Page");
    for(int a = 0; a < 5; a++)
    {
        ws.Row(a*5).Height = 39.00D;
        var picture = ws.Drawings.AddPicture(a.ToString(), logo);
        // xlMove disables the auto resizing
        picture.Placement = xlMove; //XLPlacement : xlMoveAndSize,xlMove,xlFreeFloating
        picture.SetPosition(a*5, 0, 2, 0);
    }
    

    Image logo = Image.FromFile(path);
    ExcelPackage package = new ExcelPackage(info);
    var ws = package.Workbook.Worksheets.Add("Test Page");
    for(int a = 0; a < 5; a++)
    {
        ws.Row(a*5).Height = 39.00D;
        var picture = ws.Drawings.AddPicture(a.ToString(), logo);
        picture.From.Column = 0;
        picture.From.Row = a;
        picture.SetSize(120, 150);
    }
    

    【讨论】:

    • 对于第一个 picture.Placement 不存在。第二个以不同的方式拉伸图像;我试过了:picture.SetSize(logo.Width, logo.Height),图片还是向下拉伸的。
    • @MatthewRz 使用 width = logo.width * 72 / 96 和 height = logo.height * 72 / 96 代替 logo.width 和 logo.height。
    • @TusharChhabhaiya 它仍然会拉伸图像。
    【解决方案4】:

    在保存文档之前添加以下内容:

    foreach (ExcelPicture drawing in ws.Drawings)
       drawing.SetSize(100);
    

    【讨论】:

    【解决方案5】:

    使用以下代码调整 excel 单元格中的图像:

            Image logo = Image.FromFile(path);
            ExcelPackage package = new ExcelPackage(info);
            var ws = package.Workbook.Worksheets.Add("Test Page");
            for(int a = 0; a < 5; a++)
            {
               ws.Row(a*5).Height = 39.00D;
               var picture = ws.Drawings.AddPicture(a.ToString(), logo);
               picture.From.Column = 0;
               picture.From.Row = a;
               picture.To.Column=0;//end cell value
               picture.To.Row=a;//end cell value
               picture.SetSize(120, 150);
            }
    

    【讨论】:

      【解决方案6】:

      当您将示例 39 作为像素传递时,它会将其作为内部像素的插入点,因此您认为您要将行高设置为 39 像素,但实际上它将行高设置为 39 点。因此根据以下公式,您的行高将变为 52 像素。

      如果要将行高设置为 39 像素,则意味着您必须通过 29.25 点(根据公式) insted of 39。

      points = pixels * 72 / 96
      

      试试这个。

      【讨论】:

      • 我正在重新创建一个 Excel 模板,行高为 39 磅。我必须尽可能接近地重新创建它,我的问题是图像向下拉伸。
      • 尝试将行高设置为 29.25 并检查。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2012-11-20
      相关资源
      最近更新 更多