thongkorn โพสต์ 2023-11-14 12:45:24

[VB.NET] การโหลดหลายๆชีตของไฟล์ Excel เพื่อนำมาแสดงผลลงใน ListView Control

http://www.g2gsoft.com/webboard/images/VBNet/excel2listview.png


การโหลดหลายๆชีตของไฟล์ Excel เพื่อนำมาแสดงผลลงใน Listview Control ซึ่งจะมีวิธีในการโหลดข้อมูลหลักๆอยู่ 2 แบบ คือ แบบแรกให้มอง Sheet เป็นเหมือนตารางข้อมูล ดังนั้นจึงต้องใช้ ADO.NET ทำการเชื่อมต่อเข้ากับไฟล์ Excel แบบที่ 2 คือมองเป็นไฟล์ Excel นั่นแหละ โดยใช้ Interop เข้าช่วย สำหรับโค้ดชุดนี้แอดมินจะเลือกวิธีแรกมาทำให้ดูเป็นตัวอย่างก่อน ...

หลักการมีอยู่ว่า 1 Sheet ก็เหมือนกับ 1 DataTable และหลายๆ DataTable จะรวมเข้ากันเป็น 1 DataSet ซึ่งก็จะถูกโหลดข้อมูลเข้ามาเก็บเอาไว้ในหน่วยความจำ และทำการตัดการเชื่อมต่อ หรือ Connection ออกไปได้เลย ... ก่อนที่เราจะนำข้อมูลมาใส่ลงใน ListView Control เราจะต้องลูปหาจำนวนหลัก (Column) และสร้างหลักขึ้นมาก่อนตามจำนวนที่มีอยู่ หรือ เราสามารถเลือกเฉพาะบางหลักที่อยู่ใน Excel มาสร้างเองเลยก็ได้ ...


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

Public Class frmExcel2ListView
    '// ประกาศ Object DataSet
    Dim DS As DataSet = New DataSet()

    ' / --------------------------------------------------------------------------------
    ' / เลือกไฟล์ 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 = "XLSX Files (*.xlsx)|*.xlsx|XLS Files (*.xls)|*xls"
            .FilterIndex = 1
            .RestoreDirectory = True
      End With
      '/ หากเลือกปุ่ม OK หลังจากการ Browse ...
      If dlgOpenFile.ShowDialog() = DialogResult.OK Then
            txtFileName.Text = dlgOpenFile.FileName '// แสดงรายชื่อไฟล์ Excel และพาธ
            Dim strConn As String = _
                " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dlgOpenFile.FileName & ";" & _
                " Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
            Try
                Dim Conn As New System.Data.OleDb.OleDbConnection(strConn)
                Conn.Open()
                '//
                cmbSheetName.Items.Clear()'// เคลียร์ไอเทมใน ComboBox
                ListView1.Columns.Clear()   '// เคลียร์หลักใน ListView เพื่อเริ่มต้นการแสดงผลใหม่
                '// เคลียร์ค่า Table/Query ของเดิมใน DataSet ก่อนใช้งานใหม่
                '// หรือหากให้เพิ่มตารางข้อมูล/คิวรี่ จากไฟล์อื่นเข้าไป ก็ตัดบรรทัดนี้ทิ้งออกไปได้เลย แต่ต้องเช็คว่ามีอยู่ใน DataSet แล้วหรือไม่
                DS = New DataSet()
                '/ มอง WorkSheet ให้เป็นเหมือนตารางข้อมูล (Table)
                Dim dtSheets As System.Data.DataTable = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
                '/ วนลูปในแต่ละ Sheet ตามที่มีอยู่ เพื่อโหลดข้อมูลเข้าสู่ DataSet
                For Each drSheet As DataRow In dtSheets.Rows
                  Dim sheetName As String = drSheet("TABLE_NAME").ToString()
                  '// นำรายชื่อ WorkSheet ทั้งหมด มาเก็บไว้ที่ ComboBox เพื่อรอให้ User เลือกนำไปใช้งาน
                  cmbSheetName.Items.Add(sheetName)
                  '// สร้าง Data Adapter เพื่อเก็บ Sheet ปัจจุบัน
                  Dim DA As New OleDbDataAdapter("SELECT * FROM [" & sheetName & "]", Conn)
                  '/ สร้าง DataTable เพื่อเก็บตารางข้อมูลจาก Sheet ปัจจุบัน
                  Dim DT As New System.Data.DataTable(sheetName)
                  '// นำข้อมูลจาก Sheet ไปเก็บไว้ใน DataTable
                  DA.Fill(DT)
                  '// นั่นก็คือเรานำ DataTable หลายๆตัวไปเก็บไว้ใน DataSet ได้ และจะอ้างอิงถึงตารางแต่ละตัวด้วยชื่อ Sheet
                  DS.Tables.Add(DT)
                  DA.Dispose()
                Next
                Conn.Close()
            Catch ex As Exception
                ' Handle any exceptions that may occur during the process
                MessageBox.Show("An error occurred: " & ex.Message)
            End Try
      End If
    End Sub

    ' / --------------------------------------------------------------------------------
    '// เลือก WorkSheet หรือ DataTable เพื่อแสดงผลข้อมูลลงใน ListView
    ' / --------------------------------------------------------------------------------
    Private Sub cmbSheetName_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSheetName.SelectedIndexChanged
      '// Initialize ListView.
      With ListView1
            .Clear()
            .View = View.Details
            .GridLines = True
            .FullRowSelect = True
            .HideSelection = False
            .MultiSelect = False
      End With
      Try
            '/ โหลดข้อมูล DataTable แต่ละตัว ตามชื่อที่มีอยู่ใน DataSet
            Dim DT As DataTable = DS.Tables(cmbSheetName.Text)
            '// อ่านจำนวนหลักทั้งหมดเข้ามาก่อนเพื่อสร้าง Column ให้กับ ListView
            For iCol = 0 To DT.Columns.Count - 1
                ListView1.Columns.Add(DT.Columns(iCol).ColumnName)
            Next
            '// เมื่อมีหลัก (Column) เรียบร้อยแล้ว ต่อไปก็อ่านข้อมูลในแต่ละแถว (Row) เข้ามา
            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
            '// ปรับความกว้างของ Column ในการแสดงผลบน ListView
            ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
      Catch ex As Exception
            MessageBox.Show(ex.Message)
      End Try
    End Sub

    ' / --------------------------------------------------------------------------------
    ' / เหตุการณ์ Double Click Mouse บน ListView เพื่อแสดงผลข้อมูลในแถวรายการที่เลือก
    ' / --------------------------------------------------------------------------------
    Private Sub ListView1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListView1.DoubleClick
      MessageBox.Show( _
            "Column 0: " & ListView1.SelectedItems(0).Text & vbCrLf & _
            "Column 1: " & ListView1.SelectedItems.Item(0).SubItems(1).Text & vbCrLf & _
            "Column 2: " & ListView1.SelectedItems.Item(0).SubItems(2).Text & vbCrLf & _
            "Column 3: " & ListView1.SelectedItems.Item(0).SubItems(3).Text)
    End Sub

    Private Sub txtFileName_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtFileName.KeyPress
      e.Handled = True    '// Can't press any key into TextBox Control.
    End Sub

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

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

#Region "FUNCTION"
    ' / --------------------------------------------------------------------------------
    ' / Get my project path
    ' / AppPath = C:\My Project\bin\debug
    ' / Replace "\bin\debug" with "\"
    ' / Return : C:\My Project\
    Public Function MyPath(ByVal AppPath As String) As String
      '/ MessageBox.Show(AppPath);
      MyPath = AppPath.ToLower.Replace("\bin\debug", "\").Replace("\bin\release", "\").Replace("\bin\x86\debug", "\").Replace("\bin\x86\release", "\")
      '// If not found folder then put the \ (BackSlash) or ASCII Code = 92 at the end.
      '/ Return Value
      If Microsoft.VisualBasic.Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
    End Function

#End Region

End Class
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้จากที่นี่ ...
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] การโหลดหลายๆชีตของไฟล์ Excel เพื่อนำมาแสดงผลลงใน ListView Control