问了Deep Seek,回答如下:
在FoxPro 9.0中,可以通过以下代码实现按钮功能,打开文件对话框并导入Excel数据到结构相同的DBF表中。对于XLSX格式,需使用ODBC连接,具体步骤如下:
### 实现代码:
```foxpro
* 按钮的Click事件代码
LOCAL lcFile, lcExt, lcConnStr, lnConnHandle, lnExec
* 选择Excel文件
lcFile = GETFILE("xls;xlsx", "选择Excel文件", "打开", 0)
IF EMPTY(lcFile)
RETURN
ENDIF
lcExt = UPPER(JUSTEXT(lcFile)) && 获取文件扩展名
* 打开目标表(假设表名为 Target.dbf)
USE Target.dbf EXCLUSIVE
IF lcExt == "XLS"
* 直接导入XLS文件
APPEND FROM (lcFile) TYPE XL5
ELSE
* 处理XLSX文件(通过ODBC)
lcConnStr = "Driver={Microsoft Excel Driver (*.xls, *.xlsx)};DBQ=" + lcFile + ";HDR=YES;IMEX=1;"
lnConnHandle = SQLSTRINGCONNECT(lcConnStr)
IF lnConnHandle < 0
MESSAGEBOX("无法连接Excel文件,请确保已安装ODBC驱动。")
RETURN
ENDIF
* 执行查询(假设数据在Sheet1中)
lnExec = SQLEXEC(lnConnHandle, "SELECT * FROM [Sheet1$]", "CursorTemp")
SQLDISCONNECT(lnConnHandle) && 断开连接
IF lnExec < 1
MESSAGEBOX("数据读取失败,请检查工作表名称或格式。")
RETURN
ENDIF
* 追加到目标表
SELECT Target
APPEND FROM DBF("CursorTemp")
USE IN CursorTemp && 关闭临时游标
ENDIF
MESSAGEBOX("数据导入完成!")
USE && 关闭目标表
```
### 关键说明:
1. **XLS文件导入**:
使用 `APPEND FROM ... TYPE XL5` 直接导入,要求Excel文件为旧版格式(.xls)。
2. **XLSX文件导入**:
- 通过ODBC驱动连接,需确保系统已安装 **Microsoft Excel Driver**(如Access Database Engine)。
- `HDR=YES` 表示首行为字段名,`IMEX=1` 强制混合数据为文本以避免类型错误。
- 数据通过临时游标(`CursorTemp`)中转后追加到目标表。
3. **结构一致性**:
- DBF和Excel的字段名、顺序、类型需完全一致。
- 日期/数值类型需特别注意格式匹配。
### 注意事项:
- **ODBC驱动问题**:若未安装驱动,XLSX导入会失败。可从微软官网下载并安装 **Microsoft Access Database Engine Redistributable**。
- **工作表名称**:代码假设数据在`Sheet1`中,若实际名称不同,需修改SQL语句中的 `[Sheet1$]`。
- **错误处理**:可添加更详细的错误捕获(如 `TRY...CATCH`),但FoxPro 9.0原生不支持,需通过返回值判断。
通过上述代码,既能支持传统的XLS文件,也能通过ODBC实现XLSX文件的导入。