当前位置: 首页 > news >正文

初识影刀:将多个相同格式EXCEL中内容汇总到一个EXCEL文件中去

原本每月都有表格汇总的,但领导说要统计一段时间内的内容,如果一个表格一个表格复制粘贴又太累了。所以使用影刀的功能。
文件夹中的数据表格如下
在这里插入图片描述
在这里插入图片描述
1、打开文件夹
2、获取文件夹中的文件名列表
3、如果文件名列表有“汇总”的内容则先删除
4、在这个文件夹下新建“汇总”的数据表格,用于存放复制来的数据
5、按文件名列表开始循环。
6、获取“汇总”表的总行数
7、依次打开文件夹中的各文件
8、获取打开文件的总行数
9、读取打开文件的内容,范围从A2到N总行数止。
10、将读取的内容复制到“汇总”数据表,开始行从1+“汇总”表总行数开始
11、关闭打开的文件
12、结束循环

以上基本上已经能获取数据了,但想将“汇总”的数据范围增加边框,经查询,没有很好的办法,后来在论坛上说可以使用魔法指令
在这里插入图片描述
在这里插入图片描述
所包含的代码如下

# pip install openpyxl pywin32import openpyxl
from openpyxl.styles import Border, Side
from openpyxl.utils import get_column_letter
import os
import win32com.client
import timefrom typing import *
try:from xbot.app.logging import trace as print
except:from xbot import printdef set_excel_data_border_keep_open(excel_file, sheet_name=None, border_style="thin", border_color="000000", has_header=True):"""title: Excel数据区域设置边框(保持打开)description: 打开Excel文件,自动检测数据区域并设置边框,完成后保持Excel文件打开状态。inputs: - excel_file (file): 输入的Excel文件路径,eg: "data.xlsx"- sheet_name (str): 要处理的工作表名称,不指定则使用活动工作表,eg: "Sheet1"- border_style (str): 边框样式,可选值:thin, medium, thick, double, dotted, dashed,eg: "thin"- border_color (str): 边框颜色,使用十六进制RGB值,eg: "000000"- has_header (bool): 数据是否包含表头,eg: Trueoutputs: - file_path (str): 处理后的Excel文件路径,eg: "E:\\KKK\\月汇总\\2025\\机加工时分析\\汇总.xlsx""""# 检查输入参数有效性valid_styles = ["thin", "medium", "thick", "double", "dotted", "dashed"]if border_style not in valid_styles:raise ValueError(f"边框样式必须是以下值之一: {', '.join(valid_styles)}")if not isinstance(border_color, str) or len(border_color) != 6:raise ValueError("边框颜色必须是6位十六进制RGB值,例如:000000")try:int(border_color, 16)except ValueError:raise ValueError("边框颜色必须是有效的十六进制值")# 确保文件路径是绝对路径excel_file = os.path.abspath(excel_file)# 检查文件是否存在if not os.path.exists(excel_file):raise FileNotFoundError(f"找不到Excel文件: {excel_file}")# 使用COM接口打开Excel应用程序try:excel = win32com.client.Dispatch("Excel.Application")excel.Visible = True  # 使Excel可见excel.DisplayAlerts = False  # 禁用警告弹窗# 尝试打开工作簿try:workbook = excel.Workbooks.Open(excel_file)except Exception as e:excel.Quit()raise Exception(f"无法打开Excel文件: {str(e)}")# 选择工作表if sheet_name:try:worksheet = workbook.Worksheets(sheet_name)worksheet.Activate()except:excel.Quit()raise ValueError(f"工作表 '{sheet_name}' 不存在")else:worksheet = workbook.ActiveSheet# 使用openpyxl处理边框设置# 先关闭Excel以便openpyxl可以访问文件workbook.Save()workbook.Close(False)excel.Quit()# 使用openpyxl设置边框wb = openpyxl.load_workbook(excel_file)if sheet_name:if sheet_name not in wb.sheetnames:raise ValueError(f"工作表 '{sheet_name}' 不存在")sheet = wb[sheet_name]else:sheet = wb.active# 检测数据区域def _detect_data_range():"""检测工作表中的数据区域"""# 找到最大行和最大列max_row = 1max_col = 1for row in sheet.iter_rows():for cell in row:if cell.value is not None:max_row = max(max_row, cell.row)max_col = max(max_col, cell.column)# 如果没有数据,返回默认范围if max_row == 1 and max_col == 1 and sheet.cell(1, 1).value is None:return None# 找到最小行和最小列min_row = max_rowmin_col = max_colfor row_idx in range(1, max_row + 1):for col_idx in range(1, max_col + 1):if sheet.cell(row_idx, col_idx).value is not None:min_row = min(min_row, row_idx)min_col = min(min_col, col_idx)return (min_row, min_col, max_row, max_col)# 获取数据范围data_range = _detect_data_range()if not data_range:raise ValueError("工作表中没有检测到数据")min_row, min_col, max_row, max_col = data_range# 创建边框样式border_styles = {"thin": Side(style="thin", color=border_color),"medium": Side(style="medium", color=border_color),"thick": Side(style="thick", color=border_color),"double": Side(style="double", color=border_color),"dotted": Side(style="dotted", color=border_color),"dashed": Side(style="dashed", color=border_color)}side = border_styles[border_style]normal_border = Border(left=side, right=side, top=side, bottom=side)# 如果有表头,为表头设置特殊边框if has_header and min_row < max_row:header_bottom = Side(style="double" if border_style == "thin" else border_style, color=border_color)header_border = Border(left=side, right=side, top=side, bottom=header_bottom)# 为表头应用边框for col in range(min_col, max_col + 1):cell = sheet.cell(row=min_row, column=col)cell.border = header_border# 为数据行应用边框for row in range(min_row + 1, max_row + 1):for col in range(min_col, max_col + 1):cell = sheet.cell(row=row, column=col)cell.border = normal_borderelse:# 没有表头,为所有单元格应用相同边框for row in range(min_row, max_row + 1):for col in range(min_col, max_col + 1):cell = sheet.cell(row=row, column=col)cell.border = normal_border# 保存工作簿wb.save(excel_file)wb.close()# 打印设置的数据范围信息range_address = f"{get_column_letter(min_col)}{min_row}:{get_column_letter(max_col)}{max_row}"print(f"已为数据范围 {range_address} 设置边框")# 重新打开Excel文件excel = win32com.client.Dispatch("Excel.Application")excel.Visible = Trueworkbook = excel.Workbooks.Open(excel_file)# 选择之前的工作表if sheet_name:worksheet = workbook.Worksheets(sheet_name)worksheet.Activate()# 选中设置了边框的区域cell_range = worksheet.Range(worksheet.Cells(min_row, min_col),worksheet.Cells(max_row, max_col))cell_range.Select()# 不关闭Excel,让它保持打开状态print(f"Excel文件已打开,并已设置数据区域边框")return excel_fileexcept Exception as e:# 确保在出错时关闭Exceltry:if 'workbook' in locals():workbook.Close(False)if 'excel' in locals():excel.Quit()except:passraise Exception(f"设置Excel边框时出错: {str(e)}")

效果如下
在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/325849.html

相关文章:

  • HRM分层推理模型在医疗AI上的应用探析
  • LeetCode算法日记 - Day 8: 串联所有单词的子串、最小覆盖子串
  • 学习嵌入式-IMX6ULL学习——中断
  • 防火墙组网方式总结
  • 阿里发布数字人模型echomimic_v3,在视频合成的基础上支持prompt输入~
  • 计算机组成原理2-5:C语言中的数据类型及转换
  • LangChain 框架 Parser 讲解
  • LeetCode 2438.二的幂数组中查询范围内的乘积:模拟(前缀和可选)
  • 十二、Linux Shell脚本:正则表达式
  • Linux线程——线程控制及理解
  • SDRAM详细分析——01 SDRAM基础
  • MySQL 函数
  • 【PyTorch学习笔记 - 01】 Tensors(张量)
  • STM32 HAL库驱动W25QXX Flash
  • es基本概念-自学笔记
  • 嵌入式硬件中MOS管图形详解
  • Unity笔记(五)知识补充——场景切换、退出游戏、鼠标隐藏锁定、随机数、委托
  • Mini-Omni: Language Models Can Hear, Talk While Thinking in Streaming
  • 数据库的基本操作(约束与DQL查询)
  • 分治-归并-912.排序数组-力扣(LeetCode)
  • 京东科技集团寻求稳定币链上活动规划师
  • 150V降压芯片DCDC150V100V80V降压12V5V1.5A车载仪表恒压驱动H6203L惠洋科技
  • shape转换ersi json 修改增加多部件要素处理和空洞处理
  • 安卓\android程序开发之基于 Android 的校园报修系统的设计与实现
  • Android.mk教程
  • RFID系统:物联网时代的数字化管理中枢
  • 算法训练营day45 动态规划⑫ 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇
  • Java -- 集合 --Collection接口和常用的方法
  • (3万字详解)Linux系统学习:深入了解Linux系统开发工具
  • leetcode 15 三数之和