как я могу поместить изображение только в одну ячейку, используя npoi - PullRequest
4 голосов
/ 18 апреля 2011

Я использую 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");
    }

}

Ответы [ 3 ]

6 голосов
/ 19 апреля 2011

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

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

5 голосов
/ 13 декабря 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);
0 голосов
/ 06 ноября 2013

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

...