Apply format to a cell after being written in XlsxWriter

后端 未结 4 1613
野趣味
野趣味 2020-12-05 17:28

I work on python using XlsxWriter and I\'ve been trying to solve this problem with no success:

My app must create an Xlsx file in which data is shown in a table-like

相关标签:
4条回答
  • 2020-12-05 18:02

    One way of doing that - using one wrapper method to write cell, and helper method to overwrite cell's value and style

    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)
    

    Usage like this

    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()
    

    0 讨论(0)
  • 2020-12-05 18:07

    I'm the author of that module and unfortunately that isn't possible.

    It is a planned feature, and (a small) part of the internal infrastructure is there to support it, but it isn't currently available and I can't say when it will be.

    Update: this feature was never implemented and is no longer planned.

    0 讨论(0)
  • 2020-12-05 18:07

    Another workaround is to use conditional_format, and use type='no_errors':

    worksheet.conditional_format(your_range, {'type': 'no_errors',
                                              'format': your_format})
    
    0 讨论(0)
  • 2020-12-05 18:10

    you could set the default format of the workbook:

    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')
    ...
    
    0 讨论(0)
提交回复
热议问题