这是一个使用 Panda 的 ExcelWriter 将数组导出到 Excel 电子表格的函数。
或者至少过去是这样。已经用了几年了,效果很好。
现在,一旦到达打开 ExcelWriter 的行:
with pd.ExcelWriter(excelpath) as exwriter
它运行下一行:
format_link = exwriter.book.add_format()
然后它会跳过其他所有内容并跳转到函数的最后一行:
worksheet.set_row(row, None, row_color)
此跳转忽略了中间的所有内容 - if 语句、循环等。我在 ExcelWriter 创建和结束之间的每一行上放置了调试器断点,并且它跳过了所有这些。
我使用 PyCharm 2023.3.2 Community Edition 作为我的 IDE。这是最新版本。 解释器是Python 3.9.13
有什么想法吗?
功能:
def make_excel_array(the_array, headings, file_name, path="/Users/jrfreeze/Documents/DS_data/",
tab="Sheet1", col_format=True, color_rows=()):
"""
Accepts array of data and headings for excel sheet, exports excel workbook
:param the_array: list or lists of data
:param headings: list of the excel columns, send 0 or "" or [] to ignore
:param file_name: string desired name of the excel file
:param tab: string name on tab
:param path: string directory to pace the Excel file
:param col_format: boolean format column width to widest entry up to max of 50
:param color_rows: tuple of tuple of tuple and str. One middle tuple for each set of rows to color.
Inner tuple is row numbers to color; str is color to apply; e.g. (((1,2), 'red'), ((3,4), 'blue))
:return:
"""
import inspect
excelpath = path + file_name + ".xlsx"
if headings:
df = pd.DataFrame(the_array, columns=headings)
else:
df = pd.DataFrame(the_array)
if col_format:
max_lens = get_max_lens(the_array, headings)
else:
max_lens = []
with pd.ExcelWriter(excelpath) as exwriter:
format_link = exwriter.book.add_format()
format_link.set_font_color('blue')
if headings:
df.to_excel(exwriter, sheet_name=tab, index=False)
else:
df.to_excel(exwriter, sheet_name=tab, index=False, header=False)
worksheet = exwriter.sheets[tab]
caller = inspect.currentframe().f_back.f_code.co_name
if caller == "get_lsdyna_user_jobs":
worksheet.write(1, 1, df.iloc[0, 1], format_link)
worksheet.write(1, 2, df.iloc[0, 2], format_link)
if col_format:
for i in range(len(max_lens)):
worksheet.set_column(i, i, max_lens[i])
if color_rows:
for rows_format in color_rows:
row_color = exwriter.book.add_format()
row_color.set_font_color(rows_format[1])
for row in rows_format[0]:
worksheet.set_row(row, None, row_color)
带参数值的函数调用:
array = [['abd', 1], ['def', 2]]
headers = ['letters', 'number']
excelpath = '/Users/jrfreeze/Documents/DS_Quarterly_Reports/PY4_Q1/'
filename = 'testsheet'
make_excel_array(array, headers, filename, path=excelpath)
通常,这会将数组导出到 Excel 电子表格,并使用参数中提供的名称和路径。现在它会跳过代码的大部分主要部分,然后抛出错误:
IndexError: At least one sheet must be visible
我尝试注释掉最后一个块,开头为:
if color_rows
:
但它做了同样的事情,跳转到函数的新的最后一行:
worksheet.set_column(i, i, max_lens[i])
我猜它会抛出错误,因为将数据帧(df)转换为Excel格式的行:
df.to_excel(exwriter, sheet_name=tab, index=False)
被跳过,但我不知道为什么它跳过代码行。
首先,您可能需要更新 pandas 和 openpyxl。
pip install --upgrade pandas openpyxl
with
关键字表示pd.ExcelWriter
是上下文管理器。
上下文管理器通常会处理诸如函数清理(即关闭文件)之类的事情,因此您不必显式处理这些任务。
上下文管理器可能默认使用不同的引擎,请参阅文档。您可以通过更改以下行自行指定引擎:
with pd.ExcelWriter(excelpath) as exwriter:
至:
with pd.ExcelWriter(excelpath, engine='openpyxl') as exwriter:
这太尴尬了。我设法忽略了堆栈跟踪中的初始错误。
AttributeError: 'Workbook' object has no attribute 'add_format'
Pandas 可以使用不同的引擎来创建 Excel 工作表。我想我曾经知道这一点,但几年后我没有想到这一点。其中一个引擎是 openpyxl。另一个是xlsxwriter。不久前,我买了一台新笔记本电脑,显然没有在上面安装 xlsxwriter,所以 pandas 默认使用 openpyxl,它没有工作簿的
.add_format()
功能。由于某种原因,我不完全理解,在处理该错误时,它跳到了最后一行代码,导致了 IndexError。
安装 xlsxwriter 并将其设置为引擎解决了一切。
我很抱歉。这个故事的寓意:仔细阅读堆栈跟踪。