Применить формат к ячейке после записи в XlsxWriter

Я работаю над python с помощью XlsxWriter, и я безуспешно пытался решить эту проблему:

Мое приложение должно создать файл Xlsx, в котором данные отображаются в виде таблицы. В этой таблице есть несколько пустых ячеек.

Я хотел бы установить границы для некоторых ячеек, чтобы создать сетку для таблицы, поэтому я использую:

format6 = excelbook.add_format()
format6.set_left(1)
for y in range(24):
    excel.write(y+5, 1, None, format6)

чтобы применить границу к этим ячейкам. Затем я записываю данные в таблицу.

Поскольку макет таблицы довольно сложный, было бы легко записать данные и, как только все будет записано, применить формат к ячейкам, чтобы иметь границы, но я не могу найти способ.

Есть ли способ применить формат к ячейке после того, как она была написана ранее, без потери ее содержимого?

Заранее спасибо.


person vbarb    schedule 12.03.2014    source источник
comment
Судя по документации, это невозможно.   -  person Emmett Butler    schedule 12.03.2014
comment
Просто чтобы было ясно, вы все еще можете создать окончательный результат, который хотите; это просто потребует от вас структурировать логику вашей программы так, чтобы вы уже знали, какое форматирование применять к каждой ячейке, когда вы ее пишете. (Возможно, вы уже поняли это, но я не хочу, чтобы кто-нибудь, читающий это, увидел слова «невозможно» и ошибочно принял это за то, что они не могут обойти это.)   -  person John Y    schedule 13.03.2014
comment
Спасибо за ваш совет, @John, я уже сделал это сегодня, и, конечно, так: вместо того, чтобы записывать данные на лист, как они поступают из базы данных, мне удалось сохранить их в переменных, а затем проверить, соответствует ли данная ячейка должен быть записан с данными или просто пустым для построения макета.   -  person vbarb    schedule 13.03.2014


Ответы (4)


Я автор этого модуля и, к сожалению, это невозможно.

Это запланированная функция, и (небольшая) часть внутренней инфраструктуры находится там. для его поддержки, но в настоящее время он недоступен, и я не могу сказать, когда он будет.

Обновление: эта функция никогда не применялась и больше не планируется.

person jmcnamara    schedule 12.03.2014
comment
Большое спасибо за XlsxWriter и ваш ответ. Мы будем следить за будущими обновлениями. - person vbarb; 13.03.2014
comment
Для тех, кто не нажимает, чтобы узнать, почему это не было реализовано ... @jmcnamara говорит: взгляните на github.com/webermarcolivier/xlsxpandasformatter вместо этого. - person TryTryAgain; 11.04.2021

Другой обходной путь — использовать conditional_format и использовать type='no_errors':

worksheet.conditional_format(your_range, {'type': 'no_errors',
                                          'format': your_format})
person Robin Trietsch    schedule 08.03.2016
comment
Хотя это позволит обойти проблему во многих случаях использования, я хотел бы обратить внимание на некоторые ограничения, которые рассматриваются здесь: В Excel условный формат накладывается на существующий формат ячейки, и не все свойства формата ячейки могут быть изменены. Свойства, которые не могут быть изменены в условном формате: имя шрифта, размер шрифта, верхний и нижний индексы, диагональные границы, все свойства выравнивания и все свойства защиты. - person modulus0; 07.06.2017

Один из способов сделать это - использовать один метод-оболочку для записи ячейки и вспомогательный метод для перезаписи значения и стиля ячейки.

import xlsxwriter

class XLSGenerator:
    def __init__(self):
        self.workbook = xlsxwriter.Workbook('file.xls')
        sheet1 = self.workbook.add_worksheet('sheet1')
        sheet2 = self.workbook.add_worksheet('sheet2')
        self.sheets = {'sheet1': sheet1, 'sheet2': sheet2}
        #  dictionary with all written cells
        self.written_cells = {sheet: {} for sheet in self.sheets}

    def write_cell(self, sheet_name, cell, value, cell_format_dict=None):
        """Writes value and style, and saves it in self.written_cells"""

        sheet = self.sheets[sheet_name]
        if cell_format_dict:
            cell_format = self.workbook.add_format(cell_format_dict)
            sheet.write(cell, value, cell_format)
        else:
            cell_format_dict = None
            sheet.write(cell, value)

        # save sheet_name, cell and cell_value, and cell_format (dict)
        # example ['sheet1']['C12'] = ('some_text', {'font_size': 14, 'bold': True}
        self.written_cells[sheet_name][cell] = (value, cell_format_dict)

    def apply_style(self, sheet_name, cell, cell_format_dict):
        """Apply style for any cell, with value or not. Overwrites cell with joined 
        cell_format_dict and existing format and with existing or blank value"""

        written_cell_data = self.written_cells[sheet_name].get(cell)
        if written_cell_data:
            existing_value, existing_cell_format_dict = self.written_cells[sheet_name][cell]
            updated_format = dict(existing_cell_format_dict or {}, **cell_format_dict)
        else:
            existing_value = None
            updated_format = cell_format_dict

        self.write_cell(sheet_name, cell, existing_value, updated_format)

Такое использование

generator = XLSGenerator()
generator.write_cell('sheet1', 'A1', '10')
generator.write_cell('sheet1', 'B2', '20')
generator.write_cell('sheet1', 'C3', '30')

table_borders = {"left": 1, 'right': 1, 'top': 1, 'bottom': 1}
for cell in ('A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'):
   generator.apply_style('sheet1', cell, table_borders)

generator.workbook.close()

введите описание изображения здесь

person pymen    schedule 06.10.2015

вы можете установить формат книги по умолчанию:

import xlsxwriter
workbook = xlsxwriter.Workbook('example.xlsx')

# default cell format to size 10 
workbook.formats[0].set_font_size(10)
# default cell format to center
workbook.formats[0].set_align('center')
...
person xingpei Pang    schedule 29.04.2019
comment
Я не рекомендую этот обходной путь, так как он может иметь некоторые непредвиденные последствия, например повлиять на размер изображений, вставленных в рабочий лист. - person jmcnamara; 29.04.2019