我有一個Excel工作表有兩列,一個是數字,第二列有一張圖片。我想讀取這些數據從C#與oledb連接,我可以很容易地讀取數字,但圖片不包含在第二列,所以在C#我只是得到第一列。使用OLEDB從Excel文件檢索圖片
現在,我怎樣才能讀取圖像?我想從這張excel表格中提取數字和相關圖片。
我有一個Excel工作表有兩列,一個是數字,第二列有一張圖片。我想讀取這些數據從C#與oledb連接,我可以很容易地讀取數字,但圖片不包含在第二列,所以在C#我只是得到第一列。使用OLEDB從Excel文件檢索圖片
現在,我怎樣才能讀取圖像?我想從這張excel表格中提取數字和相關圖片。
不可能,恐怕。
圖片不在細胞中 - 您可以將它們放置在上方上,並且您可以調整它們的大小以使其看起來像它們在細胞中一樣,但它們絕不佔用那個細胞。
您可以使用VBA和COM互操作來處理工作表的圖像內容,但不能操作OLEDB。
這是一個較舊的主題,但我想我會添加一些我的代碼到目前爲止。
這個例子假定你有一個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();
}
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();
對我的作品
另外:如果你這樣做的,將工作winform,wpf。因爲它需要剪貼板。 (控制檯不起作用) – 2017-04-24 11:14:21