Xlsxwriter - динамически изменяет форматирование на основе метки столбца - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь определить форматирование, которое необходимо применить к каждому столбцу электронной таблицы Excel, на основе имени столбца.

Например, если имя столбца равно « count »тогда необходимо использовать number_format .Если имя столбца равно « sale_date », необходимо использовать « date_format ».

number_format = workbook.add_format({'num_format': '0', 'font_size': 12})
date_format = workbook.add_format({'num_format': 'dd/mm/yyyy hh:mm:ss', 'font_size': 12})

Используя два вышеуказанных формата в соответствующих столбцах, как показано ниже:

worksheet1.write('A1', 'count', number_format)
worksheet1.write('B1', 'sale_date', date_format)

Могу ли я сделать это динамическим на основе имени столбца вместо определения формата по метке столбца.Спасибо

Обновление:

Цикл, отображающий столбец заголовка в таблице Excel

for data in title:
    worksheet.write(row, col, data, number_format)
    col += 1

1 Ответ

0 голосов
/ 23 ноября 2018

Комментарий : date_format = workbook.add_format({'num_format': 'dd/mm/yy'}), показывает столбец даты в виде номера Unix, а не правильную дату.
Показанное значение примера: 42668 вместо отображения "24-10-16".

Это поведение по умолчанию, определенное в Windows Excel.
Чтение Excel для Windows по умолчанию сохраняет даты как количество дней
Документация: Работа XlsxWriterс датами и временем


Комментарий : ... чтобы я мог использовать соответствующий формат, основанный на имени столбца (а именно count, sale_date)

Вы можете использовать worksheet.set_column() для установки стиля для всего столбца.
Документация: Рабочий лист XlsxWriter.set_column ()

Предварительное условие : Порядок названия / стиля столбцов должен быть синхронизирован с вашей таблицей.
Например count == 'A', sale_date == 'B' и т. Д. ...

from collections import OrderedDict

_styles = OrderedDict([('count',number_format), ('sale_date', date_format), ('total', number_format), ('text', string_format)])

for col, key in enumerate(_styles):
    A1_notation = '{c}:{c}'.format(c=chr(col + 65))
    worksheet.set_column(A1_notation, None, _styles[key])
    print("worksheet.set_column('{}', None, {})".format(A1_notation, _styles[key]))

Вывод :

worksheet.set_column('A:A', None, number_format)
worksheet.set_column('B:B', None, date_format)
worksheet.set_column('C:C', None, number_format)
worksheet.set_column('D:D', None, string_format)

Для последующих записей вам не нужно присваивать style, например, использовать

worksheet.write('A1', 123)  

по умолчанию A:A number_format


Вопрос : Могу ли я сделать это динамическим на основе имени столбца

Вы не используете "имя столбца" , она называется Ячейка A1 Обозначение .
Настройка отображения dict, например:

style_map = {'A': number_format, 'B':date_format}

Использование :
Примечание : Это будет работать только с одной буквой, от A до Z

def write(A1_notation, value):
    worksheet1.write(A1_notation, value, style_map[A1_notation[0]])

Для строки-столбцазапись (0, 0):

style_map = {'0': number_format, '1':date_format}

Использование :

def write(row, col, value):
    worksheet1.write(row, col, value, style_map[col])

from xlsxwriter.utility import xl_rowcol_to_cell

def write(A1_notation, value):
    worksheet1.write(A1_notation, value, style_map[xl_cell_to_rowcol(A1_notation)[1]])
...