Bel*_*lla 7 python excel dataframe pandas openpyxl
所以我有以下代码,我正在写入一个已经存在的 Excel 文件:
book = load_workbook(file_path)
writer = pd.ExcelWriter(file_path, engine = 'openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
Run Code Online (Sandbox Code Playgroud)
我在线路中遇到错误
writer.book = 书为
writer.book = book
AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)
更糟糕的是这个错误发生在我同事的 mac 机器上,但没有发生在我的 Windows 机器上。有任何想法吗 ?
@P-TATE 的答案对我有用。我在运行时遇到了与@bella完全相同的问题,1.5.0但在运行时却没有遇到1.4.4。我在1.5.0 的发行说明中找到了以下内容
的所有属性
ExcelWriter之前都记录为非公开的。然而,一些第三方 Excel 引擎记录了对ExcelWriter.book或 的访问ExcelWriter.sheets,并且用户正在利用这些属性以及可能的其他属性。以前这些属性使用起来并不安全;例如,对的修改ExcelWriter.book不会更新ExcelWriter.sheets,反之亦然。为了支持这一点,pandas 公开了一些属性并改进了它们的实现,以便现在可以安全地使用它们。( GH45572 )以下属性现在是公共的并且被认为可以安全访问。
bookcheck_extensionclosedate_formatengineif_sheet_existssheetssupported_extensions以下属性已被弃用。它们现在会
FutureWarning在访问时引发一个问题,并将在未来的版本中删除。用户应该意识到他们的使用被认为是不安全的,并且可能会导致意外的结果。
cur_sheethandlespathsavewrite_cells
因此,经过很多(很多)努力后,我找到了一个适合我并且可能对其他人有用的解决方案。
正如此处所引用的,Pandas 团队的理念是将书籍(和表格)设置器设为私有,并将这些职责推到 Excel 引擎上来实现。
对我有用的解决方案是使用 python 将模板 excel 文件复制到新文件,例如:
import shutil
output_path = shutil.copy(template_path, output_path)
Run Code Online (Sandbox Code Playgroud)
output_path在实例化时作为工作簿加载ExcelWriter。因此,根本不需要调用openpyxl.load_workbook(),也不需要复制.bookor.sheets属性。mode和标志(有关更多信息,请参阅文档):if_sheet_existswriter = pd.ExcelWriter(
output_path,
engine="openpyxl",
mode="a",
if_sheet_exists="overlay",
)
Run Code Online (Sandbox Code Playgroud)
book(如果您以前有过)的引用,这是我遇到的一个特别微妙的错误。我在工作簿中修改表、定义的名称、引用等的所有代码都已应用于变量,book该变量是openpyxl.load_workbook(). 然后将该变量分配给ExcelWriter实例的book属性:writer.book = book就像您所做的那样。不过,这只是对内存中同一个对象的引用,所以修改book并ExcelWriter.book具有相同的效果,而我的代码恰好作用于book. 但是,如果您进行上述更改,您将不再需要book修改该变量,因此您只需使用writer.book与工作簿进行交互,如 中writer.book.defined_names.get(defined_name).attr_text = ref,而不是book.defined_names.get(defined_name).attr_text = ref。希望这可以帮助
我发现关键是在代码中使用 writer.workbook 而不是 writer.book:
writer.workbook = openpyxl.load_workbook('test.xlsx')
并在以下位置添加选项:
pd.ExcelWriter( ... , mode ='a', if_sheet_exists='覆盖')
import pandas as pd
import openpyxl
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
# create new excel file
df_empty = pd.DataFrame()
df_empty.to_excel('test.xlsx')
# ... with a sheet name
workbook = openpyxl.load_workbook('test.xlsx')
ex_sheet = workbook['Sheet1']
ex_sheet.title = 'Tmp'
workbook.save('test.xlsx')
# prepare a dataframe
df = pd.DataFrame({'Column1': ['aa', 'bb', 'cc', 'dd'],
'Column2': [100, 170, 140, 160]})
# insert a dataframe into an excel sheet
writer = pd.ExcelWriter('test.xlsx', engine='openpyxl', mode='a', if_sheet_exists='overlay')
writer.workbook = openpyxl.load_workbook('test.xlsx')
df.to_excel(writer, sheet_name='Tmp', index=False, header=True, startrow=3, startcol=3)
writer.save()
Run Code Online (Sandbox Code Playgroud)
我使用Python 3.8;openpyxl:3.0.10;熊猫:1.5.0