7

是否可以在 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()

在此处输入图像描述

我查看了格式化文档,但没有找到任何可以即时添加格式的东西。如果该set_whatever功能的行为类似于此示例,那么我不明白它有什么用处。

如果无法“即时”向现有格式添加格式,那么在构建许多独特格式时最佳做法是什么?

谢谢!

4

3 回答 3

12

你可以这样做:

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')
于 2019-03-20T20:49:29.500 回答
9

是否可以在 xlsxwriter 中“动态”修改或添加现有格式?

目前没有。

文档

XlsxWriter 电子表格中的每个唯一单元格格式都必须有一个对应的 Format 对象。不可能将 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 时,它将显示格式的最终​​状态,在这种情况下将是绿色。

构建许多独特格式时最实用的解决方法是将格式存储在由其属性索引的 dict 中。

于 2014-11-04T09:14:18.507 回答
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
于 2020-02-04T16:20:34.983 回答