为什么代码会跳到函数的最后一行?

问题描述 投票:0回答:2

这是一个使用 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)
被跳过,但我不知道为什么它跳过代码行。

python pandas pycharm export-to-excel index-error
2个回答
0
投票

首先,您可能需要更新 pandas 和 openpyxl。

pip install --upgrade pandas openpyxl

with
关键字表示
pd.ExcelWriter
上下文管理器。 上下文管理器通常会处理诸如函数清理(即关闭文件)之类的事情,因此您不必显式处理这些任务。

上下文管理器可能默认使用不同的引擎,请参阅文档。您可以通过更改以下行自行指定引擎:

with pd.ExcelWriter(excelpath) as exwriter:

至:

with pd.ExcelWriter(excelpath, engine='openpyxl') as exwriter:

0
投票

这太尴尬了。我设法忽略了堆栈跟踪中的初始错误。

AttributeError: 'Workbook' object has no attribute 'add_format'

Pandas 可以使用不同的引擎来创建 Excel 工作表。我想我曾经知道这一点,但几年后我没有想到这一点。其中一个引擎是 openpyxl。另一个是xlsxwriter。不久前,我买了一台新笔记本电脑,显然没有在上面安装 xlsxwriter,所以 pandas 默认使用 openpyxl,它没有工作簿的

.add_format()
功能。由于某种原因,我不完全理解,在处理该错误时,它跳到了最后一行代码,导致了 IndexError。

安装 xlsxwriter 并将其设置为引擎解决了一切。

我很抱歉。这个故事的寓意:仔细阅读堆栈跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.