查看: 218|回复: 0

Python读取和删除Excel内置与自定义属性的代码实现

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在文档审计、数据资产盘点或文件清理场景中,Excel工作簿里已有的元数据往往比写入时更值得关注。无论是核对作者、创建时间等内置信息,还是提取业务系统写入的部门、版本号等自定义属性,程序化读取都能省去反复打开“文件属性”对话框的麻烦。而当某些自定义属性过期或不再需要时,及时删除能保持元数据整洁,避免冗余信息干扰后续检索。本文以 Spire.XLS for Python 为例,说明如何读取 Excel 的内置属性与自定义属性,并按需删除这些属性。

环境准备
Spire.XLS for Python 通过 DocumentProperties 和 CustomDocumentProperties 两个集合分别暴露内置属性与自定义属性,读取时每条属性以 IDocumentProperty 对象封装。安装命令如下:
  1. pip install Spire.XLS
复制代码
安装完成后,在脚本中导入所需模块即可:
  1. from spire.xls import *
  2. from spire.xls.common import *
复制代码

读取内置文档属性
Excel 的内置属性(标题、作者、主题、创建时间、关键字等)由应用程序预定义,记录了文件的基础元信息。通过 workbook.DocumentProperties 可以获取可迭代的内置属性集合。由于属性值以通用对象形式存储,读取时需要结合 PropertyType 判断真实类型,再转换为对应的 Python 类型。
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. inputFile = "/设置属性.xlsx"
  4. workbook = Workbook()
  5. workbook.LoadFromFile(inputFile)
  6. properties = workbook.DocumentProperties
  7. print("Excel Properties:")
  8. for i, unusedItem in enumerate(properties):
  9.     name = properties[i].Name
  10.     obj = properties[i].Value
  11.     t = properties[i].PropertyType
  12.     if t == PropertyType.Double:
  13.         value = Double(obj).Value
  14.     elif t == PropertyType.DateTime:
  15.         value = DateTime(obj).ToLongDateString()
  16.     elif t == PropertyType.Bool:
  17.         value = Boolean(obj).Value
  18.     elif t == PropertyType.Int or t == PropertyType.Int32:
  19.         value = Int32(obj).Value
  20.     else:
  21.         value = String(obj).Value
  22.     print(name + ": " + str(value))
  23. 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 成员。已知属性名时直接按名称提取最直观;需要导出全部自定义元数据时,按索引遍历配合类型转换更通用。
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. inputFile = "/Excel自定义属性.xlsx"
  4. workbook = Workbook()
  5. workbook.LoadFromFile(inputFile)
  6. customProperties = workbook.CustomDocumentProperties
  7. print("=== 自定义文档属性 ===")
  8. for i in range(customProperties.Count):
  9.     try:
  10.         prop = customProperties[i]
  11.         if prop is None:
  12.             continue
  13.         name = prop.Name
  14.         p_type = prop.PropertyType
  15.         obj = prop.Value
  16.         if obj is None:
  17.             continue
  18.         if p_type == PropertyType.Bool:
  19.             val = Boolean(obj).Value
  20.         elif p_type == PropertyType.String:
  21.             val = String(obj).Value
  22.         elif p_type in (PropertyType.Int, PropertyType.Int32):
  23.             val = Int32(obj).Value
  24.         elif p_type == PropertyType.Double:
  25.             val = Double(obj).Value
  26.         elif p_type == PropertyType.DateTime:
  27.             val = DateTime(obj).ToShortDateString()
  28.         else:
  29.             val = str(obj)
  30.         print(f"{name}: {val}")
  31.     except Exception:
  32.         # 拦截底层可能抛出的空指针异常,保证后续属性继续读取
  33.         continue
  34. workbook.Dispose()
复制代码
自定义属性支持字符串、布尔、整型、浮点、日期等多种类型,Value 返回的是通用包装对象。通过 prop.PropertyType 判断真实类型后,再调用对应的转换类提取 .Value 属性。将提取过程放在 try...except 中,可以过滤底层可能的空指针占位,确保批量读取时的稳定性。

清除内置与自定义文档属性
当元数据包含过时信息、敏感数据或不再需要保留时,应及时清除。内置属性是 Excel 固有结构的一部分,不能直接从集合中删除,只能将属性值设为空字符串来清空内容;自定义属性是用户动态添加的键值对,可以通过 CustomDocumentProperties 集合的 Remove() 方法按名称精确移除。
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. inputFile = "/Excel自定义属性.xlsx"
  4. outputFile = "/RemoveProperties.xlsx"
  5. workbook = Workbook()
  6. workbook.LoadFromFile(inputFile)
  7. standardProperties = workbook.DocumentProperties
  8. standardProperties.Title = ""
  9. standardProperties.Subject = ""
  10. standardProperties.Category = ""
  11. standardProperties.Keywords = ""
  12. standardProperties.Comments = ""
  13. customProperties = workbook.CustomDocumentProperties
  14. for i in range(len(customProperties) - 1, -1, -1):
  15.     customProperties.Remove(customProperties[i].Name)
  16. workbook.SaveToFile(outputFile, ExcelVersion.Version2016)
  17. workbook.Dispose()
复制代码
处理内置属性时,直接将 Title、Subject 等字段赋值为空字符串即可清空文本。清理自定义属性时采用倒序循环,从最后一个索引递减到 0,能避免正序删除导致集合索引偏移的问题。两者结合,可将工作簿元数据恢复为较干净的初始状态。

实用技巧:读取后按条件删除
实际清理流程中,往往需要先读取属性值、判断是否符合删除条件,再决定是否移除。例如,当自定义属性 Status 的值为 Expired 时将其删除。
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. inputFile = "./Demos/Data/templateAz.xlsx"
  4. outputFile = "RemoveIfExpired.xlsx"
  5. workbook = Workbook()
  6. workbook.LoadFromFile(inputFile)
  7. customProps = workbook.CustomDocumentProperties
  8. names = [p.Name for p in customProps]
  9.    
  10. if "Status" in names:
  11.     prop = customProps["Status"]
  12.     status = String(prop.Value).Value
  13.     if status == "Expired":
  14.         customProps.Remove("Status")
  15.         print("已删除过期的 Status 属性。")
  16. workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
  17. workbook.Dispose()
复制代码
先通过列表推导收集所有自定义属性名称,判断目标属性是否存在,再读取其值并与 Expired 比较,符合条件时调用 Remove()。这样能在不破坏其他属性的前提下,精准清理特定状态的元数据。

批量删除多个指定的属性
如果需要一次性清除多条已知自定义属性,可以预先准备待删除属性名列表,再逐一调用 Remove()。注意在遍历前应先将名称收集为独立列表,避免在对集合删除时同时迭代该集合。
  1. from spire.xls import *
  2. from spire.xls.common import *
  3. inputFile = "./Demos/Data/templateAz.xlsx"
  4. outputFile = "RemoveMultiple.xlsx"
  5. workbook = Workbook()
  6. workbook.LoadFromFile(inputFile)
  7. customProps = workbook.CustomDocumentProperties
  8. to_remove = ["Editor", "Phone number", "Revision number"]
  9. for name in to_remove:
  10.     names = [p.Name for p in customProps]
  11.     if name in names:
  12.         customProps.Remove(name)
  13.         print(f"已删除属性: {name}")
  14. workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
  15. workbook.Dispose()
复制代码
Remove() 按名称精确匹配,不存在的名称会被安全忽略,因此列表中有多余项也无妨。将待删除名称集中管理,既能清晰表达清理意图,也便于在批量处理脚本中复用同一套清理规则。

总结
本文介绍了使用 Python 检视与清理 Excel 元数据的方法:通过 DocumentProperties 获取内置属性,结合 PropertyType 将底层通用对象还原为字符串、数值或日期;利用 CustomDocumentProperties 支持按索引与名称访问的特性,实现自定义属性的逐项提取。清理时,内置属性通过赋空字符串清空内容,自定义属性则通过倒序遍历配合名称匹配彻底移除。掌握这些方法后,可以在文档审计、敏感信息脱敏、档案清理等场景中灵活管控元数据,提升文件管理的安全性与规范性。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-26 13:01 , Processed in 0.020871 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部