使用C#从Excel文件中删除元数据



我目前正在使用C#设置多个excel文件的自定义属性。我正在使用一个从Microsoft导入的名为DSOFile的库来写入CustomProperties属性。我遇到的一个问题是,每当代码试图写入一个已经写入了自定义属性(如公司和年份)的excel文件时,就会抛出一个COMException异常,表明该文件的自定义属性已经有一个同名字段。确切消息:"集合中已存在同名项"。我希望能够删除集合中的该项,以便可以重写到该文件。例如,如果我不小心在文件的year属性中添加了错误的年份,我希望能够清除该字段并向其写入新值。我在DSOFile类中找不到删除元数据的方法。是否可以在不通过文件属性窗口的情况下"以编程方式"从文件中清除元数据?

样本代码:

DSOFILE.OleDocumentProperties dso = new DSOFile.OleDocumentProperties();
dso.Open(@"ctemptest.xls", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
//add metadata
dso.CustomProperties.Add("Company", "Sony");
dso.Save();
dso.Close(false);

如果您想更改Office使用的默认属性,如Company或Author,您可以通过SummaryProperties对象更新它们:

    OleDocumentProperties dso = new DSOFile.OleDocumentProperties();
    dso.Open(@"c:temptest.xls", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
    //Update Company 
    dso.SummaryProperties.Company = "Hello World!";
    dso.Save();
    dso.Close(false);

请注意,您不能更改可以通过dso中的SummaryProperties对象和CustomProperties对象访问的文档的默认属性。CustomProperties用于用户使用的其他属性,而不是Microsoft Office已经引入的属性。


为了更改自定义属性,您必须知道CustomProperties是一个可以通过foreach迭代的集合。因此,您可以使用以下两种方法:

private static void DeleteProperty(CustomProperties properties, string propertyName)
{
    foreach(CustomProperty property in properties)
    {
        if (string.Equals(property.Name, propertyName, StringComparison.InvariantCultureIgnoreCase))
        {
            property.Remove();
            break;
        }
    }
}
private static void UpdateProperty(CustomProperties properties, string propertyName, string newValue)
{
    bool propertyFound = false;
    foreach (CustomProperty property in properties)
    {
        if (string.Equals(property.Name, propertyName, StringComparison.InvariantCultureIgnoreCase))
        {
            // Property found, change it
            property.set_Value(newValue);
            propertyFound = true;
            break;
        }
    }
    if(!propertyFound)
    {
        // The property with the given name was not found, so we have to add it 
        properties.Add(propertyName, newValue);
    }
}

以下是关于如何使用UpdateProperty:的示例

static void Main(string[] args)
{
    OleDocumentProperties dso = new DSOFile.OleDocumentProperties();
    dso.Open(@"c:temptest.xls", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
    UpdateProperty(dso.CustomProperties, "Year", "2017");
    dso.Save();
    dso.Close(false);
}

相关内容

  • 没有找到相关文章

最新更新