Формат чисел, по-видимому, влияет на формат границ в xlsxwriter

#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. Блестяще! Я скопировал формат процентов, чтобы избежать проблем, и только изменил цвет границы, а не удалил исходное имя формата. Большое спасибо!