使用DoCmd.TransferSpreadsheet导入Access时遇报错:External table is not in the expected format
解决Access导入Excel时“External table is not in the expected format”错误
这个问题我之前帮同事排查过,结合你同时安装Excel 2010和2016的环境,再加上你是为了避免长字段截断才转Excel的场景,大概率是格式兼容或者驱动冲突导致的,给你几个实用的解决方向:
1. 先排查Excel格式的兼容性问题
- 把转换后的Excel文件另存为**Excel 97-2003工作簿(.xls)**格式,不要用默认的.xlsx。Access对旧版.xls格式的识别稳定性更高,尤其是在多Excel版本共存的环境下。
- 保存前务必检查工作表:删除所有合并单元格、超链接、复杂公式这些特殊元素,它们很容易让Access误判表格格式。同时确认那个长描述字段在Excel里是完整的,没有转格式时出现的乱码或截断。
2. 强制指定OLEDB驱动版本,解决多Excel版本冲突
因为你装了两个Excel版本,Access可能调用了不匹配的驱动,导致格式识别失败。可以在导入代码里明确指定驱动:
- 如果用.xls格式,用Jet驱动:
Dim conn As New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\你的文件路径.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1;""" - 如果坚持用.xlsx,用ACE驱动(注意匹配Access的位数,32位Access对应32位ACE驱动):
Dim conn As New ADODB.Connection conn.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=C:\你的文件路径.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1;"""
IMEX=1参数是关键,它会让Access把所有字段当成文本处理,避免因数据类型不一致触发错误。
3. 更高效的替代方案:直接导入文本文件(无需转Excel)
你本来就是从文本文件转的Excel,不如直接跳过Excel这一步,直接把文本文件导入Access,还能彻底避免格式问题:
- 手动导入:用Access的“外部数据”→“文本文件”向导,选择分隔符/固定宽度后,在字段设置步骤把描述字段的数据类型改成“备注”,这样就能支持任意长度的文本,完全不会有250字符截断的问题。
- 代码导入:用
DoCmd.TransferText方法,示例如下:
要是需要自定义字段类型,可以先在Access里创建一个导入规范(手动导入时保存规范),然后把规范名称传给DoCmd.TransferText acImportDelim, , "目标Access表名", "C:\你的文本文件路径.txt", TrueTransferText的第二个参数。
内容的提问来源于stack exchange,提问作者user3860954
相关产品推荐
相关产品推荐

