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

时间:2021-07-28 07:06:38

标签: python excel pandas openpyxl xlsxwriter

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

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

显然,我花了很多时间查看其他人对这个问题的解决方案(因为这个话题已经讨论了很多)。然而,我发现的问题是(至少在我的搜索中)没有一种方法对我有用,我相信以前正确的响应在当前版本的熊猫等中不再相关。而不是链接到几十个在试图回答这个问题的文章中,我将解释我在各种解决方案中遇到的问题。

  1. 使用 openpyxl 而不是 xlsxwriter - 这导致“BadZipFile: File is not a zip file”响应。据我了解,这与 Pandas 版本有关,或者更确切地说,由于 Pandas 版本,修复 (mode='a') 不起作用(我相信 1.2 之后的任何版本都有这个问题)。
  2. Helper Function 但是这不起作用,还会引发 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 还是很陌生,尽管直到今天我才发现过渡太困难。我遇到的大多数问题都很容易解决(对我来说),除了这个问题。如果有什么我完全错过了,把我放在赛道上,我就不会打扰了。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

经验教训,信息总是在那里,只是实际密切关注并尝试解决问题,而不是复制粘贴并在事情不起作用时挠头。