How to place an image in cell basically in excel there is a feature Place in cell in case of image how to do that in aspose c#

I have a excel sheet containing image now I want copy that image paste into another sheet cell and place the image in cell…how to do that?

@Soumen2001,

Could you please share a sample Excel file containing the image into a cell and point out where in worksheet cell you want to copy the image (fitted into the cell)? Also, give us your expected Excel file in which the image is well copied/place into other worksheet cell. We will check on how to do it via Aspose.Cells APIs.

PS. please zip the Excel file prior attaching.

@Soumen2001
We have opened the following new ticket(s) in our internal issue tracking system and will deliver their fixes according to the terms mentioned in Free Support Policies.

Issue ID(s): CELLSNET-55066

You can obtain Paid Support Services if you need support on a priority basis, along with the direct access to our Paid Support management team.

@Soumen2001
This feature (“Place in Cell” menu in ms excel) is not supported for now. As an alternative, you can refer to the following sample code to implement the requirements. Please refer to the attachment. result.zip (127.9 KB)

The sample code as follows:

Workbook wb = new Workbook(filePath + "sample.xlsx");
int index = wb.Worksheets.Add();
Worksheet destSheet = wb.Worksheets[index];
Cells destCells = destSheet.Cells;
PictureCollection pictures = wb.Worksheets[0].Pictures;


Picture picture = pictures[0]; //the picture at the first worksheet
Cell destCell = destCells[8, 5];
Shape shape = destSheet.Shapes.AddCopy(picture, destCell.Row, 0, destCell.Column, 0);
int columnWidth = destCells.GetColumnWidthPixel(destCell.Column);
int rowHeight = destCells.GetRowHeightPixel(destCell.Row);
Range range = destCell.GetMergedRange();
if (range != null)
{
    for (int c = range.ColumnCount - 1; c > 0; c--)
    {
        columnWidth += destCells.GetColumnWidthPixel(range.FirstColumn + c);
    }
    for (int r = range.RowCount - 1; r > 0; r--)
    {
        rowHeight += destCells.GetRowHeightPixel(range.FirstRow + r);
    }
}
if (picture.Width / (double)picture.Height < columnWidth / (double)rowHeight)
{
    shape.Height = rowHeight;
    int percentWidth = (int)(picture.Width / (double)picture.Height * rowHeight);
    shape.Width = percentWidth;
    int left = (columnWidth - percentWidth) >> 1;
    if (range != null && range.ColumnCount > 1)
    {
        columnWidth = destCells.GetColumnWidthPixel(range.FirstColumn);
        if (left > columnWidth)
        {
            for (int c = 1; c < range.ColumnCount; c++)
            {
                left -= columnWidth;
                columnWidth = destCells.GetColumnWidthPixel(range.FirstColumn + c);
                if (left < columnWidth)
                {
                    shape.UpperLeftColumn = range.FirstColumn + c;
                    shape.Left = left;
                    break;
                }
            }
        }
        else
        {
            shape.Left = left;
        }
    }
}
else
{
    shape.Width = columnWidth;
    int percentHeight = (int)(picture.Height / (double)picture.Width * columnWidth);
    shape.Height = percentHeight;
    int top = (rowHeight - percentHeight) >> 1;
    if (range != null && range.RowCount > 1)
    {
        rowHeight = destCells.GetRowHeightPixel(range.FirstRow);
        if (top > rowHeight)
        {
            for (int r = 1; r < range.RowCount; r++)
            {
                top -= rowHeight;
                rowHeight = destCells.GetRowHeightPixel(range.FirstRow + r);
                if (top < rowHeight)
                {
                    shape.UpperLeftRow = range.FirstRow + r;
                    shape.Top = top;
                    break;
                }
            }
        }
        else
        {
            shape.Top = top;
        }
    }
}

wb.Save(filePath + "out_net.xlsx");

Hope helps a bit.

no this is not working…picture is covering the cell border

@Soumen2001
You can add boundary tolerance when setting the image position to fine tune the position. Please review the result file. out_net.zip (65.4 KB)

The sample code as follows:

Workbook wb = new Workbook(filePath + "sample.xlsx");
int index = wb.Worksheets.Add();
Worksheet destSheet = wb.Worksheets[index];
Cells destCells = destSheet.Cells;
PictureCollection pictures = wb.Worksheets[0].Pictures;

int toleranceEdge = 1;
Picture picture = pictures[0]; //the picture at the first worksheet
Cell destCell = destCells[8, 5];
            
Shape shape = destSheet.Shapes.AddCopy(picture, destCell.Row, toleranceEdge, destCell.Column, toleranceEdge);
int columnWidth = destCells.GetColumnWidthPixel(destCell.Column);
int rowHeight = destCells.GetRowHeightPixel(destCell.Row);
Range range = destCell.GetMergedRange();
if (range != null)
{
    for (int c = range.ColumnCount - 1; c > 0; c--)
    {
        columnWidth += destCells.GetColumnWidthPixel(range.FirstColumn + c);
    }
    for (int r = range.RowCount - 1; r > 0; r--)
    {
        rowHeight += destCells.GetRowHeightPixel(range.FirstRow + r);
    }
}
if (picture.Width / (double)picture.Height < columnWidth / (double)rowHeight)
{
    shape.Height = rowHeight - toleranceEdge * 2;
    int percentWidth = (int)(picture.Width / (double)picture.Height * rowHeight);
    shape.Width = percentWidth - toleranceEdge * 2;
    int left = (columnWidth - percentWidth) >> 1;
    if (range != null && range.ColumnCount > 1)
    {
        columnWidth = destCells.GetColumnWidthPixel(range.FirstColumn);
        if (left > columnWidth)
        {
            for (int c = 1; c < range.ColumnCount; c++)
            {
                left -= columnWidth;
                columnWidth = destCells.GetColumnWidthPixel(range.FirstColumn + c);
                if (left < columnWidth)
                {
                    shape.UpperLeftColumn = range.FirstColumn + c;
                    shape.Left = left;
                    break;
                }
            }
        }
        else
        {
            shape.Left = left;
        }
    }
}
else
{
    shape.Width = columnWidth - toleranceEdge * 2;
    int percentHeight = (int)(picture.Height / (double)picture.Width * columnWidth);
    shape.Height = percentHeight - toleranceEdge * 2;
    int top = (rowHeight - percentHeight) >> 1;
    if (range != null && range.RowCount > 1)
    {
        rowHeight = destCells.GetRowHeightPixel(range.FirstRow);
        if (top > rowHeight)
        {
            for (int r = 1; r < range.RowCount; r++)
            {
                top -= rowHeight;
                rowHeight = destCells.GetRowHeightPixel(range.FirstRow + r);
                if (top < rowHeight)
                {
                    shape.UpperLeftRow = range.FirstRow + r;
                    shape.Top = top;
                    break;
                }
            }
        }
        else
        {
            shape.Top = top;
        }
    }
}

wb.Save(filePath + "out_net.xlsx");

We will continue to investigate and analyze your issue and notify you immediately once there are any updates.

out_net.zip (92.4 KB)
I just want output like this

@Soumen2001
Thanks for further details. Let us investigate and analyze your issue in details. Once we have an update on it, we will let you know.

Is there any update?

@Soumen2001
No updates on your issue. Once we have any new information, we will share it with you. We will get back to you soon.

@Soumen2001
At present, Aspose.Cells doesn’t support placing an image in cell. This is a relatively complex feature, and we need more time to analyze and study it. We strive to support this feature in the second quarter of 2024. Sorry for any inconvenience caused to you.

@Soumen2001
Please try the latest version 24.3

  Workbook workbook = new Workbook();
            workbook.Worksheets[0].Cells["B3"].EmbeddedImage = File.ReadAllBytes("2.png");
            workbook.Save("dest.xlsx");

The issues you have found earlier (filed as CELLSNET-55066) have been fixed in this update. This message was posted using Bugs notification tool by johnson.shi

A post was split to a new topic: Placing the picture is disorienting the Excel file

input.zip (29.2 KB)

in this file I can not retrive any picture from it, It is present in the “sheet2” Q column
why sheet.Pictures.Count is showing 0?

@Soumen2001
The image embedded in a cell belongs to the data on the cell. They will not be stored in the Worksheet.Pictures collection. Please refer to the following to access image data.

Workbook workbook = new Workbook(filePath + "input.xlsm");

Worksheet sheet = workbook.Worksheets["Sheet2"];
IEnumerator iter = sheet.Cells.GetCellsWithPlaceInCellPicture();
while (iter.MoveNext())
{
    Cell cell =  (Cell)iter.Current;
    Console.WriteLine(cell.Name + "  cell picture data length: " + cell.EmbeddedImage.Length);
}

The output:

Q2  cell picture data length: 2474
Q3  cell picture data length: 815
Q4  cell picture data length: 3586
Q5  cell picture data length: 1359
Q6  cell picture data length: 754
Q7  cell picture data length: 1031
Q8  cell picture data length: 960
Q9  cell picture data length: 1024
Q10  cell picture data length: 2655
Q11  cell picture data length: 2081
Q12  cell picture data length: 1468
Q13  cell picture data length: 2474
Q14  cell picture data length: 815
Q15  cell picture data length: 3586
Q16  cell picture data length: 1359
Q17  cell picture data length: 754
Q18  cell picture data length: 1031
Q19  cell picture data length: 960
Q20  cell picture data length: 1024
Q21  cell picture data length: 2655
Q22  cell picture data length: 2081
Q23  cell picture data length: 1468

Hope helps a bit.