thongkorn โพสต์ 2019-8-11 12:33:01

[VB.NET] Import ข้อมูลใน Excel เข้ามาแสดงผลในตารางกริด

http://www.g2gnet.com/webboard/images/vbnet/importexceldatagridview.png


การ Import ข้อมูลใน Excel เพื่อนำมาแสดงผลลงตารางกริด แอดมินจะใช้วิธีการมองไฟล์ Excel เป็นเหมือนไฟล์ฐานข้อมูล โดยกำหนด Provider = Microsoft.ACE.OLEDB.12.0 (เราจึงต้องเลือกใช้ Namespace := System.Data.OleDb) จากนั้นเมื่อ Connect เรียบร้อย ก็จะทำการโหลด WorkSheet ซึ่งจะมองเห็นเป็นตารางข้อมูล (Table) เข้ามายัง ComboBox Control จากนั้นผู้ใช้ก็เลือกรายการ WorkSheet เพื่อทำการแสดงผลข้อมูลในตารางกริด ... จบหลักการวิธีคิด


มาดูโค้ดต้นฉบับกันเถอะ ...
Imports System.Data.OleDb

Public Class frmExcel2DataGrid

    ' / --------------------------------------------------------------------
    ' / เลือกไฟล์ Excel
    Private Sub btnOpenExcel_Click(sender As System.Object, e As System.EventArgs) Handles btnOpenExcel.Click
      '/ ประกาศใช้งาน Open File Dialog ในแบบ Run Time
      Dim dlgOpenFile As OpenFileDialog = New OpenFileDialog()

      ' / ตั้งค่าการใช้งาน Open File Dialog
      With dlgOpenFile
            .InitialDirectory = MyPath(Application.StartupPath)
            .Title = "เลือกไฟล์ MS Excel"
            .Filter = "All Files (*.*)|*.*|Excel files (*.xlsx)|*.xlsx|CSV Files (*.csv)|*.csv|XLS Files (*.xls)|*xls"
            .FilterIndex = 1
            .RestoreDirectory = True
      End With
      '/ หากเลือกปุ่ม OK หลังจากการ Browse ...
      If dlgOpenFile.ShowDialog() = DialogResult.OK Then
            txtFileName.Text = dlgOpenFile.FileName
            Dim strConn As String = _
                " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
                dlgOpenFile.FileName & ";" & _
                " Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
            Dim Conn As New OleDbConnection(strConn)
            Conn.Open()
            '/ มอง WorkSheet ให้เป็นตารางข้อมูล (Table)
            Dim dtSheets As DataTable = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
            Dim drSheet As DataRow

            cmbSheetName.Items.Clear()
            '/ นำรายชื่อ WorkSheet ทั้งหมด มาเก็บไว้ที่ ComboBox เพื่อรอให้ User เลือกนำไปใช้งาน
            For Each drSheet In dtSheets.Rows
                cmbSheetName.Items.Add(drSheet("TABLE_NAME").ToString)
            Next
            Conn.Close()
      End If

    End Sub

    ' / --------------------------------------------------------------------
    '// เลือก WorkSheet แล้วแสดงผลข้อมูลลงในตารางกริด
    Private Sub cmbSheetName_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSheetName.SelectedIndexChanged
      Dim Conn As OleDbConnection
      Dim Comm As OleDbCommand
      Dim DAP As OleDbDataAdapter
      Dim DS As DataSet

      Dim strConn As String = _
            " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
            txtFileName.Text & ";" & _
            " Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
      Try
            Conn = New OleDbConnection
            Conn.ConnectionString = strConn
            Comm = New OleDbCommand
            '/ เสมือน WorkSheet เป็น Table ในฐานข้อมูล
            Comm.CommandText = "Select * FROM [" & cmbSheetName.Text & "]"
            Comm.Connection = Conn
            DAP = New OleDbDataAdapter(Comm)
            DS = New DataSet
            Conn.Open()
            DAP.Fill(DS, "Sheet1")
            '/ ผูกข้อมูล (Bound Data) เข้ากับ Sheet1
            dgvData.DataSource = DS.Tables("Sheet1")
            '//
            Call SetupDGVData()

      Catch ex As Exception
            MessageBox.Show(ex.Message)
      Finally
            Conn = Nothing
            Comm = Nothing
            DAP = Nothing
            DS = Nothing
      End Try
    End Sub

    ' / --------------------------------------------------------------------
    '// Initialize DataGridView @Run Time
    Private Sub SetupDGVData()
      With dgvData
            .RowHeadersVisible = False
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .ReadOnly = True
            .Font = New Font("Tahoma", 9)
            ' Autosize Column
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            '// Even-Odd Color
            .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
            ' Adjust Header Styles
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.Black ' Color.White
                .Font = New Font("Tahoma", 9, FontStyle.Bold)
            End With
      End With
    End Sub

    Private Sub frmExcel2DataGrid_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
      Me.Dispose()
      Application.Exit()
    End Sub

    ' / ------------------------------------------------------------------
    ' / ฟังค์ชั่นที่เราสามารถกำหนด Path ให้กับโปรแกรมของเราเอง
    ' / Ex.
    ' / AppPath = C:\My Project\bin\debug
    ' / Replace "\bin\debug" with "\"
    ' / Return : C:\My Project\
    Function MyPath(AppPath As String) As String
      AppPath = AppPath.ToLower()
      MyPath = AppPath.Replace("\bin\debug", "\").Replace("\bin\release", "\")
      '// If not found folder then put the \ (BackSlash ASCII Code = 92) at the end.
      If Microsoft.VisualBasic.Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
    End Function

    Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
      Me.Close()
    End Sub

End Class


ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...

MMEE007 โพสต์ 2019-10-2 22:21:05

ขอบพระคุณคับ :):)

thongkorn โพสต์ 2020-11-4 15:08:01

โค้ดเพิ่มเติม สำหรับคนที่อยากใช้ ListView แทน DataGridView ... เพราะ ListView ไม่สามารถทำการ Bound Data เข้าหาได้โดยตรง ดังนั้นเราต้องทำการวนรอบ (Loop) แทน โดยต้องวนหาจำนวนหลัก (Column) ที่อยู่ทั้งหมดออกมาก่อน จากนั้นก็ค่อยวนรอบตามจำนวนแถวข้อมูลใน Excel ...

เพิ่ม ListView Control เข้ามา 1 ตัว โดยไม่ต้องปรับคุณสมบัติอะไรมาก ... เหตุการณ์การเลือก Sheet (เสมือนตารางข้อมูล) จะเกิดขึ้นที่เหตุการณ์การเปลี่ยนแปลงของ ComboBox ...

    ' / --------------------------------------------------------------------
    '// เลือก WorkSheet แล้วแสดงผลข้อมูลลงใน ListView
    Private Sub cmbSheetName_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSheetName.SelectedIndexChanged
      Dim Conn As OleDbConnection
      Dim DA As OleDbDataAdapter
      Dim DT As New DataTable
      Dim strConn As String = _
            " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
            txtFileName.Text & ";" & _
            " Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
      Try
            Conn = New OleDbConnection
            Conn.ConnectionString = strConn
            If Conn.State = ConnectionState.Closed Then Conn.Open()
            DA = New OleDbDataAdapter("Select * FROM [" & cmbSheetName.Text & "]", Conn)
            DA.Fill(DT)
            With ListView1
                .Clear()
                .View = View.Details
                .GridLines = True
                .FullRowSelect = True
                .HideSelection = False
                .MultiSelect = False
            End With
            '// อ่านจำนวนหลักทั้งหมดเข้ามาก่อน
            For iCol = 0 To DT.Columns.Count - 1
                ListView1.Columns.Add(DT.Columns(iCol).ColumnName)
                '// ปรับระยะความกว้างใหม่
                ListView1.Columns(iCol).Width = ListView1.Width \ (DT.Columns.Count - 1)
            Next
            '// อ่านข้อมูลในแต่ละแถว
            For sRow = 0 To DT.Rows.Count - 1
                Dim LV As New ListViewItem
                Dim dRow As DataRow = DT.Rows(sRow)
                LV = ListView1.Items.Add(dRow.Item(0))'// --> Primary Node
                For iCol = 1 To DT.Columns.Count - 1
                  LV.SubItems.Add(dRow(iCol).ToString())
                Next
            Next
            Conn.Close()
      Catch ex As Exception
            MessageBox.Show(ex.Message)
      Finally
            Conn = Nothing
            DT = Nothing
            DA = Nothing
      End Try
    End Sub

jai โพสต์ 2023-4-6 13:13:36

thank you , sir
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] Import ข้อมูลใน Excel เข้ามาแสดงผลในตารางกริด