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.
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.
Une autre solution consiste à utiliser conditional_format
, et utilise type='no_errors'
:
worksheet.conditional_format(your_range, {'type': 'no_errors',
'format': your_format})
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()
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')
...