以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [分享]第5种创建表结构方法:根据Excel的表结构生成内部表  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=139539)

--  作者:shenyl0211
--  发布时间:2019/8/15 10:56:00
--  [分享]第5种创建表结构方法:根据Excel的表结构生成内部表

 Foxtable数据库应用开发宝典》介绍了4种创建表结构的方法,这里介绍第5种,是最好的。理由是:用户可以看到的表结构不是开发者所能决定的,所以,创建表前必须征求用户的意见,此时的征求意见内容不仅是表名、列名、标题、类型、长度、表达式,还有顺序,显然,这些内容应该先在Excel表中编写、修改、排序、定稿。直接利用已经完善的、完整的Excel形式的表结构,再结合ADOXBuilder,就可以快速创建表结构。

1 下列代码所用的Excel表格形式为:A列表名、B列列名、C列标题、D列类型、E列长度、F列表达式。

2 创建新项目,在命令窗口执行下列代码动态创建新的表和列。

3 重新打开项目,查看添加结果。

4 后续完善工作:需改为数字开头的列用手工或代码设置标题;增加或插入表达式列、长整数列。

Dim filename As String

Dim dlg As New OpenFileDialog

dlg.Filter = "Excel文件|*.xls;*.xlsx"

If dlg.ShowDialog = DialogResult.OK Then

    filename = dlg.FileName

Else

    Return Nothing

End If

Dim Builder As New ADOXBuilder

Dim tbl As ADOXTable

Dim App As New MSExcel.Application

Dim book As MSExcel.WorkBook = App.WorkBooks.Open(filename)

Dim ws As MSExcel.WorkSheet = book.WorkSheets(1)

Dim rg As MSExcel.Range = ws.usedRange

Dim str1,str2,bm,lx As String

Dim i,k As Integer

Builder.Open()

app.visible = False

For i = 1 To Rg.Rows.Count

    Str1 = Ws.Cells(i,1).value

    Str2 = Ws.Cells(i,2).value

    If str1 = Nothing AndAlso str2 = Nothing Then \'空行

        Continue For

    End If

    If str2 = Nothing Then \'第二列空则就是表名所在行,str1为表名

        If bm IsNot Nothing Then

            Builder.AddTable(tbl) \'AddTable将创建的表增加到Builder

        End If

        bm = str1.trim.ToUpper

        tbl = Builder.NewTable(bm) \'NewTable方法创建表

    Else \'为列名

        str1 = Ws.Cells(i,6).value

        If str1 IsNot Nothing Then \'是表达式列

            Continue For

        End If

        Lx = Ws.Cells(i,4).value

        Select Case lx.trim.ToLower

            Case "text"

                tbl.AddColumn(str2,ADOXType.Text)

            Case "datetime"

                tbl.AddColumn(str2,ADOXType.DateTime)

            Case "boolean"

                tbl.AddColumn(str2,ADOXType.Boolean)

            Case "single"

                tbl.AddColumn(str2,ADOXType.Single)

            Case "double"

                tbl.AddColumn(str2,ADOXType.Double)

            Case "integer"

                tbl.AddColumn(str2,ADOXType.Integer)

            Case "string"

                K = Ws.Cells(i,5).value

                tbl.AddColumn(str2,ADOXType.String,k)

            Case "long"

                Continue For

        End Select

    End If

Next

Builder.AddTable(tbl)

Builder.Close()

app.visible = True
[此贴子已经被作者于2019/8/19 15:19:10编辑过]

--  作者:有点蓝
--  发布时间:2019/8/15 11:36:00
--  
多谢分享
--  作者:y2287958
--  发布时间:2019/8/15 12:13:00
--  
鼓励一下
--  作者:百灵
--  发布时间:2019/8/15 20:54:00
--  
http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=95427这种方式更好
--  作者:shenyl0211
--  发布时间:2019/8/16 10:48:00
--  
回4楼:功能是完全不同的。
你是根据现有的Excel数据表(相当于数据库吧),一张一张地创建表头、导入或合并数据,所有的字符列长度都是255、数值列都是双精度,没有整数列和逻辑列。显然,以后还要修改表结构。
我是根据现有的Excel表结构(设计好表名、列名、类型、长度,但没有数据),创建表和列。以后直接合并数据,不需要合并数据的代码。针对列名不同的单列导入和针对列名相同的批量导入,在论坛上我有分享:
[此贴子已经被作者于2019/8/16 10:55:09编辑过]

--  作者:蓝才文百
--  发布时间:2019/11/15 16:28:00
--  
强大!
--  作者:wei0769
--  发布时间:2019/11/16 10:12:00
--  

谢谢分享


--  作者:ychsit
--  发布时间:2019/11/16 10:56:00
--  

学习