写入 DataFrame 的函数会阻止 workbook.close()

Function to write DataFrames prevents workbook.close()

我正在努力重写一些旧代码以使其更加高效和透明,因为自从我上次编写它以来我学到了很多东西。该代码采用一些数据框,并使用 xlsxwriter 将报告写入 Excel 文档中的不同选项卡。以前,我煞费苦心地为每个新的 sheet 和每个数据帧编写说明,这次我希望能简化它。我打算创建一个创建新 sheet 的函数,以及另一个将数据帧写入该工作 sheet.

的函数

我的测试如下:

#Creating the Report.xlsx and establishing formatting options.
wb=xl.Workbook('Specialty Programs Actual vs. Expected {}.{}.{}.xlsx'.format(reportdate.month,reportdate.day,reportdate.year))

title=wb.add_format({'font_size':16,'font_name':'Calibri','align':'center','border':1,'border_color':'white'})
subtitle=wb.add_format({'font_size':14,'font_name':'Calibri','align':'center','border':1,'border_color':'white'})
blank=wb.add_format({'bg_color':'white'})
black=wb.add_format({'bg_color':'black'})
bold=wb.add_format({'bold':True,'border_color':'white','border':1})
centerbold=wb.add_format({'bold':True,'border_color':'white','border':1,'align':'center'})
boldright=wb.add_format({'bold':True,'border_color':'white','border':1,'align':'right'})
lobtitle=wb.add_format({'bold':True,'italic':True,'font_size':14,'border_color':'white','border':1})
wrap=wb.add_format({'text_wrap':True})
headers=wb.add_format({'bold':True,'text_wrap':True,'bg_color':'#DCDCDC','align':'center'})
nsm_states=wb.add_format({'italic':True,'text_wrap':True,'align':'center'})
percent = wb.add_format({'num_format': '0.0%',  'border': 1, 'border_color': 'white'})
integer = wb.add_format({'num_format': '#,##0', 'border': 1, 'border_color': 'white'})
shadepercent = wb.add_format({'num_format': '0.0%','border':1,'border_color':'#DCDCDC','bg_color':'#DCDCDC'})
shadeinteger = wb.add_format({'num_format': '#,##0','border':1,'border_color':'#DCDCDC','bg_color':'#DCDCDC'})
shadebold=wb.add_format({'bold':True,'border_color':'#DCDCDC','bg_color':'#DCDCDC'})
gridinteger=wb.add_format({'num_format': '#,##0','border':1,'border_color':'gray'})
gridpercent = wb.add_format({'num_format': '0.0%','border':1,'border_color':'gray'})
smallinteger = wb.add_format({'num_format': '#,##0', 'border': 1, 'border_color': 'white','font_size':9})
smallpercent = wb.add_format({'num_format': '0.0%',  'border': 1, 'border_color': 'white','bottom_color':'black','font_size':9})
smalltext=wb.add_format({'font_size':9,'font_name':'Calibri','align':'center','border':1,'border_color':'white'})


def page_setup(tab,title):
    global ws
    ws=wb.add_worksheet(tab)
    for j in range(100):
        ws.set_row(j,None,blank)
    ws.set_column('B:K',15)
    ws.write(0,5,'Old Republic Specialty Insurance Underwriters',title)
    ws.write(1,5,title,subtitle)
    ws.write(2,5,'for {},{}'.format(reportdate.month_name(), reportdate.year),subtitle)
    
def write(df,formats,row,col,row_format,col_format):
    r=row+1
    for y in df.index.to_list():
        c=col+1
        for x in df.columns.to_list():
            ws.write(r,c,df.loc[y,x],formats)
            c+=1
        ws.write(r,col,y,row_format)
        r+=1

    c=col+1
    for x in df.columns.to_list():
        ws.write(row,c,x,col_format)
        c+=1

#Test for dataframe 'booked' 
page_setup('Booked Premium','Booked Premium')
write(booked,integer,8,2,bold,headers)
wb.close()

当我运行这个时,我得到错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-257-116331d62c10> in <module>
----> 1 wb.close()

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\workbook.py in close(self)
    320 
    321             try:
--> 322                 self._store_workbook()
    323             except IOError as e:
    324                 raise FileCreateError(e)

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\workbook.py in _store_workbook(self)
    710         packager._set_tmpdir(self.tmpdir)
    711         packager._set_in_memory(self.in_memory)
--> 712         xml_files = packager._create_package()
    713 
    714         # Free up the Packager object.

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\packager.py in _create_package(self)
    134         self._write_root_rels_file()
    135         self._write_workbook_rels_file()
--> 136         self._write_worksheet_files()
    137         self._write_chartsheet_files()
    138         self._write_workbook_file()

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\packager.py in _write_worksheet_files(self)
    190             worksheet._set_xml_writer(self._filename('xl/worksheets/sheet'
    191                                                      + str(index) + '.xml'))
--> 192             worksheet._assemble_xml_file()
    193             index += 1
    194 

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\worksheet.py in _assemble_xml_file(self)
   3957         # Write the worksheet data such as rows columns and cells.
   3958         if not self.constant_memory:
-> 3959             self._write_sheet_data()
   3960         else:
   3961             self._write_optimized_sheet_data()

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\worksheet.py in _write_sheet_data(self)
   5588         else:
   5589             self._xml_start_tag('sheetData')
-> 5590             self._write_rows()
   5591             self._xml_end_tag('sheetData')
   5592 

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\worksheet.py in _write_rows(self)
   5781                         if col_num in self.table[row_num]:
   5782                             col_ref = self.table[row_num][col_num]
-> 5783                             self._write_cell(row_num, col_num, col_ref)
   5784 
   5785                     self._xml_end_tag('row')

~\AppData\Roaming\Python\Python39\site-packages\xlsxwriter\worksheet.py in _write_cell(self, row, col, cell)
   5946         if cell.format:
   5947             # Add the cell format index.
-> 5948             xf_index = cell.format._get_xf_index()
   5949             attributes.append(('s', xf_index))
   5950         elif row in self.set_rows and self.set_rows[row][1]:

AttributeError: 'str' object has no attribute '_get_xf_index'

当我 运行 在函数外部执行相同的指令时,它会创建 sheet 并毫无问题地写入数据帧。函数方法是什么导致了这个问题,我该如何解决?非常感谢您的帮助!

我认为问题在于这一行:

ws.write(0,5,'Old Republic Specialty Insurance Underwriters',title)

它使用本地字符串变量 title 而不是格式对象。可能你打算在这里使用全局 title 格式对象,但它被同名的函数变量覆盖(在范围内)。

也许可以调用函数变量 title_str 或类似的东西。