在文档审计、数据资产盘点或文件清理场景中,Excel工作簿里已有的元数据往往比写入时更值得关注。无论是核对作者、创建时间等内置信息,还是提取业务系统写入的部门、版本号等自定义属性,程序化读取都能省去反复打开“文件属性”对话框的麻烦。而当某些自定义属性过期或不再需要时,及时删除能保持元数据整洁,避免冗余信息干扰后续检索。本文以 Spire.XLS for Python 为例,说明如何读取 Excel 的内置属性与自定义属性,并按需删除这些属性。
环境准备
Spire.XLS for Python 通过 DocumentProperties 和 CustomDocumentProperties 两个集合分别暴露内置属性与自定义属性,读取时每条属性以 IDocumentProperty 对象封装。安装命令如下:安装完成后,在脚本中导入所需模块即可:- from spire.xls import *
- from spire.xls.common import *
复制代码
读取内置文档属性
Excel 的内置属性(标题、作者、主题、创建时间、关键字等)由应用程序预定义,记录了文件的基础元信息。通过 workbook.DocumentProperties 可以获取可迭代的内置属性集合。由于属性值以通用对象形式存储,读取时需要结合 PropertyType 判断真实类型,再转换为对应的 Python 类型。- from spire.xls import *
- from spire.xls.common import *
- inputFile = "/设置属性.xlsx"
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- properties = workbook.DocumentProperties
- print("Excel Properties:")
- for i, unusedItem in enumerate(properties):
- name = properties[i].Name
- obj = properties[i].Value
- t = properties[i].PropertyType
- if t == PropertyType.Double:
- value = Double(obj).Value
- elif t == PropertyType.DateTime:
- value = DateTime(obj).ToLongDateString()
- elif t == PropertyType.Bool:
- value = Boolean(obj).Value
- elif t == PropertyType.Int or t == PropertyType.Int32:
- value = Int32(obj).Value
- else:
- value = String(obj).Value
- print(name + ": " + str(value))
- workbook.Dispose()
复制代码 PropertyType 是正确解析属性值的关键:Double 用 Double(obj).Value 还原为浮点数;DateTime 用 DateTime(obj).ToLongDateString() 格式化为长日期字符串;Bool 用 Boolean(obj).Value 转布尔;Int/Int32 用 Int32(obj).Value 转整型;其余默认按字符串处理。借助 enumerate(properties) 可以在一次循环中完整导出全部内置元数据。
按名称或索引读取自定义属性
业务系统常会在 Excel 中写入自定义属性(如编辑者、电话号码、修订版本)。CustomDocumentProperties 集合支持按属性名称精确获取单个属性,也可以通过索引遍历整个集合。每个属性对象包含 Name、PropertyType 和 Value 成员。已知属性名时直接按名称提取最直观;需要导出全部自定义元数据时,按索引遍历配合类型转换更通用。- from spire.xls import *
- from spire.xls.common import *
- inputFile = "/Excel自定义属性.xlsx"
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- customProperties = workbook.CustomDocumentProperties
- print("=== 自定义文档属性 ===")
- for i in range(customProperties.Count):
- try:
- prop = customProperties[i]
- if prop is None:
- continue
- name = prop.Name
- p_type = prop.PropertyType
- obj = prop.Value
- if obj is None:
- continue
- if p_type == PropertyType.Bool:
- val = Boolean(obj).Value
- elif p_type == PropertyType.String:
- val = String(obj).Value
- elif p_type in (PropertyType.Int, PropertyType.Int32):
- val = Int32(obj).Value
- elif p_type == PropertyType.Double:
- val = Double(obj).Value
- elif p_type == PropertyType.DateTime:
- val = DateTime(obj).ToShortDateString()
- else:
- val = str(obj)
- print(f"{name}: {val}")
- except Exception:
- # 拦截底层可能抛出的空指针异常,保证后续属性继续读取
- continue
- workbook.Dispose()
复制代码 自定义属性支持字符串、布尔、整型、浮点、日期等多种类型,Value 返回的是通用包装对象。通过 prop.PropertyType 判断真实类型后,再调用对应的转换类提取 .Value 属性。将提取过程放在 try...except 中,可以过滤底层可能的空指针占位,确保批量读取时的稳定性。
清除内置与自定义文档属性
当元数据包含过时信息、敏感数据或不再需要保留时,应及时清除。内置属性是 Excel 固有结构的一部分,不能直接从集合中删除,只能将属性值设为空字符串来清空内容;自定义属性是用户动态添加的键值对,可以通过 CustomDocumentProperties 集合的 Remove() 方法按名称精确移除。- from spire.xls import *
- from spire.xls.common import *
- inputFile = "/Excel自定义属性.xlsx"
- outputFile = "/RemoveProperties.xlsx"
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- standardProperties = workbook.DocumentProperties
- standardProperties.Title = ""
- standardProperties.Subject = ""
- standardProperties.Category = ""
- standardProperties.Keywords = ""
- standardProperties.Comments = ""
- customProperties = workbook.CustomDocumentProperties
- for i in range(len(customProperties) - 1, -1, -1):
- customProperties.Remove(customProperties[i].Name)
- workbook.SaveToFile(outputFile, ExcelVersion.Version2016)
- workbook.Dispose()
复制代码 处理内置属性时,直接将 Title、Subject 等字段赋值为空字符串即可清空文本。清理自定义属性时采用倒序循环,从最后一个索引递减到 0,能避免正序删除导致集合索引偏移的问题。两者结合,可将工作簿元数据恢复为较干净的初始状态。
实用技巧:读取后按条件删除
实际清理流程中,往往需要先读取属性值、判断是否符合删除条件,再决定是否移除。例如,当自定义属性 Status 的值为 Expired 时将其删除。- from spire.xls import *
- from spire.xls.common import *
- inputFile = "./Demos/Data/templateAz.xlsx"
- outputFile = "RemoveIfExpired.xlsx"
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- customProps = workbook.CustomDocumentProperties
- names = [p.Name for p in customProps]
-
- if "Status" in names:
- prop = customProps["Status"]
- status = String(prop.Value).Value
- if status == "Expired":
- customProps.Remove("Status")
- print("已删除过期的 Status 属性。")
- workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
- workbook.Dispose()
复制代码 先通过列表推导收集所有自定义属性名称,判断目标属性是否存在,再读取其值并与 Expired 比较,符合条件时调用 Remove()。这样能在不破坏其他属性的前提下,精准清理特定状态的元数据。
批量删除多个指定的属性
如果需要一次性清除多条已知自定义属性,可以预先准备待删除属性名列表,再逐一调用 Remove()。注意在遍历前应先将名称收集为独立列表,避免在对集合删除时同时迭代该集合。- from spire.xls import *
- from spire.xls.common import *
- inputFile = "./Demos/Data/templateAz.xlsx"
- outputFile = "RemoveMultiple.xlsx"
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- customProps = workbook.CustomDocumentProperties
- to_remove = ["Editor", "Phone number", "Revision number"]
- for name in to_remove:
- names = [p.Name for p in customProps]
- if name in names:
- customProps.Remove(name)
- print(f"已删除属性: {name}")
- workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
- workbook.Dispose()
复制代码 Remove() 按名称精确匹配,不存在的名称会被安全忽略,因此列表中有多余项也无妨。将待删除名称集中管理,既能清晰表达清理意图,也便于在批量处理脚本中复用同一套清理规则。
总结
本文介绍了使用 Python 检视与清理 Excel 元数据的方法:通过 DocumentProperties 获取内置属性,结合 PropertyType 将底层通用对象还原为字符串、数值或日期;利用 CustomDocumentProperties 支持按索引与名称访问的特性,实现自定义属性的逐项提取。清理时,内置属性通过赋空字符串清空内容,自定义属性则通过倒序遍历配合名称匹配彻底移除。掌握这些方法后,可以在文档审计、敏感信息脱敏、档案清理等场景中灵活管控元数据,提升文件管理的安全性与规范性。 |