You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将目录下Excel文件导入MS Access?解决导入报错问题

解决Python导入Excel到MS Access时的HYC00错误

这个HYC00错误是因为Microsoft Access ODBC驱动不支持SQLAlchemy默认参数绑定的部分特性,再加上你的代码存在基础语法错误,以下是具体修复方案:

1. 先修复基础语法错误

你的xls_path字符串缺少闭合单引号,这会直接导致Excel读取失败:

xls_path = r'C:\Users\JMJ\Desktop\Excel_docs'  # 补上末尾的单引号

2. 修正数据类型兼容问题

Access对pandas的部分数据类型支持不佳(比如带时区的datetime、复杂object类型),需要提前转换为Access兼容的类型:

import pandas as pd
import sqlalchemy as sa
import openpyxl

# 修复路径并读取Excel
xls_path = r'C:\Users\JMJ\Desktop\Excel_docs'
df = pd.read_excel(xls_path, engine=openpyxl)

# 转换数据类型:处理带时区的datetime、将object转为字符串
for col in df.columns:
    if df[col].dtype == 'datetime64[ns, UTC]':
        df[col] = df[col].dt.tz_localize(None)
    elif df[col].dtype == 'object':
        df[col] = df[col].astype(str).fillna('')

# 构建数据库连接
connection_string = (r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
                     r'DBQ=C:\Users\JMJ\Desktop\testdb_python.accdb;'
                     r'ExtendedAnsiSQL=1;'
)
connection_url = sa.engine.URL.create(
     "access+pyodbc",
     query={"odbc_connect": connection_string}
)
engine = sa.create_engine(connection_url)

# 添加if_exists参数避免表已存在的错误,指定index=False不导入索引列
df.to_sql('New_table', engine, if_exists='replace', index=False)

3. 备选方案:直接用pyodbc执行插入(绕过SQLAlchemy参数绑定问题)

如果上述方法仍报错,可以直接使用pyodbc手动处理数据插入,规避SQLAlchemy的参数绑定限制:

import pandas as pd
import pyodbc
import openpyxl

xls_path = r'C:\Users\JMJ\Desktop\Excel_docs'
df = pd.read_excel(xls_path, engine=openpyxl)

# 转换数据类型(同上)
for col in df.columns:
    if df[col].dtype == 'datetime64[ns, UTC]':
        df[col] = df[col].dt.tz_localize(None)
    elif df[col].dtype == 'object':
        df[col] = df[col].astype(str).fillna('')

# 连接Access数据库
conn = pyodbc.connect(
    r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Users\JMJ\Desktop\testdb_python.accdb;'
    r'ExtendedAnsiSQL=1;'
)
cursor = conn.cursor()

# 创建表(如果不存在,可根据实际数据类型调整字段类型)
columns = ', '.join([f'[{col}] TEXT' for col in df.columns])
cursor.execute(f"CREATE TABLE IF NOT EXISTS New_table ({columns})")

# 批量插入数据
placeholders = ', '.join(['?' for _ in df.columns])
insert_query = f"INSERT INTO New_table ({', '.join([f'[{col}]' for col in df.columns])}) VALUES ({placeholders})"
cursor.executemany(insert_query, df.values.tolist())

conn.commit()
cursor.close()
conn.close()

关键注意事项

  • 确保Access ODBC驱动版本(32位/64位)与你的Python版本一致,否则会出现连接失败问题。
  • 如果Excel是xls格式,需改用xlrd引擎(注意xlrd 2.0+版本不再支持xlsx格式)。

内容的提问来源于stack exchange,提问作者John Mark Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:35:39