web-dev-qa-db-fra.com

Appliquer le format à une cellule après avoir été écrit dans XlsxWriter

Je travaille sur python en utilisant XlsxWriter et j'ai essayé de résoudre ce problème sans succès:

Mon application doit créer un fichier Xlsx dans lequel les données sont affichées dans une structure de type tableau. Ce tableau contient des cellules vides.

Je voudrais définir des bordures sur certaines cellules pour créer une grille pour le tableau, donc j'utilise:

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

afin d'avoir une bordure appliquée à ces cellules. Ensuite, j'écris des données sur la table.

Étant donné que la disposition du tableau est assez complexe, il serait facile d'écrire des données et, une fois que tout est écrit, d'appliquer le format aux cellules pour avoir des bordures, mais je ne trouve pas le chemin.

Existe-t-il un moyen d'appliquer le format à une cellule une fois qu'elle a été écrite précédemment sans perdre son contenu?

Merci d'avance.

24
vbarb

Je suis l'auteur de ce module et malheureusement ce n'est pas possible.

C'est une fonctionnalité prévue , et (une petite) partie de l'infrastructure interne est là pour la prendre en charge, mais elle n'est pas actuellement disponible et je ne peux pas dire quand elle le sera.

34
jmcnamara

Une autre solution consiste à utiliser conditional_format, et utilise type='no_errors':

worksheet.conditional_format(your_range, {'type': 'no_errors',
                                          'format': your_format})
27
Robin Trietsch

Une façon de le faire - en utilisant une méthode wrapper pour écrire la cellule et une méthode auxiliaire pour écraser la valeur et le style de la cellule

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)

Utilisation comme celle-ci

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

enter image description here

7
pymen

vous pouvez définir le format par défaut du classeur:

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')
...
1
xingpei Pang