web-dev-qa-db-ja.com

EPPlusを使用してExcelに画像を追加する

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

すべてが完全に機能し、すべての画像は正しく追加されますが、下方向に引き伸ばされます。写真の1つは次のようになります。

enter image description here

ただし、Excelでは次のようになります。

enter image description here

各画像の先頭の各行のサイズを変更する必要がありますが、それが影響しているとは思いません。写真を追加したり、やろうとしていることをしたり、手動で画像をコピーして貼り付けたりする方法はありますか? (私は写真を例として使用しています)

ありがとう。

25
matthewr

これが最善の解決策であるかどうかはわかりませんが、間違いなくあなたの問題の回避策です。

私がやったことは次のとおりです。

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

外観は次のとおりです。

enter image description here

何らかの理由で行の高さを設定していると、画像の高さと干渉します。

32
Jack7

これは、C#で適用できる1つのソリューションです。

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;
}
9
Jhonny Nina

ドキュメントを保存する前に、次を追加します。

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

これを試して

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);
}
1
S3ddi9

以下のコードを使用して、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);
        }
1
Bharat Pandey

たとえば、例39をピクセルとして渡すと、内部的にピクセルを挿入したポイントとして取得されます。したがって、行の高さを39ピクセルに設定しようとしていると思いますが、実際には行の高さを39ポイントに設定しています。したがって、次の式に従って、行の高さは52ピクセルになります。

行の高さを39pxに設定する場合は、39の代わりに29.25ポイント(式に従って)を渡す必要があることを意味します。

points = pixels * 72 / 96

これを試してください。

0