Python - Excel - 将 sheet 添加到现有工作簿而不删除 sheet

Python - Excel - Add sheet to existing workbook without removing sheets

上下文:我正在尝试使一份相当复杂的报告自动化(不是概念上的,只是需要跟踪的事物的绝对数量)。经过大量调查后我确定的方法是;

  1. 创建一个模板 xlsx 文件,其中包含几个摘要页面,其中包含指向文件中其他(原始数据)sheet 的公式。
  2. 从 SQL 服务器中提取数据并插入到模板文件中,用相关数据覆盖原始数据 sheet。
  3. 发布报告(这很可能只是将 xlsx 文件移动到新目录)。

显然,我花了很多时间研究其他人对这个问题的解决方案(因为这个话题已经被讨论了很多)。然而,我发现的问题是(至少在我的搜索中)none 的目的方法对我有用,我相信以前正确的反应在 pandas 的当前版本中不再相关等等。我不会链接到数十篇试图回答这个问题的文章,而是会解释我在各种解决方案中遇到的问题。

  1. 使用 openpyxl 而不是 xlsxwriter - 这导致“BadZipFile:文件不是 zip 文件”响应。据我了解,这与 pandas 版本有关,或者更确切地说,由于 pandas 版本,修复程序 (mode='a') 不起作用(我相信任何超过 1.2 的版本都有此问题)。
  2. 但是这不起作用,还会抛出 BadZipFile 错误。

下面是经过大量编辑的代码版本,其中应提供所有必需的详细信息。

#Imports
import os
import pyodbc
import numpy as np
import shutil
import pandas as pd
import datetime
from datetime import date
from openpyxl import load_workbook


# Set database connection variables.
cnxn = pyodbc.connect(*Credentials*)
cursor = cnxn.cursor()

df = pd.read_sql_query(script, cnxn)
df.to_excel(writer, sheet_name = 'Some Sheet',index=False)

writer.close()

长话短说,本应非常非常简单的事情变成了多天的练习,这让我感到非常沮丧。如果有人对此有经验并可以提供一些见解,我将不胜感激。

最后,我不得不承认我对使用 python 还很陌生,尽管直到今天我才发现过渡太难了。我遇到的大多数问题(对我而言)都很容易解决,但这个问题除外。如果有什么我完全错过的东西,请把我放在轨道上,我不会打扰。

好吧,所以我发现我实际上是不正确的(大惊喜)。也就是我说的辅助函数不起作用的说法。它确实有效,ZipFile 问题很可能是由工作簿上的某种形式的保护引起的。有趣的是,我能够让它与新工作簿一起工作,但是当我更改新工作簿的名称时,它再次开始抛出 ZipFile 错误。在创建新文件并尝试不同的东西一段时间后,我终于让它工作了。

关于辅助函数我要注意两点;

  1. 效率不是特别高。至少不是我设置的方式。我用辅助函数中的 'append_df_to_excel' 替换了 'to_excel' 的所有实例。这样做导致 运行 时间从大约 1-2 分钟增加到超过 10 分钟。我会做更多的测试,看看为什么会这样(如果我发现一些有趣的东西,我会 post 回来),但如果使用更大的数据集,则需要注意一些事情。
  2. 这不是问题,但为了让它按预期工作,我不得不稍微改变一下功能。具体来说,为了在我的情况下使用 t运行cate 功能,我需要将 'truncate' 部分移动到 'firstrow' 部分之上。在我的情况下,这样做更有意义,而不是在 t运行cating sheet.
  3. 之前指定起始行

希望这可以帮助 运行遇到同样问题的任何人。

经验教训,一如既往,信息就在那里,这只是一个实际密切关注和尝试的问题,而不是复制粘贴并在事情不起作用时挠头。