1、帶有DataGridView的窗體,界面如下
2、編寫DataGridView支持拖放的代碼
Private Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Any(Function(f) _String.Equals(Path.GetExtension(f), ".xlsx", StringComparison.OrdinalIgnoreCase)) Thene.Effect = DragDropEffects.CopyEnd IfEnd IfEnd SubPrivate Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragDropTryDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Length > 0 ThenDim excelPath = files(0)If String.Equals(Path.GetExtension(excelPath), ".xlsx", StringComparison.OrdinalIgnoreCase) ThenReadExcelToDataGridView(excelPath)ElseMessageBox.Show("僅支持.xlsx格式的Excel文件")End IfEnd IfCatch ex As ExceptionMessageBox.Show("處理失敗:{0}" & ex.Message)End TryEnd Sub
3、使用OLEDB讀取Excel文件
' 使用OLEDB讀取Excel文件Private Sub ReadExcelToDataGridView(ByVal excelPath As String)DataGridView1.Rows.Clear()Dim connectionString As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""",excelPath)Using connection As New OleDbConnection(connectionString)Tryconnection.Open()Dim sheetName = GetExcelSheetName(connection)If String.IsNullOrEmpty(sheetName) ThenMessageBox.Show("無法獲取Excel工作表名稱")ReturnEnd If'這里指定要讀取excel的工作表標簽名為sheetNameDim query = String.Format("SELECT * FROM [{0}]", sheetName)Dim adapter As New OleDbDataAdapter(query, connection)Dim dataTable As New DataTable()adapter.Fill(dataTable)' 填充DataGridView(跳過標題行)For i As Integer = 0 To dataTable.Rows.Count - 1Dim row = dataTable.Rows(i)Dim id = If(IsDBNull(row(0)), "", row(0).ToString())Dim name = If(IsDBNull(row(1)), "", row(1).ToString())Dim imgPath = If(IsDBNull(row(2)), "", row(2).ToString())Dim img As Image = NothingIf Not String.IsNullOrEmpty(imgPath) AndAlso File.Exists(imgPath) Thenimg = Image.FromFile(imgPath)Elseimg = My.Resources.NoImage ' 需要在項目中添加默認圖片資源End IfDataGridView1.Rows.Add(id, name, img)NextCatch ex As ExceptionMessageBox.Show("讀取Excel失敗:{ex.Message}")End TryEnd UsingEnd Sub' 獲取Excel第一個工作表名稱Private Function GetExcelSheetName(ByVal connection As OleDbConnection) As StringTryDim dataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)If dataTable IsNot Nothing AndAlso dataTable.Rows.Count > 0 ThenReturn dataTable.Rows(0)("TABLE_NAME").ToString()End IfReturn String.EmptyCatchReturn String.EmptyEnd TryEnd Function
4、創建一個Excel文件,這里要求為Excel第一個工作表
5、最終效果
6、完整代碼如下:
Imports System.IO
Imports System.Windows.Forms
Imports System.Data.OleDb ' 使用OLEDB訪問ExcelPublic Class Form3Private Sub MainForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load' 初始化DataGridViewDataGridView1.AllowDrop = TrueDataGridView1.Columns.Add("ID", "編號")DataGridView1.Columns.Add("Name", "名稱")' 添加圖片列Dim imgCol As New DataGridViewImageColumnimgCol.HeaderText = "圖片"imgCol.ImageLayout = DataGridViewImageCellLayout.ZoomDataGridView1.Columns.Add(imgCol)End SubPrivate Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Any(Function(f) _String.Equals(Path.GetExtension(f), ".xlsx", StringComparison.OrdinalIgnoreCase)) Thene.Effect = DragDropEffects.CopyEnd IfEnd IfEnd SubPrivate Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragDropTryDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Length > 0 ThenDim excelPath = files(0)If String.Equals(Path.GetExtension(excelPath), ".xlsx", StringComparison.OrdinalIgnoreCase) ThenReadExcelToDataGridView(excelPath)ElseMessageBox.Show("僅支持.xlsx格式的Excel文件")End IfEnd IfCatch ex As ExceptionMessageBox.Show("處理失敗:{0}" & ex.Message)End TryEnd Sub' 使用OLEDB讀取Excel文件Private Sub ReadExcelToDataGridView(ByVal excelPath As String)DataGridView1.Rows.Clear()Dim connectionString As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""",excelPath)Using connection As New OleDbConnection(connectionString)Tryconnection.Open()Dim sheetName = GetExcelSheetName(connection)If String.IsNullOrEmpty(sheetName) ThenMessageBox.Show("無法獲取Excel工作表名稱")ReturnEnd If'這里指定要讀取excel的工作表標簽名為sheetNameDim query = String.Format("SELECT * FROM [{0}]", sheetName)Dim adapter As New OleDbDataAdapter(query, connection)Dim dataTable As New DataTable()adapter.Fill(dataTable)' 填充DataGridView(跳過標題行)For i As Integer = 0 To dataTable.Rows.Count - 1Dim row = dataTable.Rows(i)Dim id = If(IsDBNull(row(0)), "", row(0).ToString())Dim name = If(IsDBNull(row(1)), "", row(1).ToString())Dim imgPath = If(IsDBNull(row(2)), "", row(2).ToString())Dim img As Image = NothingIf Not String.IsNullOrEmpty(imgPath) AndAlso File.Exists(imgPath) Thenimg = Image.FromFile(imgPath)Elseimg = My.Resources.NoImage ' 需要在項目中添加默認圖片資源End IfDataGridView1.Rows.Add(id, name, img)NextCatch ex As ExceptionMessageBox.Show("讀取Excel失敗:{ex.Message}")End TryEnd UsingEnd Sub' 獲取Excel第一個工作表名稱Private Function GetExcelSheetName(ByVal connection As OleDbConnection) As StringTryDim dataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)If dataTable IsNot Nothing AndAlso dataTable.Rows.Count > 0 ThenReturn dataTable.Rows(0)("TABLE_NAME").ToString()End IfReturn String.EmptyCatchReturn String.EmptyEnd TryEnd Function
End Class
最后說明,Excel中如果使用圖片的絕對路徑,Excel放在任何位置都行。