|
การโหลดหลายๆชีตของไฟล์ 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) ได้จากที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|