Comment : Récupérer des métadonnées à partir d'Excel à l'aide de la méthode GetOleDbSchemaTable dans Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 318373 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape explique comment récupérer la table et les métadonnées de colonne à partir de sources de données Microsoft Excel en utilisant la méthode GetOleDbSchemaTable avec le fournisseur Microsoft OLE DB géré et le Fournisseur Microsoft OLE DB pour Jet.

La méthode GetOleDbSchemaTable exposée par la classe System.Data.OleDb de Microsoft.NET Framework est le successeur de .NET à la méthode OpenSchema dans les versions antérieures d'objets de données de Microsoft ActiveX (ADO).

Description de la Technique

Une fois que vous vous connectez à une source de données Excel à l'aide de ADO.NET, vous extraire la liste des métadonnées de table à l'aide de GetOleDbSchemaTableet puis utiliser la même méthode avec différents arguments pour obtenir métadonnées de colonne de la table sélectionnée. Vous pouvez également utiliser un objet DataGridTableStyle pour présenter et mettre en forme les résultats de votre requête de données de grille.

Configuration requise

La liste suivante met en évidence le matériel recommandé, logiciel, infrastructure réseau et service packs dont vous aurez besoin :
  • Visual Studio .NET est installé sur un Microsoft compatible Système d'exploitation Windows
  • Au moins un fichier de classeur (.xls) de Microsoft Excel avec certains lignes et colonnes de données
Cet article suppose que vous avez une connaissance de base au moins avec les rubriques suivantes :
  • Visual Basic .NET
  • Accès aux données ADO.NET
  • Feuilles de calcul et classeurs Excel

Échantillon

  1. Démarrez Microsoft Visual Studio .NET et créez un nouveau Visual Base du projet Application Windows .NET.
  2. Ajoutez trois contrôles de bouton et deux contrôles DataGrid au formulaire par défaut (Form1). Modifiez la propriété Text des contrôles de bouton pour Récupérer les métadonnées, Liste des Tables de Formatet Liste des colonnes de Format respectivement.
  3. Basculez vers le module de code du formulaire et ajoutez les instructions Imports suivantes en haut :
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.ComponentModel
  4. Insérez les déclarations suivantes au niveau du module dans la classe de formulaire après la ligne « Inherits System.Windows.Forms.Form ». Ajuster fichier de la chaîne de connexion que nécessaire pour pointer vers un classeur Excel contient certaines lignes et colonnes de données.
        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. Insérez le code suivant dans la classe de formulaire après la région « Code généré par le Concepteur Windows Form ». Ce code appelle GetOleDbSchemaTable pour charger les listes de tableau et de colonnes, remplit les contrôles DataGrid et liste des colonnes mises à jour lorsque la table sélectionnée modifications.
        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. Insérez le code suivant pour mettre en forme et mettre en forme les Tables DataGrid en utilisant TableStyles. Notez l'utilisation de PropertyDescriptor pour faciliter la mise en forme par défaut des colonnes date.
        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. Insérez le code suivant pour disposer et formater les colonnes DataGrid à l'aide de 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. Exécutez le projet.
  9. Cliquez sur Récupérer les métadonnées pour remplir la liste des Tables (DataGrid1) avec toutes les colonnes d'informations qui sont renvoyées pour chaque table dans le classeur Excel par GetOleDbSchemaTable. La liste des colonnes (DataGrid2) est remplie en même temps avec toutes les colonnes d'informations qui sont retournées pour les colonnes du premier tableau dans la liste des Tables .
  10. Sélectionnez une autre table dans la liste Tables . Les modifications de liste de colonnes pour afficher les colonnes de la table sélectionnée en raison de gestionnaire d'événements cm_PositionChanged que vous avez implémenté.
  11. Cliquez sur Liste des Tables de Format pour définir et appliquer un TableMappingStyle à DataGrid1. Ainsi les en-têtes de colonne plus « conviviales » et affiche les quatre colonnes d'utile données à partir des neuf colonnes qui sont retournées par GetOleDbSchemaTable. Ces colonnes sont affichées :
    NOM_TABLE
    TABLE_TYPE
    DATE_CREATED
    DATE_DE_MODIFICATION
    Ces colonnes de cellules vides ne sont pas affichées :
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    DESCRIPTION
    TABLE_PROPID
  12. Cliquez sur Liste des colonnes de Format pour définir et d'appliquer un TableMappingStyle à DataGrid2. Ceci rend les en-têtes de colonne plus « convivial » et affiche uniquement les 5 plus utiles colonnes de données à partir de 28 colonnes qui sont retournées par GetOleDbSchemaTable.
    NOM_COLONNE
    POSITION ORDINALE
    TYPE_DE_DONNÉES
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    Ces colonnes essentiellement vides ne sont pas affichées :
    TABLE_CATALOG
    TABLE_SCHEMA
    Table_name (déjà connue)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (toujours la valeur false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (toujours true)
    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
    NOM_DOMAINE
    DESCRIPTION
  13. Cliquez sur une autre ligne dans DataGrid1 pour sélectionner une autre table. La liste de colonnes est automatiquement mis à jour. Le TableStyles que vous DataGrid précédemment appliquée à chaque restent en vigueur.

Résolution des problèmes

  • Les types de données de colonne sont retournées par GetOleDbSchemaTable pour une source de données Excel ne sont pas identiques dans tous les cas à la types de données retournés par la méthode OpenSchema dans ADO classique :
    Réduire ce tableauAgrandir ce tableau
    Type de colonneADO classiqueADO.NET (OLE BASE DE DONNÉES)
    Numérique5 - adDouble5- OleDbType.Double
    Devise6 - adCurrency6- OleDbType.Currency
    Date/heure7 - adDate7- OleDbType.Date
    Valeur booléenne11 - adBoolean11- OleDbType.Boolean
    Texte<>202 - adVarWChar130- OleDbType.WChar
    Mémo203 - adLongVarWChar130- OleDbType.WChar
  • GetOleDbSchemaTablecomme OpenSchema, renvoie une seule colonne "F1" à partir d'une feuille de calcul Excel vide Bien qu'en réalité aucun en-tête de colonne ou de données n'est présents.

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article dans la Base de connaissances Microsoft :
257819Comment faire : Utiliser ADO avec des données Excel à partir de Visual Basic ou de VBA

Propriétés

Numéro d'article: 318373 - Dernière mise à jour: lundi 15 octobre 2012 - Version: 5.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft ADO.NET 1.1
Mots-clés : 
kbhowtomaster kbprovider kbmt KB318373 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 318373
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com