【问题标题】:Append Query Results to Different Sheets in Excel in python在 python 中将查询结果附加到 Excel 中的不同工作表
【发布时间】:2018-04-02 22:18:18
【问题描述】:

我正在使用下面的代码在 3 个不同的数据库中运行 3 个不同的查询 并尝试将它们导出到单个 Excel 文件中,每个结果都在不同的工作表上(总共 9 个工作表)。

但是当运行下面的代码时,我得到一个只有 3 张纸的文件(每张纸只包含每个数据库上的第一个查询结果) 我使用pyodbc 进行数据库连接和pandas 以处理Excel 写入。

databases = {DB1, DB2, DB3}
queries = {query1, query2, query3}

writer = pd.ExcelWriter('C:\Temp\Output.xlsx')

for database in databases:
   cnxn = pyodbc.connect(driver='{SQL Server}', 
                         host=database.server, 
                         database=database.db_name,
                         trusted_connection=database.trusted_connection, 
                         user=database.user_name, 
                         password=database.password)
   cursor = cnxn.cursor()

   for q in queries:
      cursor.execute(q)
      rows = cursor.fetchall()
      df = pd.read_sql_query(q, cnxn)
      df.to_excel(writer, 
                  sheet_name=str(q.index(q))+"-"+database.name)
writer.save()

【问题讨论】:

  • XML 从何而来?无论如何 - 与其在执行每个查询后编写,为什么不构建所有查询的单个数据框,然后编写?
  • 另外——如果你使用cursor.execute然后rows = cursor.fetchall()——你为什么还要使用pd.read_sql_query(再次执行查询)而不是之前的直接放入 DataFrame 中?
  • str(q.index(q)) 这总是给 0 ,所以你得到表 0_DBNAME
  • @JonClements 抱歉,写的是 XML 而不是 Excel。
  • @JonClements 我尝试评论 2,希望 pd.read_sql_query (q, cnxn) 能提供我需要的东西,但在返回它们之前它一直保持空输出

标签: python excel pandas


【解决方案1】:

考虑在内部循环中使用enumerate 以获取带有变量的迭代器编号以用于工作表命名。

...
for i, q in enumerate(queries):
  df = pd.read_sql_query(q, cnxn)
  df.to_excel(writer, 
              sheet_name=str(i+1)+"-"+database.name)
...

或者,如果 queries 是一个列表,您可以使用 index 方法:

queries = [query1, query2, query3]

...
for q in queries:
  df = pd.read_sql_query(q, cnxn)
  df.to_excel(writer, 
              sheet_name=str(queries.index(q)+1)+"-"+database.name)
...

【讨论】:

  • 它有效,但我仍然不确定为什么 index(q) 在遍历查询时没有为我提供相同的东西。
  • 我相信您打算 index 一个 list 但使用了一个 set 的值。如果查询是一个列表,您可以使用queries.index(q)
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 2019-12-01
  • 2016-12-28
  • 2022-06-28
  • 1970-01-01
  • 2020-09-03
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多