Xlsxwriter-根据列标签动态更改格式

时间:2018-11-23 06:27:18

标签: python xlsxwriter

我正在尝试根据列名定义需要应用于excel电子表格的每一列的格式。

例如,如果列名称为“ 计数”,则需要使用“ 数字格式”。如果列名是“ 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 :(得分:1)

  

注释date_format = workbook.add_format({'num_format': 'dd/mm/yy'}),将日期列显示为Unix数字而不是正确的日期。
  显示的样本值为:42668,而不显示"24-10-16"

这是Windows Excel定义的默认行为。
阅读Excel for Windows stores dates by default as the number of days
文档:XlsxWriter Working with Dates and Time


  

评论:...我可以根据列名(即count,sale_date)使用适当的格式

您可以使用worksheet.set_column()设置整个列的样式。
文档:XlsxWriter worksheet.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}
  

用法
  注意:这仅适用于从AZ

字母
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]])