ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 1754|ตอบกลับ: 0

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

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583




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

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



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

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

  5.     ' / --------------------------------------------------------------------------------
  6.     ' / เลือกไฟล์ Excel
  7.     ' / --------------------------------------------------------------------------------
  8.     Private Sub btnOpenExcel_Click(sender As System.Object, e As System.EventArgs) Handles btnOpenExcel.Click
  9.         '/ ประกาศใช้งาน Open File Dialog ในแบบ Run Time
  10.         Dim dlgOpenFile As OpenFileDialog = New OpenFileDialog()
  11.         ' / ตั้งค่าการใช้งาน Open File Dialog
  12.         With dlgOpenFile
  13.             .InitialDirectory = MyPath(Application.StartupPath)
  14.             .Title = "เลือกไฟล์ MS Excel"
  15.             .Filter = "XLSX Files (*.xlsx)|*.xlsx|XLS Files (*.xls)|*xls"
  16.             .FilterIndex = 1
  17.             .RestoreDirectory = True
  18.         End With
  19.         '/ หากเลือกปุ่ม OK หลังจากการ Browse ...
  20.         If dlgOpenFile.ShowDialog() = DialogResult.OK Then
  21.             txtFileName.Text = dlgOpenFile.FileName '// แสดงรายชื่อไฟล์ Excel และพาธ
  22.             Dim strConn As String = _
  23.                 " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dlgOpenFile.FileName & ";" & _
  24.                 " Extended Properties=""Excel 12.0 Xml; HDR=YES"";"
  25.             Try
  26.                 Dim Conn As New System.Data.OleDb.OleDbConnection(strConn)
  27.                 Conn.Open()
  28.                 '//
  29.                 cmbSheetName.Items.Clear()  '// เคลียร์ไอเทมใน ComboBox
  30.                 ListView1.Columns.Clear()   '// เคลียร์หลักใน ListView เพื่อเริ่มต้นการแสดงผลใหม่
  31.                 '// เคลียร์ค่า Table/Query ของเดิมใน DataSet ก่อนใช้งานใหม่
  32.                 '// หรือหากให้เพิ่มตารางข้อมูล/คิวรี่ จากไฟล์อื่นเข้าไป ก็ตัดบรรทัดนี้ทิ้งออกไปได้เลย แต่ต้องเช็คว่ามีอยู่ใน DataSet แล้วหรือไม่
  33.                 DS = New DataSet()
  34.                 '/ มอง WorkSheet ให้เป็นเหมือนตารางข้อมูล (Table)
  35.                 Dim dtSheets As System.Data.DataTable = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
  36.                 '/ วนลูปในแต่ละ Sheet ตามที่มีอยู่ เพื่อโหลดข้อมูลเข้าสู่ DataSet
  37.                 For Each drSheet As DataRow In dtSheets.Rows
  38.                     Dim sheetName As String = drSheet("TABLE_NAME").ToString()
  39.                     '// นำรายชื่อ WorkSheet ทั้งหมด มาเก็บไว้ที่ ComboBox เพื่อรอให้ User เลือกนำไปใช้งาน
  40.                     cmbSheetName.Items.Add(sheetName)
  41.                     '// สร้าง Data Adapter เพื่อเก็บ Sheet ปัจจุบัน
  42.                     Dim DA As New OleDbDataAdapter("SELECT * FROM [" & sheetName & "]", Conn)
  43.                     '/ สร้าง DataTable เพื่อเก็บตารางข้อมูลจาก Sheet ปัจจุบัน
  44.                     Dim DT As New System.Data.DataTable(sheetName)
  45.                     '// นำข้อมูลจาก Sheet ไปเก็บไว้ใน DataTable
  46.                     DA.Fill(DT)
  47.                     '// นั่นก็คือเรานำ DataTable หลายๆตัวไปเก็บไว้ใน DataSet ได้ และจะอ้างอิงถึงตารางแต่ละตัวด้วยชื่อ Sheet
  48.                     DS.Tables.Add(DT)
  49.                     DA.Dispose()
  50.                 Next
  51.                 Conn.Close()
  52.             Catch ex As Exception
  53.                 ' Handle any exceptions that may occur during the process
  54.                 MessageBox.Show("An error occurred: " & ex.Message)
  55.             End Try
  56.         End If
  57.     End Sub

  58.     ' / --------------------------------------------------------------------------------
  59.     '// เลือก WorkSheet หรือ DataTable เพื่อแสดงผลข้อมูลลงใน ListView
  60.     ' / --------------------------------------------------------------------------------
  61.     Private Sub cmbSheetName_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbSheetName.SelectedIndexChanged
  62.         '// Initialize ListView.
  63.         With ListView1
  64.             .Clear()
  65.             .View = View.Details
  66.             .GridLines = True
  67.             .FullRowSelect = True
  68.             .HideSelection = False
  69.             .MultiSelect = False
  70.         End With
  71.         Try
  72.             '/ โหลดข้อมูล DataTable แต่ละตัว ตามชื่อที่มีอยู่ใน DataSet
  73.             Dim DT As DataTable = DS.Tables(cmbSheetName.Text)
  74.             '// อ่านจำนวนหลักทั้งหมดเข้ามาก่อนเพื่อสร้าง Column ให้กับ ListView
  75.             For iCol = 0 To DT.Columns.Count - 1
  76.                 ListView1.Columns.Add(DT.Columns(iCol).ColumnName)
  77.             Next
  78.             '// เมื่อมีหลัก (Column) เรียบร้อยแล้ว ต่อไปก็อ่านข้อมูลในแต่ละแถว (Row) เข้ามา
  79.             For sRow = 0 To DT.Rows.Count - 1
  80.                 Dim LV As New ListViewItem
  81.                 Dim dRow As DataRow = DT.Rows(sRow)
  82.                 LV = ListView1.Items.Add(dRow.Item(0))  '// --> Primary Node
  83.                 For iCol = 1 To DT.Columns.Count - 1
  84.                     LV.SubItems.Add(dRow(iCol).ToString())
  85.                 Next
  86.             Next
  87.             '// ปรับความกว้างของ Column ในการแสดงผลบน ListView
  88.             ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
  89.         Catch ex As Exception
  90.             MessageBox.Show(ex.Message)
  91.         End Try
  92.     End Sub

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

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

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

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

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

  126. #End Region

  127. End Class
คัดลอกไปที่คลิปบอร์ด

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

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 21:20 , Processed in 0.199304 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้