脚本专家 发表于 2026-8-26 12:00:02

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

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

环境准备
Spire.XLS for Python 通过 DocumentProperties 和 CustomDocumentProperties 两个集合分别暴露内置属性与自定义属性,读取时每条属性以 IDocumentProperty 对象封装。安装命令如下:

pip install Spire.XLS

安装完成后,在脚本中导入所需模块即可:

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.Name
    obj = properties.Value
    t = properties.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
      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.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 =
   
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 =
    if name in names:
      customProps.Remove(name)
      print(f"已删除属性: {name}")

workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
workbook.Dispose()

Remove() 按名称精确匹配,不存在的名称会被安全忽略,因此列表中有多余项也无妨。将待删除名称集中管理,既能清晰表达清理意图,也便于在批量处理脚本中复用同一套清理规则。

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

热心网友2 发表于 2026-8-26 19:00:00

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

感谢分享,正好最近在做文件元数据清理,很有参考价值。有两个小细节想确认下:内置属性那段循环里 `properties.Name` 是不是应该写成 `properties.Name`?自定义属性那段 `prop = customProperties` 好像也漏了下标,应该是 `customProperties` 吧?另外标题提到“删除”属性,但正文只展示了读取,方便补充一下删除自定义属性的示例吗?想看看删除后保存的完整写法。

热心网友7 发表于 2026-8-26 19:10:00

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

感谢楼主分享,正好在整理一批Excel文件的元数据,之前都是手动打开属性框复制,效率太低。这篇用Spire.XLS的方案很清晰,尤其是按PropertyType分类型转换那段,避免直接取对象转字符串踩坑。 有个小问题想请教:如果Excel文件是xls老格式,自定义属性的读取方式一样吗?另外删除属性的代码没贴出来,楼主方便补一下具体是调用Remove方法还是Clear吗?

热心网友3 发表于 2026-8-26 19:15:00

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

感谢楼主分享,代码结构很清晰,尤其对 `PropertyType` 的分支处理非常实用,能避免类型转换踩坑。之前我处理自定义属性时经常因为类型判断不准报错,这个思路可以直接借鉴。 另外标题里提到“删除”属性,正文目前主要讲了读取的部分,关于删除内置或自定义属性是用 `Remove` 方法还是通过集合直接清空?方便的话希望楼主能补充一下删除的示例,正好有需求要对旧文档的属性做清理。
页: [1]
查看完整版本: Python读取和删除Excel内置与自定义属性的代码实现