私はXlsxWriterを使用してpythonで作業しており、この問題を解決しようとして成功していません:
私のアプリは、データがテーブルのような構造で表示されるXlsxファイルを作成する必要があります。そのテーブルにはいくつかの空のセルがあります。
一部のセルに境界線を設定してテーブルのグリッドを作成したいので、次のように使用します。
format6 = excelbook.add_format()
format6.set_left(1)
for y in range(24):
Excel.write(y+5, 1, None, format6)
これらのセルに境界線を適用するため。次に、テーブルにデータを書き込みます。
テーブルのレイアウトは非常に複雑なので、データを書き込むのは簡単で、すべてを書き込んだら、セルにフォーマットを適用して境界線を付けますが、方法がわかりません。
コンテンツが失われることなく、以前に書き込まれたセルにフォーマットを適用する方法はありますか?
前もって感謝します。
私はそのモジュールの作者ですが、残念ながらそれは不可能です。
これは 計画されている機能 であり、それをサポートするために内部インフラストラクチャの(小さな)部分が存在しますが、現在利用できず、いつになるかはわかりません。
もう1つの回避策は、conditional_format
を使用し、type='no_errors'
を使用することです。
worksheet.conditional_format(your_range, {'type': 'no_errors',
'format': your_format})
それを行う1つの方法-1つのラッパーメソッドを使用してセルを書き込み、ヘルパーメソッドを使用してセルの値とスタイルを上書きする
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()
ワークブックのデフォルトのフォーマットを設定できます:
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')
...