как я могу разместить изображение только в одной ячейке с помощью npoi

Я использую npoi для создания документов Excel. У меня есть требование добавлять изображения в ячейки. Используя следующий код, я могу вставлять изображения в свой документ. Однако изображение охватывает множество ячеек. Как я могу убедиться, что изображение просто помещается внутри одной ячейки.

public ActionResult NPOICreate()
{
    try
    {
        FileStream fs = new FileStream(Server.MapPath(@"\Content\NPOITemplate.xls"), FileMode.Open, FileAccess.ReadWrite);
        HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true);
        var sheet = templateWorkbook.GetSheet("Sheet1");
        var patriarch = sheet.CreateDrawingPatriarch();
        HSSFClientAnchor anchor;
        anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)4, 2, (short)6, 5);
        anchor.AnchorType = 2;
        var picture = patriarch.CreatePicture(anchor, LoadImage(@"D:\dev\Website/HumpbackWhale.jpg", templateWorkbook));
        picture.Resize();
        picture.LineStyle = HSSFPicture.LINESTYLE_DASHDOTGEL;
        sheet.ForceFormulaRecalculation = true;
        MemoryStream ms = new MemoryStream();
        templateWorkbook.Write(ms);
        TempData["Message"] = "Excel report created successfully!";
        return File(ms.ToArray(), "application/vnd.ms-excel", "NPOINewFile.xls");
    }
    catch (Exception ex)
    {
        TempData["Message"] = "Oops! Something went wrong.";

        return RedirectToAction("NPOI");
    }

}

person frosty    schedule 18.04.2011    source источник


Ответы (3)


Насколько мне известно, невозможно назначить объект изображения определенной ячейке в Excel.
Это не ограничение POI / NPOI, а скорее способ работы Excel. : Изображения, вставленные в электронную таблицу, просто плавают (по сетке таблицы как таковой) ...
В лучшем случае можно убедить, что они находятся в ячейке, убедившись, что размер и положение ячейки и изображения полностью совпадают. У изображения есть свойство (см. Диалоговое окно «Формат изображения», раздел «Свойства», которое, я уверен, также доступно через POI), которое позволяет указать, будет ли изображение перемещаться и / или изменять свой размер после действий с окружающими его строками / ячейками, но, в конце концов, изображения остаются в лучшем случае плавающим объектом, очень слабо связанным с ячейкой.

Распространенный трюк для присвоения изображения ячейке с помощью комментариев. В этом случае изображение более формально привязано к ячейке, но оно отображается не как содержимое, а как данные комментария.
См., Например, этот рецепт. Идея состоит в том, чтобы использовать фон комментария как цвет со специальным эффектом заливки, который представляет собой изображение, которое мы хотим связать с ячейкой. Здесь снова должен быть способ достичь этого программно с помощью NPOI, но я не могу подтвердить это из первых рук.

person mjv    schedule 18.04.2011

вот что вы можете попробовать:

Вы видите это свойство, anchor.AnchorType = 2 ;? попробуйте установить его на 0 или 3 и посмотрите, что он делает. В порту C # (NPOI) 0 поместит изображение только в одну ячейку с опцией 0.

Вот пример кода (используется в проекте C # Asp.net, на случай, если кто-то зайдет сюда, если он понадобится):

HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet1 = hssfworkbook.CreateSheet(sheetName);
//map the path to the img folder
string imagesPath = System.IO.Path.Combine(Server.MapPath("~"), "img");
//grab the image file
imagesPath = System.IO.Path.Combine(imagesPath, "image.png");
//create an image from the path
System.Drawing.Image image = System.Drawing.Image.FromFile(imagesPath);
MemoryStream ms = new MemoryStream();
//pull the memory stream from the image (I need this for the byte array later)
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
//the drawing patriarch will hold the anchor and the master information
HSSFPatriarch patriarch = sheet1.CreateDrawingPatriarch();
//store the coordinates of which cell and where in the cell the image goes
HSSFClientAnchor anchor = new HSSFClientAnchor(20, 0, 40, 20, 3, 10, 4, 11);
//types are 0, 2, and 3. 0 resizes within the cell, 2 doesn't
anchor.AnchorType = 2;
//add the byte array and encode it for the excel file
int index = hssfworkbook.AddPicture(ms.ToArray(), HSSFPicture.PICTURE_TYPE_PNG);
HSSFPicture signaturePicture = patriarch.CreatePicture(anchor, index);
person Ashley    schedule 12.12.2011

Это возможно в три этапа. Во-первых, вы должны вставить изображение. Во-вторых, добавить ClientAnchor в файл, чтобы разместить изображение в некоторых ячейках. В-третьих, измените размер изображения сложным способом, иначе будет сложно сделать изображение внутри ячейки.

person Tony Qu    schedule 06.11.2013