需要注意,由于你的工资表中的函数也原封不动的复制了,但是文件变化了,导致函数引用的单元格数据完全错误,所以要拆分工资表这种东西,需要提前把函数计算出来的值给复制粘贴成实际值而不是保持函数状态。
以下是代码,你要有其他需求可以让ai基于这个帮你改。
[Python] 纯文本查看 复制代码 """根据xlsx第一列数据拆分成新表功能脚本"""
import re
import shutil
from pathlib import Path
import openpyxl,os
# ---
import easygui as g
# 弹出文件选择窗口,让用户选择 Excel 文件
file_path = g.fileopenbox(
title="请选择导入文件",
default="*.xlsx" # 默认筛选显示 Excel 文件
)
# 如果用户点了“取消”,file_path 会返回 None
if file_path:
print(f"用户选择的文件路径是:{file_path}")
# 这里就可以使用你的 TEMPLATE_FILE = file_path
else:
print("用户取消了选择")
TEMPLATE_FILE = str(file_path)
#TEMPLATE_FILE = str(file_path).split(os.sep)[-1]
print(TEMPLATE_FILE)
# ---
# TEMPLATE_FILE = "非通信类导入模板.xlsx"
OUTPUT_DIR = Path("output")
try:
START_ROW = int(g.enterbox("请输入表头的最后一行数字:"))
START_ROW+=1
g.msgbox(f"已设置表头的最后一行为第 {START_ROW-1} 行,数据从第 {START_ROW} 行开始读取。")
except:
exit()
ILLEGAL_RE = re.compile(r'[\\/:*?"<>|]')
def read_names(template_path: str) -> list[str]:
"""读取模板 A10 开始的所有非空单元格值。"""
wb = openpyxl.load_workbook(template_path)
ws = wb.active
names = []
for row in range(START_ROW, ws.max_row + 1):
value = ws.cell(row=row, column=1).value
if value is not None and str(value).strip() != "":
names.append(str(value).strip())
wb.close()
return names
def clean_copy(filepath: str, name: str) -> None:
"""删除副本中 A9 下方除匹配行外的所有行。"""
wb = openpyxl.load_workbook(filepath)
ws = wb.active
# 找到匹配名称的行号
match_row = None
for row in range(START_ROW, ws.max_row + 1):
value = ws.cell(row=row, column=1).value
if value is not None and str(value).strip() == name:
match_row = row
break
if match_row is None:
wb.close()
raise ValueError(f"在模板 A 列中未找到匹配 '{name}' 的行")
# 从底部向上删除 A9 下方的行,保留匹配行
for row in range(ws.max_row, START_ROW-1, -1):
if row != match_row:
ws.delete_rows(row)
wb.save(filepath)
wb.close()
def main():
# 检查模板文件
if not Path(TEMPLATE_FILE).exists():
print(f"错误: 未找到模板文件 '{TEMPLATE_FILE}'")
return
# 读取名称列表
names = read_names(TEMPLATE_FILE)
print(f"共读取到 {len(names)} 个名称: {names}")
if not names:
print("没有需要处理的名称,退出。")
return
# 创建输出目录
OUTPUT_DIR.mkdir(exist_ok=True)
# 复制模板并清理每个副本
for name in names:
dest = OUTPUT_DIR / f"{name}.xlsx"
shutil.copy2(TEMPLATE_FILE, dest)
clean_copy(str(dest), name)
print(f"已生成: {dest}")
print(f"\n完成!共生成 {len(names)} 个文件,保存在 '{OUTPUT_DIR}/' 目录下。")
if __name__ == "__main__":
main() |