求助C#的关于NuGet包EPPlus的问题,无法识别图片

查看 88|回复 8
作者:空竹   
我想通过EPPlus库来识别指定单元格是否包含图片,代码是这样写的
[C#] 纯文本查看 复制代码using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
// 窗口初始化
            InitializeComponent();
            ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            
            // 打开Excel文件
            using (ExcelPackage package = new ExcelPackage(new FileInfo("your_excel_file.xlsx")))
            {
                // 获取工作表
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
                // 检查B2单元格是否包含图片
                bool hasImage = worksheet.Drawings.Any(d => d.From.Column == 2 && d.From.Row == 2 && d is OfficeOpenXml.Drawing.ExcelPicture);
                if (hasImage)
                {
                    MessageBox.Show("B2单元格包含图片。");
                }
                else
                {
                    MessageBox.Show("B2单元格不包含图片。");
                }
            }
        }
    }
}
但不知道为什么,我把图片放在了B2单元格上就是识别不到图片,hasImage返回结果是false,无论是浮动在B2单元格上方还是嵌入到B2单元格中,都不能识别
[i]
求个大佬帮忙
源码和Excel附上
https://wwio.lanzoub.com/iLspc2cj8w2b

单元格, 图片

xiao526   

有没有可能 列号 行号从0开始
wdpjplc   

我觉得楼上说的对~ 一般来说都是从0开始 你不如直接遍历整个表 遇到图片就停止
ps122   


xiao526 发表于 2024-10-14 19:19
我觉得楼上说的对~ 一般来说都是从0开始 你不如直接遍历整个表 遇到图片就停止

@空竹 ,能读取到,但结果是null
wdpjplc   

bool hasImage = worksheet.Drawings.OfType()
                    .Any(p => p.From.Column == 1 && p.From.Row == 1);     B2单元格的索引应该是Column = 1和Row = 1。   试过没?图片的锚定方式:图片可能是以不同的锚定方式插入的,例如oneCellAnchor或twoCellAnchor 一个是嵌入式的 一个是浮于上方.确保图片是OfficeOpenXml.Drawing.ExcelPicture类型。如果图片是其他类型的绘图对象,代码将无法识别
xiao526   


wdpjplc 发表于 2024-10-14 23:00
bool hasImage = worksheet.Drawings.OfType()
                    .Any(p => p.From.Column == 1 && p. ...

这个类库能识别嵌入在单元格内的图片吗,找了很多资料,好像是不支持
ps122   


烟99 发表于 2024-10-15 00:30
这个类库能识别嵌入在单元格内的图片吗,找了很多资料,好像是不支持

在office里试的,没问题,不知道是不是wps的问题
单元格索引是0,0开始的,能找到也能保存。
[C#] 纯文本查看 复制代码                // 遍历图片
                foreach (var drawings in worksheet.Drawings)
                {
                    if (drawings is OfficeOpenXml.Drawing.ExcelPicture)
                    {
                        OfficeOpenXml.Drawing.ExcelPicture excelpicture = drawings as OfficeOpenXml.Drawing.ExcelPicture;
                        Console.WriteLine("找到图片位于:"+ excelpicture.From.Row + "---" + excelpicture.From.Row);  //找到图片位于:1---1
                    }
                }
                bool hasImage = worksheet.Drawings.Any(d => d.From.Column == 1 && d.From.Row == 1 && d is OfficeOpenXml.Drawing.ExcelPicture);
                //hasImage = worksheet.Drawings.Any(d => d is OfficeOpenXml.Drawing.ExcelPicture);
                if (hasImage)
                {
                    OfficeOpenXml.Drawing.ExcelPicture _excelpicture = (OfficeOpenXml.Drawing.ExcelPicture)worksheet.Drawings.Where(
                         d => d.From.Column == 1 && d.From.Row == 1 && d is OfficeOpenXml.Drawing.ExcelPicture).FirstOrDefault();
                    Image image = _excelpicture.Image;
                    image.Save("logo.png");
                    MessageBox.Show("B2单元格包含图片。");
                }
                else
                {
                    MessageBox.Show("B2单元格不包含图片。");
                }
wdpjplc   

 
using OfficeOpenXml;
using System;
using System.IO;
class Program
{
    static void Main(string[] args)
    {
        // Excel 文件的路径
        var filePath = @"path\to\your\excel\file.xlsx";
        // 使用 EPPlus 打开现有的 Excel 文件
        using (var package = new ExcelPackage(new FileInfo(filePath)))
        {
            // 获取第一个工作表
            var worksheet = package.Workbook.Worksheets[0];
            // 获取工作表中的所有图片
            var drawings = worksheet.Drawings;
            // 遍历所有图片
            foreach (var drawing in drawings)
            {
                // 检查图片是否在 B2 单元格内
                if (IsImageInB2Cell(drawing))
                {
                    // 找到图片,执行相关操作
                    Console.WriteLine("图片找到,位置在 B2 单元格。");
                    // 如果需要保存图片
                    var image = drawing.Image;
                    var imageBytes = image.ImageBytes;
                    File.WriteAllBytes(@"path\to\save\image.png", imageBytes);
                }
            }
        }
    }
    // 检查图片是否在 B2 单元格内
    private static bool IsImageInB2Cell(ExcelPicture picture)
    {
        // 检查图片是否使用 OneCellAnchor
        if (picture.IsAnchored)
        {
            var oneCellAnchor = picture.OneCellAnchor;
            // 检查图片是否在 B2 单元格
            if (oneCellAnchor.From.Column == 2 && oneCellAnchor.From.Row == 2)
            {
                return true;
            }
        }
        // 检查图片是否使用 TwoCellAnchor
        else
        {
            var twoCellAnchor = picture.TwoCellAnchor;
            // 检查图片是否完全在 B2 单元格内
            if (twoCellAnchor.From.Column == 2 && twoCellAnchor.From.Row == 2 &&
                twoCellAnchor.To.Column == 2 && twoCellAnchor.To.Row == 2)
            {
                return true;
            }
        }
        return false;
    }
}
 参考下 ai给的代码
wdpjplc   


wdpjplc 发表于 2024-10-15 08:52
 
using OfficeOpenXml;
using System;

AI就算了,很抱歉没有帮到我的忙
您需要登录后才可以回帖 登录 | 立即注册

返回顶部