在 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 的大小也不同。
因此我想知道是否有任何方法可以应用 conditional_format() 方法来读取结果数据帧的大小,并相应地应用格式直到 table,而不是超过标准大小(如 'A1:F80'),如上面的代码所示。
谢谢!!!
我认为没有内置选项,因此您可以定义自己的函数以从数据帧传递到 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 表示法或(行,列)notation。所以以下是等价的:
worksheet.conditional_format('A1:F80', {...})
worksheet.conditional_format(0, 0, 79, 5, {...})
在您的情况下,您可以将最大行基于数据帧的长度:
worksheet.conditional_format(0, 0, len(df), 5, {...})
或类似的东西。有关条件格式范围的完整说明,请参阅 docs。
我有一段代码可以从 excel 文件(文件 A)创建数据帧,应用格式,并将结果保存到另一个 excel 文件(文件 B)中。
部分格式化涉及XlsxWriter包的.conditional_format()方法,像这样:
worksheet.conditional_format('A1:F80',
{'type':'cell',
'criteria':'==',
'value':'"Folder & Contents:"',
'format': boldfill})
文件 A 的数据量可能不同,因此文件 B 的大小也不同。
因此我想知道是否有任何方法可以应用 conditional_format() 方法来读取结果数据帧的大小,并相应地应用格式直到 table,而不是超过标准大小(如 'A1:F80'),如上面的代码所示。
谢谢!!!
我认为没有内置选项,因此您可以定义自己的函数以从数据帧传递到 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 表示法或(行,列)notation。所以以下是等价的:
worksheet.conditional_format('A1:F80', {...})
worksheet.conditional_format(0, 0, 79, 5, {...})
在您的情况下,您可以将最大行基于数据帧的长度:
worksheet.conditional_format(0, 0, len(df), 5, {...})
或类似的东西。有关条件格式范围的完整说明,请参阅 docs。