写入 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
或类似的东西。
我正在努力重写一些旧代码以使其更加高效和透明,因为自从我上次编写它以来我学到了很多东西。该代码采用一些数据框,并使用 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
或类似的东西。