繁体   English   中英

在Excel中的变化单元格范围应用条件格式(XlsxWriter)

[英]Applying Conditional Formatting over Varying Cell Ranges in Excel (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')如上面的代码所示。

谢谢!!!

我认为没有内置选项,因此您可以定义自己的函数以从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'

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM