我正在尝试根据列名定义需要应用于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
答案 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}
用法:
的单字母
注意:这仅适用于从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]])