首页 > 编程问答 >使用 pyodbc 将数据插入 MS Access 时无法在 Excel 文件中找到“Sheet1”

使用 pyodbc 将数据插入 MS Access 时无法在 Excel 文件中找到“Sheet1”

时间:2024-07-21 09:19:52浏览次数:11  
标签:python excel ms-access pyodbc

我正在尝试使用 pyodbc 将 Excel 文件中的数据插入到 MS Access 数据库中,但我不断遇到错误,指出在 Excel 文件中找不到“Sheet1”。这是我的代码:

import pyodbc

filename = 'ALC_2022068_06282024-testing copy.xlsx'

sql = r"""INSERT INTO tblALC_test ([dateofnotice], [provnbr])
          SELECT e.[dateofnotice], e.[provnbr]
          FROM [Excel 12.0 Xml;HDR=Yes;Database={xl}].[Sheet1$] AS e;
       """.format(xl=filename)

conn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' +
                      r'DBQ=F:\Kevin\CPD_Night\ALC_Testing.accdb;')    
cursor = conn.cursor()

cursor.execute(sql)
cursor.commit()

cursor.close()
conn.close()

该代码连接到 MS Access 数据库和 Excel 文件,但无法找到“Sheet1”选项卡。我已验证工作表名称和路径,并确保在运行脚本时关闭文件。

我尝试使用 pyodbc 将 Excel 文件中的数据插入到 MS Access 数据库中。我期望脚本在 Excel 文件中找到“Sheet1”并执行 SQL 查询来传输数据。但是,我遇到错误,指示找不到“Sheet1”选项卡。我验证了工作表名称,检查了文件路径,并确保运行脚本时文件已关闭,但问题仍然存在。


你遇到的问题是,你的连接字符串假设你使用的是“Excel 12.0 Xml”驱动程序,但该驱动程序只能读取 .xlsx 文件中 第一行 的数据,用于确定数据类型。它 不能 读取其他行,也不能用于将数据插入数据库。

为了解决这个问题,你需要使用不同的驱动程序来读取 Excel 文件。一种选择是使用 “Microsoft Excel Driver ( .xls, .xlsx, .xlsm, .xlsb)” 驱动程序。这个驱动程序可以读取 .xls 和 .xlsx 文件,并且可以读取所有行的数据。

下面是使用 "Microsoft Excel Driver ( .xls, .xlsx, .xlsm, .xlsb)" 驱动程序修改后的代码:

import pyodbc

filename = r'C:\path\to\your\ALC_2022068_06282024-testing copy.xlsx'  # 请替换成你的 Excel 文件路径

conn_str = (
    r'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};'
    r'DBQ=' + filename + ';'
)

conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

sql = r"""INSERT INTO tblALC_test ([dateofnotice], [provnbr])
          SELECT [dateofnotice], [provnbr]
          FROM [Sheet1$]
       """

cursor.execute(sql)
cursor.commit()

cursor.close()
conn.close()

# 然后连接到 Access 数据库并将数据插入
conn_str_access = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' 
    r'DBQ=F:\Kevin\CPD_Night\ALC_Testing.accdb;'
)

conn_access = pyodbc.connect(conn_str_access)
cursor_access = conn_access.cursor()

# ... 执行插入数据的操作 ...

cursor_access.close()
conn_access.close()

注意:

  • 确保你已经安装了 "Microsoft Excel Driver ( .xls, .xlsx, .xlsm, .xlsb)" 驱动程序。你可以在微软官网上下载。
  • filename 变量替换成你的 Excel 文件的完整路径。
  • 确保你的 Excel 文件中确实有一个名为 "Sheet1" 的工作表。

如果你的 Excel 文件很大,你可能需要调整 cursor.fast_executemany = True 来提高性能。

标签:python,excel,ms-access,pyodbc
From: 78771863

相关文章

  • 第四节:海量数据导出到Excel、百万Excel导入到DB、秒级/分钟级排行版
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 我在 Python 时间格式化函数中遇到代码问题
    我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:defmake_readable(seconds):ifseconds<60:s1=secondsh1,m1=(0,0)return......
  • 《流畅的Python》第二版 第11章
     fromarrayimportarrayimportmathclassVector2d:__match_args__=('x','y')typecode='d'def__init__(self,x,y):self.__x=float(x)self.__y=float(y)@propertydefx(self)......
  • 《流畅的Python》第二版 第12章
       fromarrayimportarrayimportmathimportfunctoolsimportitertoolsimportoperatorimportreprlibclassVector:typecode='d'def__init__(self,components):self._components=array(self.typecode,components)......
  • 如何在Python中给jupyter单元标准输入?
    我正在尝试在接受用户输入的jupyter笔记本上运行一个程序,但我不知道如何让它读取标准输入。例如,如果我使用shift-enter:a=input()print(a)运行代码,则单元格指示它正在运行,但不接受我的输入。我如何让它接受输入?你遇到的问题是Jupyternotebook中的代码单元默认......
  • Python:如何从 csvreader 列表中删除括号和单引号?
    Pythonn00b在这里。尝试使用csvreader从文件导入数组并打印一个值,但它添加了括号和单引号。这是我的代码:importrandomimportcsvwithopen('crimes.csv','r')ascsvfile:crimes=list(csv.reader(csvfile))hello=["Hello","Greetings","Hi&q......
  • Python 中的多行输入,支持空行并在控制台中检查“\n”
    您好,亲爱的社区,在解决某个竞赛任务时出现了问题。我解决了它,但由于输入棘手而无法交付。我在谷歌上搜索并尝试了几种找到的方法,但如果应用于此任务,它们中的每一种都有一些弱点。而且我无法完全重现所应用的输入,因为它嵌入在竞赛界面中;我可能只依赖描述。这就是为什么我......
  • Python Pandas - 读取 CSV 或 Excel
    我允许用户上传CSV或Excel文件。我正在使用pandas读取文件并创建数据框。由于我无法预测用户将上传哪种文件类型,因此我将pd.read_csv()和pd.read_excel()包装在try/except块中。ifform.validate_on_submit():input_filename=secure_filename(form.file.da......
  • 如何在 python 脚本中调用 robocopy 来批量复制多个文件夹?
    我正在尝试在网络驱动器之间移动多个大文件夹(>10Gb、>100个子文件夹、>2000个文件)。我尝试过在python中使用Shutil.copytree命令,它工作得很好,只是由于不同的原因它无法复制一小部分(<1%的文件)。我相信robocopy对我来说是最好的选择,因为我可以创建一个记录传输过......
  • 如何在Python中使用装饰器动态创建类方法?
    我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:装饰器应该从外部配置(例如字典)读取方法定义。装饰器应该动态地将这些方法添加到类中。每个生成的方法都应具有配置中指定的自己唯一的实现。以......