109691180 发表于 2026-9-26 15:58:47

Excel导入_数据库导出

<火山程序 类型 = "通常" 版本 = 1 />

类 选择夹快速 <基础类 = 组件布局器 折叠 @视窗.布局 = "client_size = \"695, 416\"">
{
    变量 选择列表框1 <类型 = 选择列表框 隐藏值属性 = "0" @视窗.布局 = "id = 101\r\npos = \"48, 32, 192, 344\"" 多列 = 真 允许选择多项 = 真>
    变量 按钮1 <类型 = 按钮 隐藏值属性 = "0" @视窗.布局 = "id = 102\r\npos = \"368, 56, 80, 40\"" 标题 = "载入数据库">
    变量 按钮5 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 103\r\npos = \"496, 296, 72, 32\"" 标题 = "开始">
    变量 高级分组框1 <类型 = 高级分组框 隐藏值属性 = "0" @视窗.布局 = "id = 104\r\npos = \"264, 208, 80, 120\"">
    变量 按钮2 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 105\r\nparent_id = 104\r\npos = \"8, 16, 64, 24\"" 标题 = "全选"
            字体 = ", 11, 0, 0, 0, 0, 0, 0">
    变量 按钮3 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 106\r\nparent_id = 104\r\npos = \"8, 48, 64, 24\"" 标题 = "反选"
            字体 = ", 11, 0, 0, 0, 0, 0, 0">
    变量 按钮4 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 107\r\nparent_id = 104\r\npos = \"8, 80, 64, 24\"" 标题 = "取消"
            字体 = ", 11, 0, 0, 0, 0, 0, 0">
    变量 组合框组 <类型 = 对象数组类>
    变量 编辑框1 <类型 = 编辑框 隐藏值属性 = "0" @视窗.布局 = "id = 108\r\npos = \"1, 1, 424, 30\"">
    变量 按钮8 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 109\r\npos = \"480, 56, 96, 40\"" 标题 = "导入Excel列">
    变量 标签1 <类型 = 标签 隐藏值属性 = "0" @视窗.布局 = "id = 110\r\npos = \"256, 112, 152, 40\"" 横向对齐方式 = 居中 纵向对齐方式 = 居中
            字体 = ", 14, 1, 0, 0, 0, 0, 0">
    变量 编辑框2 <类型 = 编辑框 隐藏值属性 = "0" @视窗.布局 = "id = 111\r\npos = \"248, 40, 96, 40\"" 内容 = "Sheet1$" 对齐方式 = 居中
            字体 = ", 14, 1, 0, 0, 0, 0, 0">
    变量 按钮9 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 112\r\npos = \"456, 328, 112, 48\"" 标题 = "打开文件夹">
    变量 按钮10 <类型 = 按钮 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 113\r\npos = \"432, 0, 80, 30\"" 标题 = "选择文件">
    变量 编辑框_文件名 <类型 = 编辑框 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 114\r\npos = \"520, 0, 120, 30\"" 对齐方式 = 居中>
    变量 列表框1 <类型 = 列表框 折叠2 隐藏值属性 = "0" @视窗.布局 = "id = 115\r\npos = \"480, 104, 96, 136\"" 背景颜色 = 0x00FF00 文本颜色 = 0x0000FF>
    变量 标签2 <类型 = 标签 隐藏值属性 = "0" @视窗.布局 = "id = 116\r\npos = \"576, 120, 48, 72\"" 标题 = "选择\r\nExcel\r\n工作表" 是否自动折行 = 真
            横向对齐方式 = 居中>

    # ★ 进度条

    变量 进度条1 <类型 = 进度条 隐藏值属性 = "0" @视窗.布局 = "id = 117\r\npos = \"0, 388, 695, 28\"">

    方法 按钮_被单击 <接收事件 类型 = 整数 注释 = "当按钮被单击后发送此事件">
    参数 来源对象 <类型 = 按钮 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    {
      变量 按钮标题 <类型 = 文本型>
      按钮标题 = 来源对象.标题

      如果 (按钮标题 == "开始")
      {
            导出Sqlite数据库 (选择列表框1)
            按钮5.标题 = "完成"

      }
      否则 (按钮标题 == "全选")
      {
            变量 i <类型 = 整数>
            循环 (, 选择列表框1.取项目数 (), i)
            {
                选择列表框1.选中项目 (i, 真)
            }

      }
      否则 (按钮标题 == "反选")
      {
            变量 i <类型 = 整数>
            循环 (, 选择列表框1.取项目数 (), i)
            {
                选择列表框1.选中项目 (i, 取反 (选择列表框1.是否被选中 (i)))
            }

      }
      否则 (按钮标题 == "取消")
      {
            变量 i <类型 = 整数>
            循环 (, 选择列表框1.取项目数 (), i)
            {
                选择列表框1.选中项目 (i, 假)
            }

      }
      否则 (按钮标题 == "载入数据库")
      {
            载入Sqlite数据库2 (选择列表框1)

      }
      否则 (按钮标题 == "导入Excel列")
      {
            导入Excel列 (选择列表框1, 编辑框2.内容)
            按钮5.标题 = "开始"

      }
      否则 (按钮标题 == "打开文件夹")
      {
            执行 (取运行目录 ())

      }
      否则 (按钮标题 == "选择文件")
      {
            变量 通用对话框1 <类型 = 通用对话框>
            变量 路径 <类型 = 文本型>
            变量 替换文件名 <类型 = 文本型>
            通用对话框1.初始目录 = 取特定目录 (特定目录类型.系统桌面)
            通用对话框1.过滤器 = "Excel(*.xls;*.xlsx;*.db)|*.xls;*.xlsx;*.db"

            如果真 (通用对话框1.打开 (本对象))
            {
                路径 = 通用对话框1.文件名
                编辑框1.内容 = 路径
                替换文件名 = 文件_取文件名 (路径, 假)
                编辑框_文件名.内容 = 替换文件名 + ".db"
            }

      }

      返回 (0)
    }

    方法 文件_取扩展名 <公开 静态 类型 = 文本型 注释 = "返回一个文件的后缀名,如:.jpg如果没有后缀,返回空" 折叠 @禁止流程检查 = 真>
    参数 文件名 <类型 = 文本型 注释 = "原文件.欲整路径">
    {
      变量 INT <类型 = 变整数>
      变量 类型 <类型 = 变整数>
      INT = 取文本指针 (文件名)
      @ @<类型>= (INT_P)PathFindExtensionW((LPCWSTR)@<INT>);
      返回 (指针到文本 (类型))
    }

    方法 文件_取文件名 <公开 静态 类型 = 文本型 注释 = "成功返回文件名" 折叠 @禁止流程检查 = 真>
    参数 文件路径 <类型 = 文本型>
    参数 是否带后缀 <类型 = 逻辑型 @默认值 = 假>
    {
      变量 szPath <类型 = 文本型>
      变量 suffix <类型 = 文本型>
      @ @<szPath> = PathFindFileNameW(@<文件路径>.GetText());
      如果真 (是否带后缀 == 假)
      {
            suffix = 文件_取扩展名 (szPath)
            szPath = 取文本左边 (szPath, 取文本长度 (szPath) - 取文本长度 (suffix))
      }
      返回 (szPath)
    }

    方法 不卡延时 <公开 折叠>
    参数 等待时间 <类型 = 整数 注释 = "单位:毫秒">
    {
      @ DWORD tm0 = 0, tm1 = 0;
      @ tm0 = GetTickCount();
      @ tm1 = GetTickCount();
      @ while((tm1 - tm0) < @<等待时间>)
      @ {
      @   MSG msg;
      @   while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
      @   {
      @          TranslateMessage(&msg);
      @          DispatchMessage(&msg);
      @   }
      @   tm1 = GetTickCount();
      @ }
    }

    方法 列索引转Excel名 <公开 静态 类型 = 文本型 注释 = "0基索引 -> A1, B1, ..., Z1, AA1, AB1, ..." 折叠>
    参数 索引 <类型 = 整数>
    {
      变量 结果 <类型 = 文本型 值 = "">
      变量 n <类型 = 整数>
      n = 索引 + 1

      判断循环 (n > 0)
      {
            n = n - 1
            结果 = 到文本 ((字符)(n % 26 + 65)) + 结果
            n = n / 26
      }

      返回 (结果 + "1")
    }

    方法 数组中是否存在 <公开 静态 类型 = 逻辑型 折叠>
    参数 数组 <类型 = 文本数组类>
    参数 目标 <类型 = 文本型>
    {
      变量 k <类型 = 整数>
      循环 (, 数组.取成员数 (), k)
      {
            如果真 (数组.取成员 (k) == 目标)
            {
                返回 (真)
            }
      }
      返回 (假)
    }

    方法 规范化列名 <公开 静态 类型 = 文本型 注释 = "把任意表头转成合法、唯一、可读的SQLite字段名" 折叠>
    参数 原始名 <类型 = 文本型>
    参数 索引 <类型 = 整数 注释 = "列索引,用于兜底命名">
    参数 已用名集合 <类型 = 文本数组类 注释 = "已占用的字段名,用于去重">
    {
      变量 名 <类型 = 文本型>
      名 = 原始名

      // 1. 去掉不可见字符与全角空格(转义符写法)
      子文本替换 (名, "\r\n", "")
      子文本替换 (名, "\n", "")
      子文本替换 (名, "\r", "")
      子文本替换 (名, "\t", "")
      子文本替换 (名, " ", "")
      名 = 删首尾空 (名)

      // 2. 所有特殊符号(含空格、标点、括号、全角符号)替换为下划线
      常量 符号表达式 <类型 = 文本型 值 = "[`~!@#$%^&*()\\-+=<>?:\"{}|,.\\/;\'\\\\[\\]·~!@#¥%……&*()——\\-+={}|《》?:“”【】、;‘’,。、\\s]+">
      名 = 正则文本替换 (名, 符号表达式, "_")

      // 3. 连续下划线压成一个,去首尾下划线
      名 = 正则文本替换 (名, "_+", "_")
      名 = 正则文本替换 (名, "^_+|_+$", "")

      // 4. 空名兜底
      如果真 (名 == "")
      {
            名 = 列索引转Excel名 (索引)
      }

      // 5. 首字符是数字则加前缀 L
      如果真 (寻找文本 ("0123456789", 取文本左边 (名, 1), , 假) != -1)
      {
            名 = "L" + 名
      }

      // 6. 重名去重
      变量 新名 <类型 = 文本型>
      新名 = 名
      变量 序号 <类型 = 整数>
      序号 = 1
      判断循环 (数组中是否存在 (已用名集合, 新名))
      {
            序号 = 序号 + 1
            新名 = 名 + "_" + 到文本 (序号)
      }
      已用名集合.加入成员 (新名)

      返回 (新名)
    }

    方法 载入Sqlite数据库2 <公开>
    参数 绑定组件 <类型 = 窗口组件 注释 = "可以为表格,也可为超级列表框">
    {
      变量 SQ数据库 <类型 = SQLite数据库类>
      变量 SQ记录集 <类型 = SQLite记录集类>
      变量 选择框1 <类型 = 选择列表框>
      变量 i <类型 = 整数>
      变量 总列数 <类型 = 整数>
      变量 目录内容 <类型 = 文本型>

      目录内容 = 取运行目录 () + 编辑框_文件名.内容

      如果 (文件是否存在 (目录内容) == 假)
      {
            调试信息框 ("文件不存在:" + 目录内容)
            返回
      }

      如果 (SQ数据库.打开 (目录内容, SQLite打开方式.读写打开) == 假)
      {
            调试信息框 ("打开数据库失败:" + SQ数据库.取最近错误描述 ())
            返回
      }

      SQ记录集 = SQ数据库.取记录集 ("SELECT * FROM BOOK")
      选择框1 = (选择列表框)绑定组件
      选择框1.清空 ()

      总列数 = (整数)SQ记录集.列数
      循环 (总列数, i)
      {
            变量 列名 <类型 = 文本型>
            列名 = SQ记录集.取指定列名 (i)
            如果真 (文本是否为空 (列名) == 真)
            {
                列名 = 列索引转Excel名 (i)
            }
            选择框1.插入项目 (i, 列名)
            调试输出 (i, 列名)
      }

      SQ记录集.释放 ()
      SQ数据库.关闭 ()
    }

    方法 导出Sqlite数据库 <注释 = "批量多值INSERT + PRAGMA调优 + 特殊表头规范化,快速版">
    参数 绑定组件 <类型 = 窗口组件 注释 = "可以为表格,也可为超级列表框">
    {
      变量 SQL数据库 <类型 = SQLite数据库类>
      变量 选择框1 <类型 = 选择列表框>
      变量 数据库1 <类型 = 数据库类>
      变量 记录集1 <类型 = 记录集类>
      变量 文件路径 <类型 = 文本型>
      变量 错误内容 <类型 = 文本型>
      变量 表格名 <类型 = 文本型>
      变量 i <类型 = 整数>
      变量 计次 <类型 = 整数 值 = 0>
      变量 已选数量 <类型 = 整数 值 = 0>
      变量 字段列表 <类型 = 文本型>
      变量 建表字段 <类型 = 文本型>
      变量 原始列名列表 <类型 = 文本数组类>
      变量 清洗列名列表 <类型 = 文本数组类>
      变量 已用名集合 <类型 = 文本数组类>
      变量 插入前缀 <类型 = 文本型>
      变量 建表语句 <类型 = 文本型>
      变量 批SQL <类型 = 文本型>
      变量 批计数 <类型 = 整数 值 = 0>
      变量 用户选择 <类型 = 返回按钮类型>
      变量 总行数 <类型 = 整数 值 = 0>

      常量 每批行数 <类型 = 整数 值 = 500>

      选择框1 = (选择列表框)绑定组件

      // 1. 收集勾选列,同时建立"原始列名 -> 清洗后列名"映射
      循环 (, 选择框1.取项目数 (), i)
      {
            如果真 (选择框1.是否被选中 (i) == 真)
            {
                变量 原始名 <类型 = 文本型>
                变量 清洗名 <类型 = 文本型>
                原始名 = 选择框1.取项目文本 (i)

                如果真 (原始名 == "IID")
                {
                  到循环尾
                }

                清洗名 = 规范化列名 (原始名, i, 已用名集合)

                原始列名列表.加入成员 (原始名)
                清洗列名列表.加入成员 (清洗名)

                建表字段 = 建表字段 + "," + 清洗名 + " TEXT"
                字段列表 = 字段列表 + "," + 清洗名

                已选数量 = 已选数量 + 1
            }
      }

      如果真 (已选数量 == 0)
      {
            调试信息框 ("没有选中任何列")
            返回
      }

      字段列表 = 取文本右边 (字段列表, 取文本长度 (字段列表) - 1)
      建表字段 = 取文本右边 (建表字段, 取文本长度 (建表字段) - 1)

      // 预先拼好 INSERT 前缀
      插入前缀 = "INSERT INTO BOOK (" + 字段列表 + ") VALUES "

      建表语句 = "CREATE TABLE BOOK(IID INTEGER PRIMARY KEY AUTOINCREMENT," + 建表字段 + ")"

      // 2. 覆盖前确认(用 返回按钮类型.确认钮 判断)
      文件路径 = 取运行目录 () + 编辑框_文件名.内容

      如果 (文件是否存在 (文件路径))
      {
            用户选择 = 信息框 ("数据库文件已存在,是否覆盖?" + "\r\n" + 文件路径, 信息框按钮.确认取消钮 + 信息框按钮.询问图标, "确认")
            如果 (用户选择 != 返回按钮类型.确认钮)
            {
                返回
            }

            如果 (删除文件 (文件路径) == 假)
            {
                调试信息框 ("无法删除旧数据库文件:" + 文件路径)
                返回
            }
      }

      // 3. 打开/新建数据库
      如果 (SQL数据库.打开 (文件路径, 位或 (SQLite打开方式.读写打开, SQLite打开方式.新建打开)) == 假)
      {
            调试信息框 ("创建数据库文件失败:" + SQL数据库.取最近错误描述 ())
            返回
      }

      // 3.1 PRAGMA 调优
      SQL数据库.执行SQL语句 ("PRAGMA synchronous = OFF", 错误内容)
      SQL数据库.执行SQL语句 ("PRAGMA journal_mode = MEMORY", 错误内容)
      SQL数据库.执行SQL语句 ("PRAGMA temp_store = MEMORY", 错误内容)
      SQL数据库.执行SQL语句 ("PRAGMA cache_size = 20000", 错误内容)

      // 4. 建表
      如果 (SQL数据库.执行SQL语句 (建表语句, 错误内容) != 0)
      {
            调试信息框 ("建表失败:" + 错误内容)
            SQL数据库.关闭 ()
            返回
      }
      调试输出 (建表语句)

      // 5. 连接 Excel
      表格名 = 编辑框2.内容
      如果 (连接Excel (编辑框1.内容, 真, 数据库1) == 假)
      {
            调试信息框 ("连接 Excel 失败,请检查路径与 Access 驱动")
            SQL数据库.关闭 ()
            返回
      }

      记录集1 = 数据库1.执行SQL ("SELECT * FROM [" + 表格名 + "]")

      // ★ 初始化进度条
      总行数 = (整数)记录集1.记录数量
      如果真 (总行数 > 0)
      {
            进度条1.最小位置 = 0
            进度条1.最大位置 = 总行数
      }
      进度条1.位置 = 0
      处理事件 ()

      // 6. 开启事务
      SQL数据库.执行SQL语句 ("BEGIN TRANSACTION", 错误内容)

      // 7. 逐行读取 Excel + 批量多值 INSERT
      //    关键1:记录集打开时指针位于 BOF,必须先用 到下一行() 移动到首行再读取
      //    关键2:一行内所有列值共用一对括号,即 VALUES ('v1','v2',...),('v1','v2',...)
      批SQL = ""
      批计数 = 0
      计次 = 0

      判断循环 (记录集1.到下一行 () == 真)
      {
            变量 值行 <类型 = 文本型>
            值行 = ""

            // ★ 一行内所有列值拼成 "'v1','v2','v3','v4'"
            循环 (, 原始列名列表.取成员数 (), i)
            {
                变量 单元 <类型 = 文本型>
                单元 = 记录集1.读文本数据 (原始列名列表.取成员 (i))

                // 转义单引号
                如果真 (寻找文本 (单元, "'", , 假) != -1)
                {
                  子文本替换 (单元, "'", "''")
                }

                // 列与列之间用逗号连接,不要加括号
                值行 = 值行 + ",'" + 单元 + "'"
            }

            // 去掉最前面的逗号
            值行 = 取文本右边 (值行, 取文本长度 (值行) - 1)

            // ★ 一行的完整值:加一对括号
            值行 = "(" + 值行 + ")"

            // ★ 行与行之间用逗号拼接到批里
            如果 (批SQL == "")
            {
                批SQL = 值行
            }
            否则
            {
                批SQL = 批SQL + "," + 值行
            }

            批计数 = 批计数 + 1
            计次 = 计次 + 1

            // 达到批量阈值,一次性提交
            如果真 (批计数 >= 每批行数)
            {
                如果 (SQL数据库.执行SQL语句 (插入前缀 + 批SQL, 错误内容) != 0)
                {
                  调试输出 ("批量插入失败:", 错误内容)
                }

                批SQL = ""
                批计数 = 0

                // 刷新进度与标签
                标签1.标题 = "已导出 " + 到文本 (计次)
                进度条1.位置 = 计次
                处理事件 ()
            }
      }

      // 7.1 提交剩余不足一批的行
      如果真 (批SQL != "")
      {
            如果 (SQL数据库.执行SQL语句 (插入前缀 + 批SQL, 错误内容) != 0)
            {
                调试输出 ("批量插入失败:", 错误内容)
            }
      }

      // 8. 提交事务
      如果 (SQL数据库.执行SQL语句 ("COMMIT", 错误内容) != 0)
      {
            调试信息框 ("提交事务失败:" + 错误内容)
            SQL数据库.执行SQL语句 ("ROLLBACK", 错误内容)
      }

      标签1.标题 = "完成 " + 到文本 (计次)

      // ★ 进度条走到底(防止记录数量与实际不一致导致未满)
      如果 (进度条1.最大位置 > 0)
      {
            进度条1.位置 = 进度条1.最大位置
      }
      处理事件 ()

      // 9. 释放资源
      记录集1.关闭 ()
      数据库1.关闭 ()
      SQL数据库.关闭 ()
    }

    方法 连接Excel <公开 类型 = 逻辑型 折叠>
    参数 文件路径 <类型 = 文本型>
    参数 是否新版 <类型 = 逻辑型 注释 = "真=2007+ (ACE),假=2003- (JET)" @默认值 = 真>
    参数 数据库1 <类型 = 数据库类>
    {
      如果 (是否新版)
      {
            返回 (数据库1.连接 ("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + 文件路径 + "; Extended Properties=Excel 12.0;"))
      }
      否则
      {
            返回 (数据库1.连接 ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + 文件路径 + "; Extended Properties=Excel 8.0;"))
      }
    }

    方法 导入Excel列 <公开>
    参数 绑定组件 <类型 = 窗口组件 注释 = "可以为表格,也可为超级列表框">
    参数 表格名 <类型 = 文本型 注释 = "Access或Excel中的表名称" @默认值 = "">
    {
      变量 数据库1 <类型 = 数据库类>
      变量 记录集1 <类型 = 记录集类>
      变量 记录集_表名 <类型 = 记录集类>
      变量 字段列表 <类型 = 数据库字段集合类>
      变量 选择框1 <类型 = 选择列表框>
      变量 当前表格名 <类型 = 文本型>
      变量 i <类型 = 整数>
      变量 表数量 <类型 = 整数>
      变量 表索引 <类型 = 整数>

      如果真 (文件是否存在 (编辑框1.内容) == 假)
      {
            调试信息框 ("文件不存在:" + 编辑框1.内容)
            返回
      }

      如果真 (连接Excel (编辑框1.内容, 真, 数据库1) == 假)
      {
            调试信息框 ("连接 Excel 失败,请检查 Access 驱动")
            返回
      }

      记录集_表名 = 数据库1.取结构信息 (数据库结构信息类型.表集)

      列表框1.清空 ()
      表数量 = (整数)记录集_表名.记录数量
      表索引 = 0
      判断循环 (表索引 < 表数量)
      {
            变量 表名 <类型 = 文本型>
            表名 = 记录集_表名.读索引文本数据 (2)
            如果真 (表名 != "")
            {
                列表框1.加入项目 (表名)
                调试输出 (表索引, "表名", 表名)
            }
            记录集_表名.到下一行 ()
            表索引 = 表索引 + 1
      }
      记录集_表名.关闭 ()

      // 若调用方指定了表格名则用指定值,否则用第一个表
      当前表格名 = 表格名
      如果真 (当前表格名 == "")
      {
            如果真 (列表框1.取项目数 () > 0)
            {
                当前表格名 = 列表框1.取项目文本 (0)
            }
      }

      如果真 (当前表格名 == "")
      {
            调试信息框 ("未找到任何工作表")
            数据库1.关闭 ()
            返回
      }

      选择框1 = (选择列表框)绑定组件
      选择框1.清空 ()

      记录集1 = 数据库1.执行SQL ("SELECT * FROM [" + 当前表格名 + "]")
      字段列表 = 记录集1.取字段列表 ()

      i = 0
      计次循环 (字段列表.成员数)
      {
            处理事件 ()
            变量 当前字段 <类型 = 数据库字段类>
            当前字段 = 字段列表.取成员 (取循环索引 ())

            // 表头为空则用 ACE 实际列名 F1/F2/... 兜底
            // 注意:读文本数据() 必须与这里写入的字段名严格一致,否则取到空值
            如果真 (文本是否为空 (当前字段.名称) == 真)
            {
                当前字段.名称 = "F" + 到文本 (取循环索引 () + 1)
            }

            选择框1.插入项目 (i, 当前字段.名称)
            调试输出 (i, 当前字段.名称)
            i = i + 1
      }

      记录集1.关闭 ()
      数据库1.关闭 ()
    }

    方法 文本_清除字符 <类型 = 文本型 注释 = "保留中文、英文、数字、下划线">
    参数 判断的内容 <类型 = 文本型>
    参数 修改 <类型 = 文本型 @默认值 = "">
    参数 匹配标志 <类型 = 整数 注释 = "默认正则匹配模式.无" @默认值 = 正则匹配模式.无>
    {
      常量 表达式 <类型 = 文本型 值 = "[`~!@#$%^&*()_\\-+=<>?:\"{}|,.\\/;\'\\\\[\\]·~!@#¥%……&*()——\\-+={}|《》?:“”【】、;‘’,。、]"
                注释 = "匹配所有键盘上可见的非字母和数字的符号">
      常量 中文、英文、数字表达式 <类型 = 文本型 值 = "[\\u4E00-\\u9FA5A-Za-z0-9_]+">
      变量 正则 <类型 = 正则表达式类>
      变量 内容 <类型 = 文本型>

      如果 (修改 == "")
      {
            正则.匹配 (判断的内容, 中文、英文、数字表达式, 匹配标志)
            {
                内容 = 内容 + 正则.取匹配文本 ()
            }
      }
      否则
      {
            内容 = 正则文本替换 (判断的内容, 表达式, 修改)
      }

      返回 (内容)
    }

    #

    方法 选择夹快速_创建完毕 <接收事件 类型 = 整数 注释 = "当本组件及其中所有子组件均被创建完毕后发送此事件.">
    参数 来源对象 <类型 = 选择夹快速 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    {
      变量 替换文件名 <类型 = 文本型>

      编辑框1.内容 = 取运行目录 () + "商品表.xlsx"
      替换文件名 = 文件_取文件名 (编辑框1.内容)
      编辑框_文件名.内容 = 替换文件名 + ".db"

      返回 (0)
    }

    方法 列表框_被双击 <接收事件 类型 = 整数 注释 = "当鼠标左键被双击时事件被触发">
    参数 来源对象 <类型 = 列表框 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    参数 横向位置 <类型 = 整数 注释 = "事件触发时的鼠标横向坐标位置,相对所处用户区的左边.">
    参数 纵向位置 <类型 = 整数 注释 = "事件触发时的鼠标纵向坐标位置,相对所处用户区的顶边.">
    参数 辅助键状态 <类型 = 整数 注释 = "事件触发时的辅助键组合状态,为\"辅助键状态\"类中各常量值的组合.">
    {
      如果 (来源对象 == 列表框1)
      {
            如果真 (列表框1.现行选中项 >= 0)
            {
                编辑框2.内容 = 列表框1.取项目文本 (列表框1.现行选中项)
                如果真 (文本是否为空 (编辑框2.内容) == 假)
                {
                  导入Excel列 (选择列表框1, 编辑框2.内容)
                }
            }
      }

      返回 (0)
    }
}

页: [1]
查看完整版本: Excel导入_数据库导出