使用 OpenXML 在 Excel 文件中写入隐藏信息(如软件名称和版本)

Write hidden information (like software name & version) in Excel file using OpenXML

我的 C# 软件使用 OpenXML 导出到 Excel 文件。即使用户在 Excel 中编辑了这些文件,我仍在软件中阅读和编辑这些文件。我想在某个地方添加软件名称和版本,所以,当软件打开文件时,识别它。工作簿中是否有任何 属性 作为文档信息、评论或仅对 OpenXML 可见而不是 Excel?

目前最好的解决方法是将此信息保存在 excel sheet 中并隐藏 sheet。关键是这些信息不应该被用户意外删除。

我会使用自定义 XML 部件。

自定义 XML 部分的内容只能通过对象模型或解压缩文件 "package" 访问。因此,信息不会被意外更改,甚至无需额外努力即可查看。如果您通过打开 XML 处理文件,访问自定义 XML 部分相当简单。

(用户可以通过 File/Info 选项卡中的 UI 查看文档属性(在评论中建议)。)

通过 Openxml 为 excel 文档设置自定义 属性

page 的底部找到方法 SetCustomProperty()。此函数是为 Word 文档编写的,因此将打开文件行更改为下面一行 Excel 文档

using (var document = SpreadsheetDocument.Open(fileName, true))

您可以将任何 属性 添加到您的文件中。

如何隐藏属性

属性将在 Excel 中可见,方法是文件-> 信息 -> 属性 -> 高级属性 window。用户将能够在那里删除它们。如果不需要,则 属性 将不会在 excel 中可见,而不是此唯一 ID

newProp.FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}";

另一个被使用:

newProp.FormatId = Guid.NewGuid().ToString("B");

注意:保存字符串使用VTLPWSTR类型。不要将类型 VTBString 与上面给出的唯一 ID 一起使用,因为 Excel 会在您在那里编辑它时自动删除您的 属性(仅凭经验,我不知道为什么!)。

如何读取属性?

您保存了文件。然后,再次打开它并遍历所有属性

foreach (CustomDocumentProperty property in document.CustomFilePropertiesPart.Properties)
{
    if (property.Name.Value == nameof(Product) &&
        property.VTBString.Text == Product)
        return true;
} 

其中Product为字符串属性保存软件名称,VTBString用于保存Product的值。使用此方法可以保存和读取任意数量的属性。