c# NPOI 如何在指定单元格导入导出图片

yizhihongxing

好的!下面是关于“c# NPOI 如何在指定单元格导入导出图片”的完整攻略。

1. 背景

NPOI是一款用于操作office文档的开源组件,它支持对Word、Excel、PowerPoint等文件的读取和写入。在Excel文件中,常常需要在单元格中插入图片,并且在需要时可以导出这些图片。本攻略将介绍如何使用c# NPOI在指定单元格中导入导出图片。

2. 导入图片

首先,我们需要将图片导入到Excel文件中。这可以通过以下步骤实现:

2.1 使用MemoryStream将图片转换为byte数组

MemoryStream ms = new MemoryStream();
Bitmap bmp = new Bitmap(imageFilePath);
bmp.Save(ms, ImageFormat.Jpeg);
byte[] imageData = ms.ToArray();

2.2 在单元格中插入图片

使用NPOI的HSSFWorkbookXSSFWorkbook对象,可以很容易地在Excel文件中插入图片:

HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, column, row, column, row);
anchor.AnchorType = AnchorType.MoveAndResize;

int pictureIndex = workBook.AddPicture(imageData, PictureType.JPEG);
HSSFPicture picture = patriarch.CreatePicture(anchor, pictureIndex);
picture.Resize();
picture.LineStyle = LineStyle.None;

其中,columnrow分别是想要将图片插入的单元格的列和行索引。

3. 导出图片

接下来,我们需要导出已经插入到Excel文件中的图片。这可以通过以下步骤实现:

3.1 获取单元格中插入的图片

使用NPOI的HSSFPatriarch对象,可以获取指定单元格中插入的图片:

HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
HSSFClientAnchor anchor = patriarch.GetClientAnchorForPic(picture);
int pictureIndex = anchor.GetPictureIndex();

其中,picture是指想要获取的图片。

3.2 导出图片

使用NPOI的HSSFWorkbookXSSFWorkbook对象,可以将图片导出到本地文件:

HSSFPictureData pictureData = (HSSFPictureData)workbook.GetAllPictures()[pictureIndex];
string extension = pictureData.SuggestFileExtension();
string fileName = "picture." + extension;
using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
    fs.Write(pictureData.Data, 0, pictureData.Data.Length);
}

通过pictureIndex获取到pictureData,然后通过SuggestFileExtension()方法获取图片格式的扩展名。最后通过FileStreampictureData.Data写入到一个文件中,即可完成图片的导出操作。

4. 示例说明

下面给出两个示例,分别演示如何在指定单元格中导入图片和如何导出图片。

4.1 示例1:导入图片

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet("Sheet1");

            // 导入图片
            string imageFilePath = "C:/test/image.jpg";
            byte[] imageData = GetImageData(imageFilePath);
            InsertImage(workbook, sheet, imageData, 2, 2);

            // 保存Excel文件
            FileStream fs = new FileStream("C:/test/Book1.xls", FileMode.Create, FileAccess.Write);
            workbook.Write(fs);
            fs.Close();
        }

        static byte[] GetImageData(string imageFilePath)
        {
            MemoryStream ms = new MemoryStream();
            Bitmap bmp = new Bitmap(imageFilePath);
            bmp.Save(ms, ImageFormat.Jpeg);
            byte[] imageData = ms.ToArray();
            return imageData;
        }

        static void InsertImage(HSSFWorkbook workbook, ISheet sheet, byte[] imageData, int row, int column)
        {
            HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
            style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
            style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
            HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, column, row, column, row);
            anchor.AnchorType = AnchorType.MoveAndResize;

            int pictureIndex = workbook.AddPicture(imageData, PictureType.JPEG);
            HSSFPicture picture = patriarch.CreatePicture(anchor, pictureIndex);
            picture.Resize();
            picture.LineStyle = LineStyle.None;
        }
    }
}

在该示例中,我们从本地文件系统中获取一张图片,然后调用InsertImage方法将图片插入到单元格(2,2)中。最后保存Excel文件。

4.2 示例2:导出图片

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.IO;

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet("Sheet1");

            // 导入图片
            string imageFilePath = "C:/test/image.jpg";
            byte[] imageData = GetImageData(imageFilePath);
            InsertImage(workbook, sheet, imageData, 2, 2);

            // 导出图片
            ExportImage(workbook, 2, 2);

            // 保存Excel文件
            FileStream fs = new FileStream("C:/test/Book1.xls", FileMode.Create, FileAccess.Write);
            workbook.Write(fs);
            fs.Close();
        }

        static byte[] GetImageData(string imageFilePath)
        {
            MemoryStream ms = new MemoryStream();
            Bitmap bmp = new Bitmap(imageFilePath);
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] imageData = ms.ToArray();
            return imageData;
        }

        static void InsertImage(HSSFWorkbook workbook, ISheet sheet, byte[] imageData, int row, int column)
        {
            HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
            style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
            style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
            HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, column, row, column, row);
            anchor.AnchorType = AnchorType.MoveAndResize;

            int pictureIndex = workbook.AddPicture(imageData, PictureType.JPEG);
            HSSFPicture picture = patriarch.CreatePicture(anchor, pictureIndex);
            picture.Resize();
            picture.LineStyle = LineStyle.None;
        }

        static void ExportImage(HSSFWorkbook workbook, int row, int column)
        {
            HSSFPatriarch patriarch = (HSSFPatriarch)workbook.GetSheet("Sheet1").CreateDrawingPatriarch();
            HSSFPicture picture = null;

            for (int i = 0; i < patriarch.Children.Count; i++)
            {
                if (patriarch.Children[i] is HSSFPicture)
                {
                    picture = (HSSFPicture)patriarch.Children[i];
                    HSSFClientAnchor anchor = patriarch.GetClientAnchorForPic(picture);
                    if (anchor.Row1 == row && anchor.Col1 == column)
                    {
                        HSSFPictureData pictureData = (HSSFPictureData)workbook.GetAllPictures()[picture.PictureIndex];
                        string extension = pictureData.SuggestFileExtension();
                        string fileName = "C:/test/picture." + extension;
                        using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                        {
                            fs.Write(pictureData.Data, 0, pictureData.Data.Length);
                        }
                        break;
                    }
                }
            }
        }
    }
}

在该示例中,我们先用InsertImage方法将图片插入到单元格(2,2)中,然后调用ExportImage方法将图片导出到本地文件系统中。

综上,以上就是如何在c# NPOI中导入导出图片的攻略,希望能对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# NPOI 如何在指定单元格导入导出图片 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C# Linq的Select()方法 – 将序列中的每个元素投影到新形式中

    C# Linq中的Select()是一个用于在查询中选择特定数据,提取它们并创建新的数据结构的方法。该方法可以将集合、列表、数组等多种数据类型中的数据进行选择、投影、转换和过滤,在实际应用中非常实用。下面是详细讲解C#Linq的Select()的完整攻略: 一、Select()简介 Select()方法是Linq中最常用的方法之一,用于对序列中的每个元素应用…

    C# 2023年4月19日
    00
  • C# StringBuilder.Clear()方法: 清空 StringBuilder 对象的内容

    StringBuilder.Clear()是一个C#中StringBuilder类中的方法,它的作用是清空该StringBuilder实例中的字符串缓存区,以便新的字符串能够追加到缓存区中。 其使用方法非常简单,在调用该方法时,所有的缓存字符串都会被清空,代码实现如下: StringBuilder sb = new StringBuilder(); sb.A…

    C# 2023年4月19日
    00
  • .Net弹性和瞬态故障处理库Polly实现执行策略

    首先,先简单介绍一下Polly库,Polly是一个.NET弹性和瞬态故障处理库,旨在通过多种执行策略和故障处理机制,帮助我们更好地管理应用程序的异常和故障。以下是实现执行策略的完整攻略: 特殊说明 在本文攻略中,我们将使用Polly库来创建并指定执行策略以处理瞬态故障。在使用Polly时,我们需要先安装Polly库。 步骤一:引用Polly库 首先需要在我们…

    C# 2023年5月15日
    00
  • WPF实现文本描边+外发光效果的示例代码

    WPF(Windows Presentation Foundation)是一种用于创建Windows桌面应用程序的技术。WPF提供了丰富的UI元素和效果,可以轻松实现文本描边和外发光效果。本文将提供WPF实现文本描边和外发光效果的完整攻略,包括创建WPF应用程序、实现文本描边、实现外发光效果、示例等。 创建WPF应用程序 要创建WPF应用程序,可以使用Vis…

    C# 2023年5月15日
    00
  • C#实现写入文本文件内容的方法

    当需要将数据写入本地文本文件时,常用的语言之一是C#。C# 为文件读写提供了方便易用的功能,使得将数据写入文本文件变得十分简单。以下是如何使用 C# 实现写入文本文件内容的方法: 1. 语法 C# 提供了 StreamWriter 类,用于将文本数据写入文件。它在 System.IO 命名空间下。 使用 StreamWriter 类之前,需要先创建一个文本文…

    C# 2023年6月1日
    00
  • VS Code里使用Debugger for Unity插件调试的方法(2023最新版)

    下面是详细的“VS Code里使用Debugger for Unity插件调试的方法(2023最新版)”攻略: 一、前置条件 在开始使用 Debugger for Unity 插件前,需要先满足以下条件: 安装 Visual Studio Code 和 Unity,建议下载最新版本。 安装 .NET Framework、Unity Debugger 和 De…

    C# 2023年5月31日
    00
  • C# Path.GetFullPath – 获取路径的完整路径

    Path.GetFullPath 方法是 .NET 中用于获取给定路径的完整路径的静态方法。它将解析任何相对路径,并将其转换为绝对路径。 使用该方法时,可以传递一个字符串类型的路径作为参数,它将返回一个字符串类型的绝对路径。 例如,在 Windows 操作系统下,将字符串 “myFolder/myFile.txt” 作为参数传递给 Path.GetFullP…

    C# 2023年4月19日
    00
  • C#中使用Spire.XLS来操作Excel数据的实现

    让我来详细讲解一下“C#中使用Spire.XLS来操作Excel数据的实现”的完整攻略。 一、Spire.XLS简介 Spire.XLS是一个功能强大的.NET组件,能够帮助C#开发者快速创建、读取、修改和保存Microsoft Excel文件。它支持Excel文件的多个版本,包括Excel 97-2003、Excel 2007-2010和Excel 201…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部