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]