在Excel中使用条件格式优化不同的单元格范围(XlsxWriter)

时间:2017-04-27 12:09:46

标签: python conditional-formatting xlsxwriter

我有一段代码,可以从excel文件(文件A)创建数据帧,应用格式,并将结果保存到另一个excel文件(文件B)。

部分格式化涉及XlsxWriter包的.conditional_format()方法,如下所示:

worksheet.conditional_format('A1:F80', 
                             {'type':'cell', 
                              'criteria':'==',
                              'value':'"Folder & Contents:"', 
                              'format': boldfill})

文件A可以具有不同数量的数据,因此文件B将具有不同的大小。

因此我想知道是否有任何方法可以应用condition_format()方法,该方法能够读取结果数据帧的大小,并相应地将格式应用到表的末尾,而不是超过标准大小(比如'A1:F80'),如上面的代码所示。

感谢!!!

2 个答案:

答案 0 :(得分:2)

我认为没有内置选项,因此您可以定义自己的函数以从dataframe传递到excel范围。

以下是您可以做的事情:

获取行范围(简单):

def get_row_range(df, start_row = 0):
    # Using python convention that first row is zero
    return (str(start_row+1), str(start_row + df.shape[0]))

获取列范围(不太容易):

from string import ascii_uppercase

def get_col_range(df, start_col = 0):
    return (get_col_str(start_col), get_col_str(start_col + df.shape[1] - 1))

def get_col_str(num):
    N = len(ascii_uppercase)
    if num/N == 0:
        return ascii_uppercase[num]
    if num/N > 0:
        prefix = ascii_uppercase[num/N - 1]
        suffix = ascii_uppercase[num%N]
        return prefix + suffix

把所有东西放在一起:

def get_df_range(df, start_col = 0, start_row = 0):
    col_range = get_col_range(df, start_col)
    row_range = get_row_range(df, start_row)

    return ":".join([x+y for x, y in zip(col_range, row_range)])

测试:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(100, 3))

get_df_range(df)  # 'A1:C100'
get_df_range(df, start_col = 1, start_row = 2)  # 'B3:D102'

答案 1 :(得分:1)

条件格式化以及Xlsxwriter中的几乎所有其他API都采用A1表示法或(row,col)notation。所以以下是等价的:

worksheet.conditional_format('A1:F80',    {...})
worksheet.conditional_format(0, 0, 79, 5, {...})

在您的情况下,您可以将最大行基于数据帧的长度:

worksheet.conditional_format(0, 0, len(df), 5, {...})

或类似的东西。有关条件格式范围的完整说明,请参阅docs