如何优化批量给文件夹内Excel文件添加Sensitivity Label的代码?
优化Excel敏感度标签批量添加方案
一、后台隐藏运行Excel(减少可视化资源占用)
当前代码的核心问题是每次打开Excel都会显示窗口,占用大量系统资源。可以通过xlwings启动不可见的Excel实例,实现后台运行,大幅降低资源消耗:
修改后的代码:
import xlwings as xw import os def change_sensitivity_label(folder_path): # 启动不可见的Excel应用实例,复用该实例处理所有文件 with xw.App(visible=False, add_book=False) as app: for filename in os.listdir(folder_path): if filename.endswith('.xlsx'): file_path = os.path.join(folder_path, filename) try: wb = app.books.open(file_path) labelinfo = wb.api.SensitivityLabel.CreateLabelInfo() labelinfo.AssignmentMethod = 2 labelinfo.Justification = 'init' labelinfo.LabelId = 'd5688d38-24b0-47bd-b6ed-0cb1b7409201' wb.api.SensitivityLabel.SetLabel(labelinfo, labelinfo) wb.save() wb.close() print(f"已为 {filename} 添加敏感度标签") except Exception as e: print(f"{filename} 处理失败: {e}") folder_path = r"C:\Users\NaHa\Downloads\April-VendorSplittingApp-test1" change_sensitivity_label(folder_path)
关键优化点:
- 用
xw.App(visible=False, add_book=False)创建单个不可见Excel实例,避免反复启动/关闭Excel进程 - 使用
with上下文管理器,确保Excel实例自动关闭,不会残留后台进程
二、终极优化:直接操作OXML(无需启动Excel)
如果要彻底避免启动Excel进程,最快的方式是直接修改Excel文件的OXML结构(xlsx本质是压缩包,包含XML格式的元数据)。敏感度标签信息存储在文件的元数据节点中,我们可以通过解压、修改XML、重新打包的方式完成操作:
依赖安装
先安装所需库:
pip install lxml
实现代码
import os import zipfile from lxml import etree def add_sensitivity_label(file_path, label_id): # 临时文件名,避免覆盖原文件 temp_file = file_path + ".tmp" with zipfile.ZipFile(file_path, 'r') as zip_in: with zipfile.ZipFile(temp_file, 'w') as zip_out: # 复制所有文件到临时包 for item in zip_in.infolist(): data = zip_in.read(item.filename) # 修改核心元数据文件 if item.filename == 'docProps/core.xml': root = etree.fromstring(data) # 定义命名空间 ns = { 'cp': 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties', 'mso': 'http://schemas.microsoft.com/office/2006/metadata' } # 添加敏感度标签节点 sensitivity_label = etree.SubElement(root, '{http://schemas.microsoft.com/office/2006/metadata}SensitivityLabel') sensitivity_label.set('Id', label_id) sensitivity_label.set('AssignmentMethod', '2') sensitivity_label.set('Justification', 'init') # 转换回字节格式 data = etree.tostring(root, encoding='UTF-8', xml_declaration=True) zip_out.writestr(item, data) # 替换原文件 os.remove(file_path) os.rename(temp_file, file_path) def batch_add_labels(folder_path, label_id): for filename in os.listdir(folder_path): if filename.endswith('.xlsx'): file_path = os.path.join(folder_path, filename) try: add_sensitivity_label(file_path, label_id) print(f"已为 {filename} 添加敏感度标签") except Exception as e: print(f"{filename} 处理失败: {e}") # 配置参数 folder_path = r"C:\Users\NaHa\Downloads\April-VendorSplittingApp-test1" label_id = 'd5688d38-24b0-47bd-b6ed-0cb1b7409201' batch_add_labels(folder_path, label_id)
这种方式的优势:
- 完全不依赖Excel进程,资源占用极低
- 处理速度是启动Excel方式的5-10倍,适合批量处理大量文件
- 避免了Excel版本兼容性、文件锁定等问题
注意事项
- 操作前请备份文件,避免意外损坏
- 若文件有密码保护或为xls格式,OXML方式不适用,建议使用第一种后台运行方案
- 部分企业环境中,敏感度标签可能需要特定权限,确保运行代码的账号有足够权限
内容的提问来源于stack exchange,提问作者HP's PPTs
相关产品推荐
相关产品推荐

