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

时间:2019-10-07 10:51:04

标签: c# excel openxml openxml-sdk

我的c#软件使用OpenXML导出到Excel文件。即使用户在Excel中编辑了这些文件,我仍在软件中读取和编辑这些文件。我想在某处添加软件名称和版本,因此,当软件打开文件时,请识别它。工作簿中是否有任何属性作为文档信息,注释或仅对OpenXML不对Excel可见?

目前,最好的解决方法是将此信息保存在Excel工作表中并隐藏工作表。关键是该信息不应被用户意外删除。

2 个答案:

答案 0 :(得分:1)

我将使用自定义XML部件。

只能通过对象模型或通过解压缩文件“包”来访问定制XML部件的内容。因此,信息不会被意外更改,甚至无需费力即可查看。而且,如果您要通过Open XML处理文件,则访问自定义XML部件相当简单。

(用户可以通过用户界面在“文件/信息”标签中查看文档属性(在注释中建议)。

答案 1 :(得分:0)

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

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

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

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

如何隐藏属性

这些属性将在Excel中通过“文件”->“信息”->“属性”->“高级属性”窗口可见。用户将能够在那里删除它们。如果不希望这样做,则使用该属性代替唯一ID不会在excel中可见

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的值。使用此方法可以保存和读取所需的任意多个属性。