#python #xlsxwriter
#python #xlsxwriter
Вопрос:
Я новичок в Python и пытаюсь автоматизировать отчет на своем рабочем месте, чтобы сэкономить время, место и проблемы. Отчет работает просто отлично, и почти весь мой код для записи результатов в документ Excel работает так, как и ожидалось. Однако эти два формата:
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'})
ведут себя странно. Когда я запускаю это:
i = 10
for lob in report.index.get_level_values(1).unique():
if report.loc[(program,lob)].sum().sum()==0:
pass
else:
place=report.loc[(program,lob)]
r=0
for year in place.index:
for item in range(8):
ws.write(i r,item 2,place.loc[year][item],integer)
for item in range(9):
ws.write(i r,item 10,place.loc[year][item 8],percent)
r =1
for col_num, value in enumerate(report.columns.values):
ws.write(i-1, col_num 2, value, headers)
ws.write(i-1,1,lob,lobtitle)
for row_num, year in enumerate(report.index.get_level_values(2).unique()):
ws.write(i row_num,1,year,bold)
ws.set_row(i-1,40)
ws.set_row(i 7,None,bold)
i =10
Первые восемь статистических данных записываются в моем «целочисленном» формате с белыми границами, но следующие девять в строке записываются в процентном формате для числа, но вообще без форматирования границ (оставляя строки Excel по умолчанию). Фактически, на протяжении всего отчета все, что я пишу в формате «целое число», работает, а все, что написано в формате «процент», дает правильный формат чисел без формата границ:
Кажущаяся простота этой проблемы сводит меня с ума. Спасибо за любую помощь, которую вы можете предоставить.
Для справки, вот полный код. «отчет» представляет собой многоиндексный фрейм данных с программами компании на уровне 0, направлением деятельности (lob) на уровне 1 и 2015-2020 годами на уровне 2.
#Establish common formats
wb=xl.Workbook('Report.xlsx')
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'})
lobtitle=wb.add_format({'bold':True,'italic':True,'font_size':14})
wrap=wb.add_format({'text_wrap':True})
headers=wb.add_format({'bold':True,'text_wrap':True,'bg_color':'#DCDCDC','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':'white','bg_color':'#DCDCDC'})
shadeinteger = wb.add_format({'num_format': '#,##0','border':1,'border_color':'white','bg_color':'#DCDCDC'})
shadebold=wb.add_format({'bold':True,'border_color':'white','bg_color':'#DCDCDC'})
gridinteger=wb.add_format({'num_format': '#,##0','border':1,'border_color':'gray'})
gridpercent=percent = wb.add_format({'num_format': '0.0%','border':1,'border_color':'gray'})
#For every program, blank out all cells and add company title.
for program in report.index.get_level_values(0).unique():
ws=wb.add_worksheet(program)
for j in range(100):
ws.set_row(j,None,blank)
ws.set_column('B:S',15)
ws.write(0,10,'Company Title',title)
ws.write(1,10,'Report Name',subtitle)
ws.write(2,10,'as of {}'.format(effective),subtitle)
ws.write(3,10,'Detail',subtitle)
#Check each lob within a program for nonzero values. For each nonzero lob, write the lob's stats.
#Write the nonzero lob and its policy years from the index, and drop ten rows for the next entry.
i = 10
for lob in report.index.get_level_values(1).unique():
if report.loc[(program,lob)].sum().sum()==0:
pass
else:
place=report.loc[(program,lob)]
r=0
for year in place.index:
for item in range(8):
ws.write(i r,item 2,place.loc[year][item],integer)
for item in range(9):
ws.write(i r,item 10,place.loc[year][item 8],percent)
r =1
for col_num, value in enumerate(report.columns.values):
ws.write(i-1, col_num 2, value, headers)
ws.write(i-1,1,lob,lobtitle)
for row_num, year in enumerate(report.index.get_level_values(2).unique()):
ws.write(i row_num,1,year,bold)
ws.set_row(i-1,40)
ws.set_row(i 7,None,bold)
i =10
Ответ №1:
Пример кода недостаточно полон, чтобы сказать, в чем проблема, но с форматами не должно быть никаких проблем, как показано в этом примере:
import xlsxwriter
workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet()
data1 = [1000, 1001, 1002]
data2 = [.35, .50, .75]
percent = workbook.add_format({'num_format': '0.0%', 'border': 1, 'border_color': 'white'})
integer = workbook.add_format({'num_format': '#,##0', 'border': 1, 'border_color': 'white'})
worksheet.write_column(2, 2, data1, integer)
worksheet.write_column(2, 4, data2, percent)
workbook.close()
Вывод:
Как предполагаю, программа может перезаписывать процентные ячейки другим форматом, но это невозможно определить без полного рабочего примера.
Обновление, основанное на коде обновления из OP:
Из вашего обновленного кода похоже, что вы перезаписываете формат процентов здесь:
gridpercent = percent = wb.add_format(...)
Это сбрасывает процентный формат.
Комментарии:
1. Спасибо за ответ! Я отредактировал свой пост с полным кодом для написания этих программных страниц. Когда я запускаю ваш код в новом файле, он работает отлично. Когда я копирую и вставляю ваши форматы для целых чисел и процентов в мои (на всякий случай, если я где-то пропустил какой-то ужасно очевидный символ), он снова терпит неудачу.
2. Из вашего обновленного кода похоже, что вы перезаписываете формат процентов здесь:
gridpercent=percent = wb.add_format({'num_format': '0.0%','border':1,'border_color':'gray'})
. Это сбрасывает процентный формат.3. Блестяще! Я скопировал формат процентов, чтобы избежать проблем, и только изменил цвет границы, а не удалил исходное имя формата. Большое спасибо!