كيفية: استرداد بيانات التعريف من Excel باستخدام أسلوب جيتوليدبشيماتابل في Visual Basic.NET

للحصول على إصدار Microsoft Visual C#.NET من هذه المقالة، راجع
318452 .

ملخص

توضح هذه المقالة خطوة بخطوة كيفية استرداد بيانات تعريف الجدول والعمود من مصادر بيانات Microsoft Excel باستخدام أسلوب جيتوليدبشيماتابل مع موفر Microsoft OLE DB مدارة وموفر Microsoft OLE DB ل Jet.

أسلوب جيتوليدبشيماتابل التي يتم عرضها بواسطة الفئة System.Data.OleDb من Microsoft.NET Framework هو وريث.NET للأسلوب OpenSchema في الإصدارات السابقة من كائنات بيانات Microsoft ActiveX (ADO).

وصف للتقنية

بعد الاتصال بمصدر بيانات Excel باستخدام ADO.NET، استخراج قائمة من بيانات تعريف الجدول باستخدام GetOleDbSchemaTable، وثم استخدم نفس الأسلوب مع وسائط مختلفة للحصول على بيانات تعريف عمود للجدول المحدد. يمكنك أيضا استخدام كائن داتاجريدتابليستيلي لتخطيط وتنسيق نتائج الاستعلام في شبكة بيانات.

متطلبات

توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة وحزم الخدمة التي ستحتاج إليها:
  • 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). تغيير خاصية Text أزرار التحكم استرداد بيانات التعريفو تنسيق قائمة الجداولو تنسيق أعمدة قائمة على التوالي.
  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 باستخدام تابليستيليس. لاحظ استخدام 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 باستخدام تابليستيلي:
        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) مع كافة أعمدة المعلومات التي تم إرجاعها لكل جدول في مصنف Excel بواسطة جيتوليدبشيماتابل. يتم تعبئة القائمة الأعمدة (DataGrid2) في نفس الوقت مع كافة أعمدة المعلومات التي يتم إرجاعها للأعمدة الموجودة في الجدول الأول في قائمة الجداول .
  10. حدد جدول مختلف في قائمة الجداول . تغييرات قائمة الأعمدة لعرض الأعمدة من الجدول المحدد بسبب معالج الأحداث cm_PositionChanged التي يمكنك تنفيذها.
  11. انقر فوق تنسيق قائمة الجداول لتعريف وتطبيق تابليمابينجستيلي DataGrid1. وهذا يجعل رؤوس الأعمدة أكثر "المألوف" ويعرض أربعة أعمدة بيانات مفيدة من تسعة الأعمدة التي تم إرجاعها بواسطة GetOleDbSchemaTable. يتم عرض هذه الأعمدة:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    لا يتم عرض هذه الأعمدة الفراغات:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    وصف
    TABLE_PROPID
  12. انقر فوق تنسيق قائمة الأعمدة لتعريف وتطبيقها تابليمابينجستيلي 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 (false دائماً)
    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 لتحديد جدول مختلف. يتم تحديث قائمة الأعمدة تلقائياً. تابليستيليس الذي قمت بتطبيقه مسبقاً لكل DataGrid تبقى سارية المفعول.

استكشاف الأخطاء وإصلاحها

  • أنواع بيانات الأعمدة التي يتم إرجاعها بواسطة جيتوليدبشيماتابل لمصدر بيانات Excel غير متطابقة في كافة الحالات إلى أنواع البيانات التي يتم إرجاعها بواسطة الأسلوب OpenSchema في ADO التقليدية:
    نوع العمودADO الكلاسيكيةADO.NET (OLE DB)
    الرقمية5-أدوبلي5-OleDbType.Double
    عمله6-أدكورينسي6-OleDbType.Currency
    Date/Time7-أداتي7-OleDbType.Date
    قيمة منطقية11-أدبوليان11-OleDbType.Boolean
    النص < 255202-أدفاروتشار130-OleDbType.WChar
    مذكرة203-أدلونجفاروتشار130-OleDbType.WChar
  • إرجاع جيتوليدبشيماتابل، مثل OpenSchema، عمود واحد "واو/1" من ورقة عمل Excel فارغة، على الرغم من أنه في الواقع وجود أية عناوين البيانات أو عمود.

المراجع

للحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft":
257819 HOWTO: استخدام ADO مع بيانات Excel من Visual Basic أو VBA
خصائص

رقم الموضوع: 318373 - آخر مراجعة: 19‏/01‏/2017 - المراجعة: 1

تعليقات