我有一个包含两列的Excel工作表,一个是数字,第二列有一个图片。 我想通过oledb连接从c#中读取这些数据,我可以轻松读取数字,但是第二列中没有包含图片,所以在c#中我只得到第一列。
现在,我该如何阅读图片?我想从这张excel表中提取数字和相关图像。
答案 0 :(得分:6)
这是一个较旧的主题,但我想我到目前为止会添加一些代码。
此示例假设您有一个Windows应用程序,您已将Picturebox放在名为“pictureBox1”的位置。
它还假设您添加对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();
}
答案 1 :(得分:3)
不可能,我很害怕。
图片不会存在于单元格中 - 您可以将它们放在单元格上,然后您可以将它们调整为看起来像是在单元格中,但它们绝不会占用该单元格。< / p>
您可以使用VBA和COM互操作来操作工作表的图像内容,但不能使用OLEDB。
答案 2 :(得分:1)
Nick's answer 在我的网络应用程序中对我很有用,只需稍加改动就不会将图像复制到剪贴板
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();
为我工作