是否可以在xlsxwriter中“动态”修改或添加现有格式?我想要这个功能,所以我可以保留一些主要格式并根据具体情况添加新标准。
例如,在下面的代码中,我想将下划线格式添加到单元格A2中的dark_blue_header_format。但是,这会产生一些意想不到的结果,如下图所示。我希望A1和A3是蓝色的24尺寸白色文字:我希望A2为蓝色,24尺寸的白色文字和加下划线。
import xlsxwriter
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()
dark_blue_header_format = workbook.add_format({
'bg_color': '#5081BB',
'font_color': '#FFFFFF',
'font_size': 24
})
worksheet.set_column('A:A', 30)
worksheet.write('A1', 'Company Name', dark_blue_header_format)
worksheet.write('A2', 'Underlined Company Name', dark_blue_header_format.set_underline())
worksheet.write('A3', 'Company Name', dark_blue_header_format)
workbook.close()
我查看了formatting docs,但我还没有找到任何可以动态添加格式的内容。如果set_whatever
功能的行为与此示例类似,那么我不明白它对什么有用。
如果无法“动态”向现有格式添加格式,那么构建许多独特格式时的最佳做法是什么?
谢谢!
答案 0 :(得分:3)
是否可以在xlsxwriter中“动态”修改或添加现有格式?
目前没有。
来自docs:
XlsxWriter电子表格中的每个唯一单元格格式都必须具有相应的Format对象。无法使用带有write()方法的Format,然后重新定义它以便在以后使用。这是因为格式应用于不处于其当前状态但处于其最终状态的单元。请考虑以下示例:
format = workbook.add_format({'bold': True, 'font_color': 'red'})
worksheet.write('A1', 'Cell A1', format)
# Later...
format.set_font_color('green')
worksheet.write('B1', 'Cell B1', format)
为单元格A1分配一种格式,该格式最初将字体设置为红色。但是,颜色随后设置为绿色。当Excel显示单元格A1时,它将显示格式的最终状态,在这种情况下将为绿色。
这可能会在将来的某个阶段发生变化,因为它可以合并和修改格式。有一个开放的feature request将覆盖这个,它将成为围绕separating data and formats的更大修改的一部分。
与此同时,构建许多独特格式的最佳做法是将格式存储在由其属性索引的字典中。
答案 1 :(得分:2)
您可以执行以下操作:
def copy_format(book, fmt):
properties = [f[4:] for f in dir(fmt) if f[0:4] == 'set_']
dft_fmt = book.add_format()
return book.add_format({k : v for k, v in fmt.__dict__.items() if k in properties and dft_fmt.__dict__[k] != v})
workbook = xlsxwriter.Workbook('Test.xlsx')
worksheet = workbook.add_worksheet()
initial_format = workbook.add_format({
'font_size': 13,
'bold': 1,
'border': 1,
'align': 'center',
})
new_format = copy_format(workbook, initial_format)
new_format.set_font_size(16)
new_format.set_font_color('white')
答案 2 :(得分:0)
谢谢大家解决这个问题。正是我遇到的。 用例:将不同的格式应用于不同类型的内容,但最重要的是,对某些单元格应用其他格式(“突出显示”)。例如,添加右边界和/或底边界以分隔表的不同部分;用其他格式突出显示最大值。
如果返回工作簿格式的函数进行复制,那么恐怕在填写大表时会生成太多格式实例。因此,我实施了一种解决方案,该方案可以预生成所有带有高光组合的格式。函数返回格式选择预生成的对象之一。我不确定是否值得分享,因为我是Python的新手。
workbook = xlsxwriter.Workbook("test.xlsx")
### example cell formats and highlights
frm_types={
"norm": {},
"it": {"italic":True},
"bold": {"bold":True},
"boldit": {"bold":True,"italic":True}
}
frm_highlights={
"max": {"bold":True,"font_color":"#006699"},
"border_right": {"right":1},
"border_bottom": {"bottom":1},
"align_right": {"align":"right"}
}
### Creating a table of workbook formats with all highlights combinations
## Given:
# wb - workbook,
# frm - format properties as dict,
# hlist - list of highlights as dicts.
## Recursively adds levels to multidim. list - [with no highlight, with highlight],
# finally returns the last level containing a pair of workbook formats
def frm_hl_level(wb,frm,hlist):
# create two dicts. of properties: without and with first highlight from hlist
frm_nohl=copy(frm)
frm_withhl=copy(frm)
frm_withhl.update(hlist[0])
# recursion step
if len(hlist)==1:
return [
wb.add_format(frm_nohl),
wb.add_format(frm_withhl)
]
else:
return[
frm_hl_level(wb,frm_nohl,hlist[1:]),
frm_hl_level(wb,frm_withhl,hlist[1:])
]
## The formats dictionary:
# keys = format names,
# items = multidim. tables of corresponding formats with
# all highlights combinations
frm_data_dict={
fnm:
frm_hl_level( workbook, frm_types[fnm],
list(frm_highlights.values()) )
for fnm in frm_types
}
## Function which returns workbook format object
## Given
# l - list of strings: [1st = format name, rest = highlights names],
# frms, hls, tbl - format dicts., highlights dicts., dict. of formats tables;
## Returns the corresponding workbook format from the dict. of tables
def frm_select(l,frms=frm_types,hls=frm_highlights,fdt=frm_data_dict):
# list of highlights keys for identifying table indices
hl_names=list(hls.keys())
# list of indices for identifying table element
ind_l=[0 for _ in hls] # init. - format with no highlights
# add highlights to index
for nm in l[1:]:
ind_l[hl_names.index(nm)]=1
# access the element of the table
arr=fdt[l[0]]
for ind in ind_l:
arr=arr[ind]
return arr