我如何使用npoi将图像放在一个单元格中

时间:2011-04-18 16:07:27

标签: asp.net-mvc 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");
    }

}

3 个答案:

答案 0 :(得分:6)

据我所知,无法在Excel中为特定单元格指定图像对象
这不是POI / NPOI的限制,而是Excel的工作方式:插入电子表格中的图片只是 float (通过电子表格网格本身)... <登记/> 通过确保细胞和图片的大小和位置完美匹配,最多可以让人相信它在细胞中。图片有一个属性(参见“格式图片”对话框,属性部分,也可以通过POI访问,我确定),它允许指定图片是否会在其周围的行/单元格上的动作后移动和/或调整大小,但最终, 图片仍然是一个与细胞非常松散相关的浮动物体

将图片分配给单元格的常见技巧 是通过评论。然后,图片更正式地绑定到单元格,但它不是作为内容显示,而是作为评论数据显示 请参阅示例this recipe。这个想法是使用注释的背景作为具有特殊填充效果的颜色,这是我们希望与单元格关联的图像。在这里,必须有一种方法用NPOI以编程方式实现这一点,但我不能直接肯定这一点。

答案 1 :(得分:5)

这是你可以尝试的东西:

你看到那个属性,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);

答案 2 :(得分:0)

可以通过三个步骤完成。 首先,你应该插入图片 其次,将ClientAnchor添加到文件中以将图片定位到某些单元格 第三,使用棘手的方式调整图片大小,否则很难在单元格内制作图片