ΔΙΑΔΙΚΑΣΙΕΣ: Ανάκτηση μετα-δεδομένων από το Excel, χρησιμοποιώντας τη μέθοδο GetOleDbSchemaTable σε Visual Basic .NET

Για την Microsoft Visual C# .NET έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα
318452 .

Σύνοψη

Αυτό το άρθρο βήμα προς βήμα περιγράφει τον τρόπο ανάκτησης μετα-δεδομένων πινάκων και στηλών από αρχεία προέλευσης δεδομένων του Microsoft Excel, χρησιμοποιώντας τη μέθοδο GetOleDbSchemaTable με την Microsoft διαχειριζόμενη υπηρεσία παροχής OLE DB και της υπηρεσίας Microsoft OLE DB για Jet.

Η μέθοδος GetOleDbSchemaTable που εκτίθεται από την κλάση System.Data.OleDb του Microsoft .NET Framework αποτελεί διάδοχο .NET τη μέθοδο OpenSchema σε παλαιότερες εκδόσεις του Microsoft ActiveX Data Objects (ADO).

Περιγραφή για την τεχνική

Αφού συνδεθείτε με ένα αρχείο προέλευσης δεδομένων Excel χρησιμοποιώντας ADO.NET, εξαγάγετε μια λίστα πίνακα μετα-δεδομένων με τη χρήση GetOleDbSchemaTableκαι, στη συνέχεια, χρησιμοποιήστε την ίδια μέθοδο με διαφορετικά ορίσματα απόκτησης μετα-δεδομένων στήλης για τον επιλεγμένο πίνακα. Μπορείτε επίσης να χρησιμοποιήσετε ένα αντικείμενο DataGridTableStyle για διάταξη και να μορφοποιήσετε τα αποτελέσματα του ερωτήματος στο πλέγμα δεδομένων.

Απαιτήσεις

Η ακόλουθη λίστα περιγράφει το υλικού που συνιστώνται, λογισμικό, υποδομή δικτύου και τα service pack που θα χρειαστείτε:
  • Visual Studio .NET εγκατεστημένο σε ένα συμβατό λειτουργικό σύστημα των Microsoft Windows
  • Τουλάχιστον ένα αρχείο βιβλίου εργασίας (.xls) του Microsoft Excel με μερικές γραμμές και στήλες δεδομένων
Αυτό το άρθρο προϋποθέτει ότι έχετε τουλάχιστον βασικές εξοικείωση με τα ακόλουθα θέματα:
  • Visual Basic .NET
  • Η πρόσβαση δεδομένων ADO.NET
  • Φύλλα και βιβλία εργασίας του Excel

Δείγμα

  1. Ξεκινήστε το Microsoft Visual Studio .NET και δημιουργήστε ένα νέο έργο εφαρμογών των Windows .NET Visual Basic.
  2. Προσθέστε τρία στοιχεία ελέγχου κουμπί και τα δύο στοιχεία ελέγχου δεδομένων (DataGrid) για την προεπιλεγμένη φόρμα (Form1). Αλλάξτε την ιδιότητα κειμένου από τα στοιχεία ελέγχου κουμπί για Ανάκτηση μετα-δεδομένων, Λίστα πίνακες μορφήκαι Μορφοποίηση στηλών λίστας αντίστοιχα.
  3. Μεταβείτε σε λειτουργική μονάδα κώδικα της φόρμας, και προσθέστε τις ακόλουθες δηλώσεις εισαγωγής στην κορυφή:
    Imports System.DataImports System.Data.OleDb
    Imports System.ComponentModel
  4. Εισαγάγετε τις παρακάτω δηλώσεις επίπεδο λειτουργικής μονάδας της κλάσης της φόρμας μετά από τη γραμμή "System.Windows.Forms.Form κληρονομεί". Για να προσαρμόσετε τη συμβολοσειρά σύνδεσης, είναι απαραίτητο να οδηγεί σε ένα αρχείο βιβλίου εργασίας του Excel που περιέχει μερικές γραμμές και στήλες δεδομένων.
        Dim cn As OleDbConnection    Dim strCn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=c:\test.xls;Extended Properties=Excel 8.0"
    Dim dtTables As DataTable
    Dim WithEvents cm As CurrencyManager
    Dim dtColumns As DataTable
    Dim dvColumns As DataView
  5. Εισαγάγετε τον ακόλουθο κώδικα στην κλάση φόρμας μετά την περιοχή "Windows σχεδιαστής φόρμας δημιούργησε κώδικα". Αυτός ο κώδικας καλεί GetOleDbSchemaTable για να φορτώσετε τις λίστες πινάκων και στηλών, συμπληρώνει τα στοιχεία ελέγχου δεδομένων (DataGrid) και ενημερώνει τη λίστα στηλών όταν αλλάζει τον επιλεγμένο πίνακα.
        Private Sub Button1_Click(ByVal sender As System.Object, _            ByVal e As System.EventArgs) Handles Button1.Click
    Call GetTablesList()
    End Sub

    Private Sub GetTablesList()
    cn = New OleDbConnection(strCn)
    cn.Open()
    dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
    DataGrid1.DataSource = dtTables
    DataGrid1.ReadOnly = True
    cn.Close()
    Call GetColumnsList()
    End Sub

    Private Sub GetColumnsList()
    If cm Is Nothing Then
    cm = CType(Me.BindingContext(dtTables), CurrencyManager)
    End If
    Dim r As Integer = cm.Position
    Dim strTable As String = dtTables.Rows(r)("TABLE_NAME")
    cn = New OleDbConnection(strCn)
    cn.Open()
    dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
    New Object() {Nothing, Nothing, strTable, Nothing})
    dvColumns = New DataView(dtColumns)
    dvColumns.Sort = "ORDINAL_POSITION"
    DataGrid2.DataSource = dvColumns
    DataGrid2.ReadOnly = True
    cn.Close()
    End Sub

    Private Sub cm_PositionChanged(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles cm.PositionChanged
    Call GetColumnsList()
    End Sub
  6. Εισαγάγετε τον ακόλουθο κώδικα για διάταξη και μορφοποίηση πινάκων δεδομένων (DataGrid) χρησιμοποιώντας TableStyles. Σημειώστε τη χρήση της PropertyDescriptor για τη διευκόλυνση της μη προεπιλεγμένη μορφοποίηση των στηλών ημερομηνίας.
        Private Sub Button2_Click(ByVal sender As System.Object, _            ByVal e As System.EventArgs) Handles Button2.Click
    Call FormatTablesGrid(dtTables)
    End Sub

    Private Sub FormatTablesGrid(ByVal dt2format As DataTable)
    Dim gs As DataGridTableStyle = New DataGridTableStyle()
    gs.MappingName = dt2format.TableName

    Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()
    With cs
    .MappingName = "TABLE_NAME"
    .HeaderText = "Table Name"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    cs = New DataGridTextBoxColumn()
    With cs
    .MappingName = "TABLE_TYPE"
    .HeaderText = "Table Type"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    Dim cm As CurrencyManager = CType(Me.BindingContext(dt2format), CurrencyManager)
    Dim pd As PropertyDescriptor = cm.GetItemProperties()("DATE_CREATED")

    cs = New DataGridTextBoxColumn(pd, "d")
    With cs
    .MappingName = "DATE_CREATED"
    .HeaderText = "Date Created"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    cm = CType(Me.BindingContext(dt2format), CurrencyManager)
    pd = cm.GetItemProperties()("DATE_MODIFIED")

    cs = New DataGridTextBoxColumn(pd, "d")
    With cs
    .MappingName = "DATE_MODIFIED"
    .HeaderText = "Date Modified"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    DataGrid1.TableStyles.Add(gs)
    Me.Button2.Enabled = False

    End Sub
  7. Εισαγάγετε τον ακόλουθο κώδικα για τη διάταξη και τη μορφή των στηλών
    Το DataGrid με χρήση TableStyle:
        Private Sub Button3_Click(ByVal sender As System.Object, _            ByVal e As System.EventArgs) Handles Button3.Click
    Call FormatColumnsGrid(dtColumns)
    End Sub

    Private Sub FormatColumnsGrid(ByVal dt2format As DataTable)
    Dim gs As DataGridTableStyle = New DataGridTableStyle()
    gs.MappingName = dtColumns.TableName

    Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()
    With cs
    .MappingName = "COLUMN_NAME"
    .HeaderText = "Column Name"
    .Width = 100
    End With
    gs.GridColumnStyles.Add(cs)

    cs = New DataGridTextBoxColumn()
    With cs
    .MappingName = "ORDINAL_POSITION"
    .HeaderText = "Ordinal Position"
    .Width = 100
    End With
    gs.GridColumnStyles.Add(cs)

    cs = New DataGridTextBoxColumn()
    With cs
    .MappingName = "DATA_TYPE"
    .HeaderText = "Data Type"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    cs = New DataGridTextBoxColumn()
    With cs
    .MappingName = "CHARACTER_MAXIMUM_LENGTH"
    .HeaderText = "Text Length"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    cs = New DataGridTextBoxColumn()
    With cs
    .MappingName = "NUMERIC_PRECISION"
    .HeaderText = "Numeric Precision"
    .Width = 75
    End With
    gs.GridColumnStyles.Add(cs)

    DataGrid2.TableStyles.Add(gs)
    Me.Button3.Enabled = False

    End Sub
  8. Εκτελέστε το έργο.
  9. Κάντε κλικ στο κουμπί Ανάκτηση μετα-δεδομένων για να συμπληρώσετε τη λίστα πίνακες (DataGrid1) με όλες τις στήλες πληροφοριών που επιστρέφονται από GetOleDbSchemaTableγια κάθε πίνακα στο βιβλίο εργασίας του Excel. Λίστα στηλών (DataGrid2) συμπληρώνεται ταυτόχρονα με όλες τις στήλες πληροφοριών που επιστρέφονται για τις στήλες του πρώτου πίνακα στη λίστα πίνακες .
  10. Επιλέξτε έναν άλλο πίνακα στη λίστα πίνακες . Οι αλλαγές λίστα στηλών για την εμφάνιση των στηλών του επιλεγμένου πίνακα, επειδή το πρόγραμμα χειρισμού συμβάντων cm_PositionChanged που εφαρμόσατε.
  11. Κάντε κλικ στη Λίστα πίνακες μορφή για να ορίσετε και να εφαρμόσετε ένα TableMappingStyle DataGrid1. Αυτό καθιστά πιο "φιλικό" κεφαλίδες στήλης και εμφανίζει μόνο τις τέσσερις στήλες χρήσιμα δεδομένα από τις εννέα στήλες που επιστρέφονται από GetOleDbSchemaTable. Αυτές οι στήλες εμφανίζονται:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    Αυτές οι στήλες κενά δεν εμφανίζονται:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    ΠΕΡΙΓΡΑΦΉ
    TABLE_PROPID
  12. Κάντε κλικ στο κουμπί Μορφοποίηση στηλών λίστας για να ορίσετε και να εφαρμόσετε ένα TableMappingStyle σε DataGrid2. Αυτό καθιστά πιο "φιλικό" κεφαλίδες στήλης και εμφανίζει μόνο τις πιο χρήσιμες 5 στήλες δεδομένων από τις 28 στήλες που επιστρέφονται από GetOleDbSchemaTable.
    COLUMN_NAME
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    Δεν εμφανίζονται τα κυρίως κενές στήλες:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_NAME πρέπει να (ήδη γνωστή)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (όχι πάντα)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (πάντα αληθής)
    TYPE_GUID
    CHARACTER_OCTET_LENGTH
    NUMERIC_SCALE
    DATETIME_PRECISION
    CHARACTER_SET_CATALOG
    CHARACTER_SET_SCHEMA
    CHARACTER_SET_NAME
    COLLATION_CATALOG
    COLLATION_SCHEMA
    COLLATION_NAME
    DOMAIN_CATALOG
    DOMAIN_SCHEMA
    DOMAIN_NAME
    ΠΕΡΙΓΡΑΦΉ
  13. Κάντε κλικ σε μια διαφορετική γραμμή στο DataGrid1 για να επιλέξετε ένα διαφορετικό πίνακα. Λίστα στηλών ενημερώνεται αυτόματα. Το TableStyles που εφαρμόσατε προηγουμένως κάθε DataGrid παραμένουν σε ισχύ.

Αντιμετώπιση προβλημάτων

  • Οι τύποι δεδομένων στήλης που επιστρέφονται από GetOleDbSchemaTable για ένα αρχείο προέλευσης δεδομένων Excel δεν είναι πανομοιότυπα σε όλες τις περιπτώσεις με τους τύπους δεδομένων που επιστρέφονται από τη μέθοδο OpenSchema στο κλασικό ADO:
    Τύπος στήληςΚλασική ADOADO.NET (OLE DB)
    Αριθμητικό5 - adDouble5 - OleDbType.Double
    Νομισματική μονάδα6 - adCurrency6 - OleDbType.Currency
    Date/Time7 - adDate7 - OleDbType.Date
    Δυαδική τιμή11 - adBoolean11 - OleDbType.Boolean
    Κείμενο < 255202 - adVarWChar130 - OleDbType.WChar
    Τιμολόγιο203 - adLongVarWChar130 - OleDbType.WChar
  • GetOleDbSchemaTable, όπως OpenSchema, επιστρέφει μια στήλη "F1" από ένα κενό φύλλο εργασίας του Excel, αν και στην πραγματικότητα υπάρχουν χωρίς επικεφαλίδες δεδομένων ή της στήλης.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
257819 ΔΙΑΔΙΚΑΣΙΕΣ: χρήση ADO με δεδομένα του Excel από τη Visual Basic ή της VBA
Ιδιότητες

Αναγνωριστικό άρθρου: 318373 - Τελευταία αναθεώρηση: 16 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια