在文档审计、数据资产盘点以及文件清理等场景中,读取 excel 工作簿中已存在的元数据往往比写入更为常见。无论是核查文件的作者、创建时间等内置属性,还是提取业务自定义的部门、版本号等信息,程序化读取都能避免人工翻看"文件属性"对话框的繁琐。与此同时,当某些自定义属性过期或不再需要时,及时将其删除可以保持元数据的整洁,避免冗余信息干扰后续的检索与归类。本文将介绍如何使用 python 读取 excel 文件的内置属性与自定义属性以及怎样删除 excel 文件的属性,帮助你在文档管理流程中高效地检视与清理工作簿元数据。
环境准备
本文使用 spire.xls for python 库来操作 excel 文件。该库通过 documentproperties 和 customdocumentproperties 两个属性集合分别暴露 excel 的内置属性与自定义属性,读取时以 idocumentproperty 对象封装每条属性。通过以下命令安装:
pip install spire.xls
安装完成后,在脚本中导入所需模块即可开始使用。
读取内置文档属性
excel 的内置属性(如标题、作者、主题、创建时间、关键字等)由应用程序预定义,记录了文件的基础元信息。在 spire.xls 中,这些属性通过 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 文件中写入自定义属性(如编辑者、电话号码、修订版本)。spire.xls 提供了 customdocumentproperties 集合,允许开发者按属性名称精确获取单个属性,或者通过索引遍历整个属性集合。获取到的每个属性均封装为 documentproperty 对象,包含了 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:
# 拦截 spire.xls 底层 c++ 抛出的空指针异常,保证后续属性继续读取
continue
workbook.dispose()

在上述代码中,通过 customproperties[i] 可以按顺序提取集合中的每一个自定义属性。由于自定义属性支持字符串、布尔值、整型、浮点型和日期等多种数据类型,value 返回的是底层的通用包装对象。为了准确还原数据,代码通过 prop.propertytype 判断属性的真实类型,并调用对应的类型转换类(如 boolean、string、int32、double、datetime)提取其 .value 属性。此外,将提取过程置于 try...except 容错块中,可以有效过滤底层可能的空指针占位,确保批量读取所有属性时的稳定性与数据准确性。
清除内置与自定义文档属性
当文件中的元数据包含过时信息、敏感数据,或不再需要保留属性时,应当及时进行清除,避免干扰后续检索或造成信息泄露。对于 excel 文件而言,内置属性与自定义属性的清除机制有所不同:内置属性(如标题、主题等)是 excel 文件固有结构的一部分,无法直接将其属性项从集合中删除,但可以通过将其属性值设置为空字符串来清空内容;而自定义属性则是用户动态添加的键值对,可以通过 customdocumentproperties 集合的 remove() 方法按名称精确移除。
from spire.xls import *
from spire.xls.common import *
inputfile = "/excel自定义属性.xlsx"
outputfile = "/removeproperties.xlsx"
# 创建 workbook 实例
workbook = workbook()
# 加载 excel 文档
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)并结合属性名称进行移除,这种倒序遍历方式能有效避免因正序删除导致集合索引发生偏移的问题。两者结合,即可将 excel 工作簿中的元数据恢复为干净的初始状态。
实用技巧
读取后根据条件删除
在清理元数据的实际流程中,经常需要先读取属性值、判断其是否符合删除条件,再决定是否移除。例如,当某条自定义属性的值为空或标记过期时将其删除。读取属性后,先用对应的类型转换方法取出真实值,再在条件判断中调用 remove() 即可。
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
# 值为 "expired" 时删除该属性
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 获取内置属性,并结合类型枚举将底层的通用对象准确还原为字符串、数值或日期等直观格式;同时利用 customdocumentproperties 集合支持按索引与名称访问的特性,实现自定义属性的逐项提取。在清理环节,鉴于内置属性不可被移除的物理限制,通过将其赋值为空字符串实现内容清空,而自定义属性则通过倒序遍历配合名称匹配完成彻底卸载。掌握这些方法后,开发者可以在文档审计、敏感信息脱敏及档案清理等场景中灵活管控元数据,提升文件管理的安全性与规范性。
到此这篇关于python读取和删除excel文件属性的完整代码的文章就介绍到这了,更多相关python excel文件属性操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论