2010-04-13 54 views
3

我有一個Excel工作表有兩列,一個是數字,第二列有一張圖片。我想讀取這些數據從C#與oledb連接,我可以很容易地讀取數字,但圖片不包含在第二列,所以在C#我只是得到第一列。使用OLEDB從Excel文件檢索圖片

現在,我怎樣才能讀取圖像?我想從這張excel表格中提取數字和相關圖片。

回答

2

不可能,恐怕。

圖片不在細胞中 - 您可以將它們放置在上方上,並且您可以調整它們的大小以使其看起來像它們在細胞中一樣,但它們絕不佔用那個細胞。

您可以使用VBA和COM互操作來處理工作表的圖像內容,但不能操作OLEDB。

5

這是一個較舊的主題,但我想我會添加一些我的代碼到目前爲止。

這個例子假定你有一個Windows應用程序,你已經在所謂的「pictureBox1」上放置了一個Picturebox。

它還假定您添加對Excel(Microsoft.Office.Interop.Excel)的引用。

圖片被綁定到您的工作簿,而不是像Jay提到的那樣,不屬於自己的單元格的一部分。通過使用TopLeftCell和BottomRightCell,您可以很容易地找到圖像的位置。

現在,您需要編寫一個循環來提取文檔中的所有圖像,但我會將其留給您。

 string file = @"C:\sample.xlsx"; 

     if(System.IO.File.Exists(file)) 
     { 

      Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
      excelApp.Visible = true; //FOR TESTING ONLY 
      Microsoft.Office.Interop.Excel.Workbook wb = excelApp.Workbooks.Open(file, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing, 
           Type.Missing); 

      Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets[1]; //Selects the first sheet 
      Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)ws.Cells[1, 1];  //Select cell A1 
      object cellValue = range.Value2; 

      #region Extract the image 
      Microsoft.Office.Interop.Excel.Picture pic = (Microsoft.Office.Interop.Excel.Picture)ws.Pictures(1); 

      if (pic != null) 
      { 
       //This code will detect what the region span of the image was 
       int startCol = (int)pic.TopLeftCell.Column; 
       int startRow = (int)pic.TopLeftCell.Row; 
       int endCol = (int)pic.BottomRightCell.Column; 
       int endRow = (int)pic.BottomRightCell.Row; 


       pic.CopyPicture(Microsoft.Office.Interop.Excel.XlPictureAppearance.xlScreen, Microsoft.Office.Interop.Excel.XlCopyPictureFormat.xlBitmap); 
       if (Clipboard.ContainsImage()) 
       { 
        Image img = Clipboard.GetImage(); 
        this.pictureBox1.Image = img; 
       } 
      } 
      #endregion 

      //Close the workbook 
      wb.Close(false,Type.Missing,Type.Missing); 

      //Exit Excel 
      excelApp.Quit(); 
     } 
+0

另外:如果你這樣做的,將工作winform,wpf。因爲它需要剪貼板。 (控制檯不起作用) – 2017-04-24 11:14:21

1

Nick's answer與它不是抄襲一點點改變我的web應用程序的工作非常適合我的圖像到剪貼板

Thread thread = new Thread(() => 
       { 
        foreach (var pic in ws.Pictures()) 
        { 
         if (pic != null) 
         { 
          //This code will detect what the region span of the image was 
          int startCol = pic.TopLeftCell.Column; 
          int startRow = pic.TopLeftCell.Row; 
          int endCol = pic.BottomRightCell.Column; 
          int endRow = pic.BottomRightCell.Row; 
          pic.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap); 
          if (Clipboard.GetDataObject() != null) 
          { 
           Image img = Clipboard.GetImage(); 
          } 
         } 
        } 
       }); 
       thread.SetApartmentState(ApartmentState.STA); 
       //Set the thread to STA 
       thread.Start(); 
       thread.Join(); 

對我的作品