首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 讀取 Excel 圖片:無需第三方庫的方案

     編輯:程式設計綜合問答

需求

C# 實現商品數據導入,Excel 中固定列包含商品圖片,需提取第一行圖片。

方案一:Microsoft.Office.Interop.Excel(需安裝 Office)

using Excel = Microsoft.Office.Interop.Excel;

public Image ExtractFirstPicture(string filePath, int pictureColumn = 3) // 1-based
{
    Excel.Application app = new Excel.Application();
    app.Visible = false;
    Excel.Workbook wb = app.Workbooks.Open(filePath);
    Excel.Worksheet ws = (Excel.Worksheet)wb.Sheets[1];

    // 遍歷圖片集合,找到位於指定列、第一行的圖片
    foreach (Excel.Shape shape in ws.Shapes)
    {
        if (shape.Type == Microsoft.Office.Core.MsoShapeType.msoPicture)
        {
            // 獲取圖片左上角單元格地址
            Excel.Range topLeft = shape.TopLeftCell;
            if (topLeft.Row == 1 && topLeft.Column == pictureColumn)
            {
                // 複製圖片到剪貼板再取出
                shape.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap);
                if (Clipboard.ContainsImage())
                {
                    Image img = Clipboard.GetImage();
                    wb.Close(false);
                    app.Quit();
                    return img;
                }
            }
        }
    }
    wb.Close(false);
    app.Quit();
    return null;
}

方案二:NPOI(開源、無需 Office、推薦服務端)

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel; // .xlsx
using NPOI.HSSF.UserModel; // .xls

public Image ExtractWithNPOI(string filePath, int rowIdx = 0, int colIdx = 2) // 0-based
{
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        IWorkbook wb = WorkbookFactory.Create(fs);
        ISheet sheet = wb.GetSheetAt(0);
        // NPOI 直接提取圖片較繁瑣,需解析繪圖關係
        // 簡易方式:若圖片作為單元格背景或批註,可嘗試
        // 完整提取需遍歷 sheet.GetDrawingPatriarch().GetShapes()
        // 此處略過詳細代碼,參考 NPOI 官方示例 "ExtractImages"
    }
    return null;
}

方案三:EPPlus / ClosedXML(僅 .xlsx,API 更友好)

// EPPlus 示例
using OfficeOpenXml;
using OfficeOpenXml.Drawing;

public Image ExtractWithEPPlus(string filePath, int row = 1, int col = 3)
{
    using (var pkg = new ExcelPackage(new FileInfo(filePath)))
    {
        var ws = pkg.Workbook.Worksheets[0];
        foreach (var drawing in ws.Drawings)
        {
            if (drawing is ExcelPicture pic)
            {
                // 檢查圖片錨點是否在目標單元格
                if (pic.From.Row == row && pic.From.Column == col)
                {
                    return pic.Image;  // 直接返回 System.Drawing.Image
                }
            }
        }
    }
    return null;
}

選型建議

方案優點缺點適用場景
Interop.Excel功能最全,完美兼容 .xls/.xlsx需安裝 Office,佔用大,非線程安全,不適合服務端桌面端、已有 Office 環境
NPOI開源、跨平台、無依賴、支持 .xls/.xlsx圖片提取 API 較底層,需較多代碼服務端、Linux 容器、批量處理
EPPlus / ClosedXMLAPI 現代、圖片提取簡單僅支持 .xlsx,EPPlus 5+ 需商業授權.xlsx 為主、追求開發效率

關鍵提示

  • Excel 中圖片是「浮動在單元格上方」,非單元格值,需通過錨點(TopLeftCell/From)定位所在行列。
  • 合併單元格、隱藏行/列會影響錨點計算,提取前建議先 ws.UsedRange 確定實際區域。
  • 服務端嚴禁使用 Interop,請選 NPOI 或 EPPlus。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved