[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]