如何通过UNIX终端脚本自动为Excel表格按数值阈值着色(优先Python方案)
终端自动化实现方案
完全可以用纯Python脚本实现全流程,无GUI依赖、不需要手动打开Excel、可直接嵌入你现有的bash/R/Python流水线,比VBA方案适配性强——VBA必须依赖Windows/macOS下安装的桌面版Excel,无图形界面的UNIX服务器环境根本无法运行。
依赖安装
直接在UNIX终端执行以下命令安装依赖库即可,两个库都不需要桌面环境支持:pip install pandas openpyxl
其中pandas负责批量读取CSV文件、执行数据筛选逻辑,openpyxl负责生成多工作表Excel、设置单元格填充样式。
实现逻辑
- 遍历指定目录下所有输入的.csv文件,以文件名(去除后缀)作为对应工作表名称
- 对每个读入的表格按预设规则完成数据筛选
- 将筛选后的所有表格写入同一个Excel文件的独立工作表
- 逐表遍历数值单元格,按照阈值匹配规则给符合条件的单元格设置指定填充色
- 脚本支持命令行直接调用,全程无人工交互步骤
可直接复用的脚本代码
把以下代码保存为csv2formatted_excel.py,修改开头配置项匹配你的业务规则即可:
import os import pandas as pd from openpyxl import load_workbook from openpyxl.styles import PatternFill # -------------------------- 按需修改以下配置 -------------------------- CSV_FOLDER = "./csv_output" # 所有输入CSV文件存放的目录路径 FINAL_EXCEL_PATH = "./merged_result.xlsx" # 最终输出的Excel文件路径 # 数据筛选规则,示例为保留value列大于0的行,可根据实际需求自定义 filter_df = lambda df: df[df["value"] > 0] # 单元格填充规则:(数值判断函数, 十六进制填充色) STYLE_RULES = [ (lambda x: x < 10, "FFC7CE"), # 数值小于10填充浅红色 (lambda x: 10 <= x < 50, "FFEB9C"), # 数值在10-50区间填充浅黄色 (lambda x: x >= 50, "C6EFCE") # 数值大于等于50填充浅绿色 ] # 需要做阈值判断、应用填充色的数值列列名 NUMERIC_COLS = ["value", "score", "sample_count"] # ------------------------------------------------------------------- if __name__ == "__main__": # 收集目录下所有CSV文件 csv_list = [f for f in os.listdir(CSV_FOLDER) if f.endswith(".csv")] if not csv_list: raise RuntimeError("指定目录下未找到CSV文件") # 读入CSV、筛选、写入多sheet with pd.ExcelWriter(FINAL_EXCEL_PATH, engine="openpyxl") as writer: for csv_file in csv_list: df = pd.read_csv(os.path.join(CSV_FOLDER, csv_file)) df_filtered = filter_df(df) # Excel工作表名最长支持31字符,自动截断避免报错 sheet_name = csv_file.rstrip(".csv")[:31] df_filtered.to_excel(writer, sheet_name=sheet_name, index=False) # 加载生成的Excel设置单元格样式 wb = load_workbook(FINAL_EXCEL_PATH) for sheet in wb.sheetnames: ws = wb[sheet] # 匹配表头找到需要处理的列索引 col_index_map = {cell.value: cell.column for cell in ws[1]} target_cols = [col_index_map[col] for col in NUMERIC_COLS if col in col_index_map] # 遍历数据行设置填充色 for row_idx in range(2, ws.max_row + 1): for col_idx in target_cols: cell = ws.cell(row=row_idx, column=col_idx) cell_val = cell.value if not isinstance(cell_val, (int, float)): continue for judge_func, fill_color in STYLE_RULES: if judge_func(cell_val): cell.fill = PatternFill(fill_type="solid", start_color=fill_color) break wb.save(FINAL_EXCEL_PATH) print(f"处理完成,结果已写入{FINAL_EXCEL_PATH}")
流水线调用方式
- 给脚本添加可执行权限:
chmod +x csv2formatted_excel.py - 直接在bash流程中调用执行:
python3 csv2formatted_excel.py - 如果需要在R脚本中触发执行,直接调用
system("python3 csv2formatted_excel.py")即可,执行完成后会在指定路径生成最终Excel文件。
内容的提问来源于stack exchange,提问作者mad_nerd
相关产品推荐
相关产品推荐

