如何将Excel中表结构数据自动生成SQL脚本的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将Excel中表结构数据自动生成SQL脚本的方法相关的知识,希望对你有一定的参考价值。

参考技术A 一: 在本地PC新建一个Excel文件(例如:excel2007)
准备工作,左键选择excel文本左上角的图标,选择“Excle选项”。1. 点击“信任中心”->“信任中心设置”->“宏设置”->选择“启用所有宏...”选项。“开发人员宏设置”选项也勾选上。 2. 点击“信任中心”->“信任中心设置”->选择“个人信息选项”,将“文档特定设置”上面默认选择去掉,避免在保存脚本时报错。
二: 在本地PC新建一个excel文件(例如: D:\testdate.xlsx)
按快捷键“ALT + F11”进入宏编辑,输入如下代码后保存。summary()为目标生成代码,SQL()为生成SQL脚本文件代码,按条件生成SQL的脚本如下:
Sub summary()
Dim i As Integer
i = 2
ThisWorkbook.Worksheets(1).Columns(2).Clear
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> " " Then
ThisWorkbook.Worksheets(1).Cells(i, 2).Value = sh.Name
ThisWorkbook.Worksheets(1).Cells(i, 2).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
sh.Name + "!A1", TextToDisplay:=sh.Name
i = i + 1
End If
Next sh

ThisWorkbook.Worksheets(1).Cells.Select

With Selection.Font
.Name = "目录"
.Size = 9
.Strikethrough = False
.Superscript. = False
.Subscript. = False
.OutlineFont = False
.Shadow = False
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With
End Sub
Sub SQL()
Dim i As Integer
i = 1
Dim ADO_Stream As Object
Dim strSQL, strDelSQL As String
Dim strTblName As String
Dim col As Long
Dim row As Long
Dim str As String
Dim PK As String
Dim cnt As Integer

PK = "PK"
Dim rowcounts As Long
rowcounts = 0
Dim filecount As Long
filecount = 0
Set ADO_Stream = CreateObject("ADODB.Stream")
ADO_Stream.Type = 2
ADO_Stream.Mode = 3
ADO_Stream.Charset = "unicode"
ADO_Stream.Open

Dim checkType As String
For Each sh In ThisWorkbook.Worksheets
cnt = 0
If sh.Name <> " " And InStr(sh.Name, "template") = 0 Then
strTblName = sh.Cells(1, 2).Value
rowcounts = 1
'Insert SQL
row = 6

Do While sh.Cells(row, 1).Value <> ""
strDelSQL = "delete from " + strTblName + " where "
strSQL = "Insert into " + strTblName + " ("
col = 1
Do While sh.Cells(3, col).Value <> ""
If col <> 1 Then
strSQL = strSQL + ", "
End If
strSQL = strSQL + sh.Cells(3, col).Value
col = col + 1
Loop
strSQL = strSQL + ") VALUES ("
col = 1
Do While sh.Cells(3, col).Value <> ""

str = Trim(CStr(sh.Cells(row, col).Value))

If InStr(Trim(CStr(sh.Cells(2, col).Value)), PK) <> 0 Then
If cnt > 0 Then
strDelSQL = strDelSQL + " and "
End If
strDelSQL = strDelSQL + Trim(CStr(sh.Cells(3, col).Value)) + " = '" + str + "'"
cnt = cnt + 1
End If
If col <> 1 Then
strSQL = strSQL + ", "
End If

If (InStr(Trim(CStr(sh.Cells(4, col).Value)), "Integer") = 0) And (InStr(Trim(CStr(sh.Cells(4, col).Value)), "Decimal") = 0) And ((InStr(Trim(CStr(sh.Cells(4, col).Value)), "DATE") = 0) Or _
((Len(str) > 0) And (InStr(Trim(CStr(sh.Cells(4, col).Value)), "DATE") > 0))) Then
If (Len(str) <= 0) And (InStr(Trim(CStr(sh.Cells(5, col).Value)), "No") = 0) Then
str = "NULL"
ElseIf InStr(Trim(CStr(sh.Cells(4, col).Value)), "DATE") > 0 Then
str = "to_date('" + str + "','yyyy-mm-dd hh24:mi:ss')"
Else
str = "'" + str + "'"
End If

strSQL = strSQL + str
ElseIf (Len(str) <= 0) And (InStr(Trim(CStr(sh.Cells(4, col).Value)), "DATE") > 0) Then
strSQL = strSQL + "NULL"
Else
If (Len(str) <= 0) And (InStr(Trim(CStr(sh.Cells(5, col).Value)), "No") = 0) Then
str = "NULL"
End If

strSQL = strSQL + str
End If

col = col + 1
Loop

strDelSQL = strDelSQL + ";" + vbCrLf
ADO_Stream.WriteText strDelSQL
strSQL = strSQL + ");" + vbCrLf
ADO_Stream.WriteText strSQL
row = row + 1
Loop
End If
i = i + 1
rowcounts = 0
filecount = 0
Next sh
ADO_Stream.SaveToFile ThisWorkbook.Path & "\MstSQL(delete by condition).txt", 2
ADO_Stream.Close
Set ADO_Stream = Nothing
End Sub
点击“保存”宏脚本,主要的一步完成。
三: 在excel文件(test.xlsx)的首页创建两个图标,分别选择右键指定宏,一个指定上面的summary(),一个指定上面的SQL()。然后就可以在后续的sheet页创建自己需要生成SQL脚本的表结构名称了,记得每个sheet页面对应一个表结构及数据,使用方法如下:
A,将需要更新的对象表数据整个sheet拷进工具中,数据只保留需要更新的数据。
B,在第2行标出主键字段,填上“PK”即可。
看看代码
http://www.51testing.com/html/41/195041-831346.html本回答被提问者采纳

使用vba程序,实现excel数据库模板生成sql数据库结构

@

最近公司有个需求,提前让数据库表结构在excel模板中设计,然后再建对应的数据库DB。字段少好说,无脑录入即可,但是,我遇到个100多个字段的,实在忍不了,最终入门了VBA编程,自己写脚本生成了sql语句。减少了需要无用重复劳动。

VBA基础

首先学习下vba的基础。

一.了解VBA

1.进入vba

alt + f11

文件 - 选项 - 自定义功能区 - 勾选开发工具

2.认识宏

  • 录制宏

  • 使用相对应用录制宏

二. VBA编程

1.hello world

双击某个sheet页, 把鼠标放在 窗口里面,点击工具栏的插入,选择过程,随便起个过程名,比如 class就生成了代码:

Public Sub class()
End Sub

写个hello world程序:

Sub class()
    Dim name
    name = "Hello World"
    name = "胡老师好"
    MsgBox name    
End Sub

技术图片

2.调出立即窗口和本地窗口

在工具栏中选择 选择立即窗口,和本地窗口。
技术图片

3.debug显示

Sub class()
    Dim name
    name = "Hello World"
    Debug.Print name
    name = "胡老师好"
    MsgBox name
    Debug.Print name
End Sub

技术图片

4.注释

注释有2种形式,一种是rem。一种是 ‘ (单引号)

技术图片

5.数据类型

variant 代表任意类型

single double decimal 代表 小数、

rem 代表注释关键字

Const 常量关键字

技术图片
技术图片

Sub class()
    Rem variant是任意类型
    Dim name As Variant
    name = "Hello World"
    Rem debug
    Debug.Print name
    name = "胡老师好"
    Debug.Print name
    Rem 定义常量
    Const num As Integer = 123
    Debug.Print num
    
End Sub

5.变量的生命周期和定义域

  • 定义域: public 和 private
    技术图片
  • static 是静态变量
Sub class1()
Dim x As Integer
Rem static 是静态变量
Static y As Integer
x = x + 1
y = y + 1
Debug.Print "x=" & x
Debug.Print "y=" & y
End Sub

6.判断语句

Sub class3()
Dim number As Integer
number = 1
If number > 100 Then
   Debug.Print "优秀"
ElseIf number > 95 Then
   Debug.Print "良好"
Else
  Debug.Print "一般"
End If
End Sub

7.不等于<> , switch case 条件判断

  • <> 不等于
Sub class3()
Dim number As String
number = "匹配"
If number > "匹配" Then
   Debug.Print "优秀"
ElseIf number <> "匹配" Then
   Debug.Print "良好"
End If
End Sub


  • switch case

Sub class4()
    Dim number As String
    number = "匹配"
    Select Case number
      Case "匹配"
        Debug.Print "匹配"
      Case "不匹配"
        Debug.Print "不匹配"
    End Select
        
End Sub

  • boolean类型的使用
Sub class5()
    Dim count As Integer
    Dim if_f As Boolean
    count = 11
    if_f = (count = 10)
    MsgBox if_f
End Sub

8.循环

  • 最简单的循环
Sub class()
Rem 演示循环
Dim count As Integer
    For count = 1 To 10
        Debug.Print count
    Next
        Debug.Print "count 循环结束之后的值是 " & count
End Sub

技术图片

  • 循环控制单元格属性

    Sub class()
    Rem 演示循环
    Dim count As Integer
        For count = 2 To 10
            If count Mod 2 = 0 Then
                Rem rang函数代表选中的某列单元格
                Rem Interior代表单元格内部的对象
                Range("T" & count).Interior.ColorIndex = 1
            Else
                Range("T" & count).Interior.ColorIndex = 3
            End If
         Next
         Debug.Print "count 循环结束之后的值是 " & count
    End Sub
    

技术图片

  • 循环控制单元格求和

    Sub class()
    Rem 演示循环
    Dim COUNT As Integer
    Dim score As Double
    For COUNT = 2 To 20
        Rem cells的参数 第一个参数代表横行,第2个参数代表竖行
        Cells(COUNT, 8) = "=sum(rc[-1]:rc[-6])"
    Next
    End Sub
    

技术图片

  • 循环单元格操作+if
Sub class()
Rem 演示循环
Dim COUNT As Integer
Dim score As Double
For COUNT = 2 To 20
    Rem cells的参数 第一个参数代表横行,第2个参数代表竖行
    Cells(COUNT, 8) = "=sum(rc[-1]:rc[-6])"
    score = Cells(COUNT, 8)
    If score > 700 Then
        Cells(COUNT, 9) = "秀儿"
    ElseIf score > 650 Then
        Cells(COUNT, 9) = "良好"
    Else
       Cells(COUNT, 9) = "小垃圾"
    End If
Next
End Sub

技术图片

do while

Sub class()
    Rem do while 演示
    Dim count As Integer
    count = 20
    Do While count > 10
        Debug.Print count
        count = count - 1
        Debug.Print count
    Loop
    
    Rem do .. loop 条件 不演示了
     Do        
    Loop While count > 10
    
End Sub

技术图片

退出循环的语句 exit for

使用for循环的时候退出用 exit for

Sub class1()
    Dim count As Integer
    For count = 1 To 10
        If count = 5 Then
            Debug.Print "count 退出循环的值是: " & count
            Exit For
        End If
        Debug.Print count
    Next
End Sub

技术图片

退出循环的语句 exit do

使用fo while循环的时候退出用 exit do

Sub class1()
    Dim count As Integer
    Do While True
        count = count + 1
        If count > 5 Then
            Debug.Print "此时退出循环的值是: " & count
            Exit Do
        End If
    Loop
End Sub

技术图片

9.数组

Sub class()
  Dim arr(2) As Variant
  Dim i As Integer
  arr(0) = "小明"
  arr(1) = 2
  arr(2) = True
  For i = 0 To 2
    Debug.Print arr(i)
  Next
End Sub

技术图片

  • 下标越界

    Sub class()
     ‘ Const i As Integer = 10
     ‘ Dim arr(i) As Variant
      Rem  可以指明数组的范围奥 起始开始限制了也是下标越界
      Dim arr(2 To 5) As Variant
      arr(1) = 1
      Debug.Print arr(1)
      
    End Sub 
    

技术图片

10.二维数组

Sub class()
    Dim arr(2 To 5, 3 To 6) As Variant
      arr(2, 3) = 1
      Debug.Print arr(2, 3)
End Sub 

技术图片

  • 遍历循环

    Sub class()
        Dim arr(2 To 5, 3 To 6) As Variant
          arr(2, 3) = 1
          ‘Debug.Print arr(2, 3)
          For x = 2 To 5
            For y = 3 To 6
                Debug.Print arr(2, 3)
            Next
          Next
          
    End Sub 
    

技术图片

11.操作单元格

2中方式,一种是range,一种是cells

range
技术图片

cells
技术图片

实战

现在掌握了上面的基础知识,基本上可以满足我们最开始的需求
解决思路: 循环方式获取单元格中的内容,拼接成 sql 的创建脚本语句即可

自定义vba脚本生成sql

  • 原来的excel模板内容:
    技术图片
  • 目标:输出sql创建表的语句:
    技术图片
    具体实现的脚本:
Public Sub class()
    Rem 声明字段row的开始行号
    Const startRow As Integer = 13
    Rem 声明字段row的结束行号
    Const endRow As Integer = 28
    Rem 声明表名
    Dim tableName  As String
    tableName = Range("E" & 6)
    Rem 声明主键
    Dim primaryKey  As String
    primaryKey = Range("F" & 13)
    Rem 声明表名注释
    Dim tableComment As String
    tableComment = Range("E" & 7)
    Rem 声明字段名对应列 英文序号
    Dim filedMetaNo As String
    filedMetaNo = "F"
    Rem 声明字段注释对应对应列 英文序号
    Dim commentMetaNo As String
    commentMetaNo = "C"
    Rem 声明字段备注 对应列的 英文序号
    Dim comment2MetaNo As String
    comment2MetaNo = "U"
    Rem 声明类型 对应列的 英文序号
    Dim typeMetaNo As String
    typeMetaNo = "G"
    Rem 声明字长 对应的列的英文序号
    Dim lengthMetaNo As String
    lengthMetaNo = "H"
    
    Rem 最终要拼接的sql
    Dim sqlStr As String
    sqlStr = "CREATE TABLE " & Range("E" & 6) & Chr(13)
    sqlStr = sqlStr & "(" & Chr(13)
    For count = startRow To endRow
       Rem 拼接 字段名
       sqlStr = sqlStr & Replace(Range(filedMetaNo & count).Text, " ", "")
       Rem 拼接  字段类型(字段长度)
       sqlStr = sqlStr & "   " & Range(typeMetaNo & count)
       If IsEmpty(Range(lengthMetaNo & count)) = False Then
         sqlStr = sqlStr & "(" & Range(lengthMetaNo & count) & ")  "
       End If
       Rem 如果是主键,设置NOT NULL COMMENT
       If primaryKey = Range(filedMetaNo & count) Then
         sqlStr = sqlStr & " NOT NULL COMMENT "
       Else
        Rem 拼接  DEFAULT NULL COMMENT  ‘字段名称注释(字段备注)‘
       sqlStr = sqlStr & " DEFAULT NULL COMMENT "
       End If
       sqlStr = sqlStr & "‘" & Range(commentMetaNo & count)
       If IsEmpty(Range(comment2MetaNo & count)) = False Then
        sqlStr = sqlStr & "(" & Range(comment2MetaNo & count) & ")"
       End If
       sqlStr = sqlStr & "‘"
       sqlStr = sqlStr & "," & Chr(13)
    Next
    sqlStr = sqlStr & "PRIMARY KEY (" & primaryKey & ")" & Chr(13)
    sqlStr = sqlStr & ")ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘" & tableComment & "‘" & Chr(13)
    Debug.Print sqlStr
 End Sub

显示结果:
技术图片

在navicat中运行
技术图片

显示已经把mysql数据库的表结构导入数据库了。

见证奇迹的时刻(如何使用脚本)

脚本只需要改一个地方:
技术图片
对应这里的行号:
技术图片
即可。

技术图片

以上即是用脚本生成的4张表效果图。


个人微信公众号:
搜索: 怒放de每一天
不定时推送相关文章,期待和大家一起成长!!
技术图片


谢谢大家支持!



















以上是关于如何将Excel中表结构数据自动生成SQL脚本的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 数据库中表示非 SQL 自定义模式结构

如何在 Excel 中自动化 SQL 脚本

使用vba程序,实现excel数据库模板生成sql数据库结构

使用vba程序,实现excel数据库模板生成sql数据库结构

如何将数据库sql server2008中的数据库生成脚本输出

如何将Excel数据转换为SQL脚本