2016-08-22 28 views
0

我目前有一個SQL數據庫中的產品列表,其中一個字段是一個包含產品圖像的blob字段,我將它存儲並使用Byte []數組進行檢索,並且圖像從PNG格式。用戶查看產品時在網站上顯示圖像工作正常。如何使用C#在Excel中嵌入圖像?

什麼客戶現在想雖然是所有的產品到Excel中,包括要顯示每行的每個產品在圖像的出口,可以說F列

我沒有找到任何信息在線似乎工作 - 示例代碼總是有錯誤或引用的東西,我不能找到,這讓我不知道是否有版本問題。我目前正在使用Visual Studio 2010和Office 2010來測試它。

我看過一些示例,展示瞭如何將圖像粘貼到剪貼板並粘貼,但考慮到這將運行在Web服務器上,並且一次可能需要處理20個左右的產品,所以我沒有確定剪貼板將是一個Web服務器的好主意?

我更願意能夠直接從Byte []數組寫入到excel文件中,因爲我拉動了所有其他產品數據。

在我更新網站上的代碼之前,我想用一個簡單的控制檯程序在本地測試它。一旦我知道我可以將圖像導入到Excel中,我可能會寫一個我可以在aspx頁面上引用的dll庫。

 var xlApp = new Excel.Application(); 
     Excel.Workbook xlWorkBook = xlApp.Workbooks.Add(); 
     Excel.Worksheet xlWorkSheet = xlWorkBook.Worksheets[1]; 

     byte[] imgdata = File.ReadAllBytes("product.png"); 

     //what do I enter here to insert the image into cell[1,1] 

     xlWorkBook.SaveAs("abc.xlsx"); 
     xlWorkBook.Close(true); 
     xlApp.Quit(); 

     Marshal.ReleaseComObject(xlApp); 

回答

0

的關鍵是,如果你想使用硬盤上的字節數據,而不是文件來使用,而不是使用AddPicture工作表粘貼功能:

Bitmap bmp; 
using (var ms = new MemoryStream(imgdata)) 
{ 
    bmp = new Bitmap(ms); 
    System.Windows.Forms.Clipboard.SetDataObject(bmp, False); 
    var rng = xlWorkSheet.Range("A1"); 
    xlWorkSheet.Paste(rng, bmp); 
} 
+0

將使用剪貼板是可取的在網頁上運行? –

+0

我得到錯誤「在進行OLE調用之前,當前線程必須設置爲單線程單元(STA)模式。確保您的Main函數具有標記的STAThreadAttribute。」 - 這與另一個線索類似,我看到了剪貼板的建議,那個人說他正在努力讓它在aspx頁面上工作。 –

+0

如果您使用像剪貼板這樣的OLE調用,則必須在方法上添加[STAThread]。 https://social.msdn.microsoft.com/Forums/windows/en-US/2411f889-8e30-4a6d-9e28-8a46e66c0fdb/current-thread-must-be-set-to-single-thread-apartment-sta-模式之前,OLE?論壇= CLR –