2016-03-25 15 views
1

私は現在、複数のExcelファイルのカスタム属性を設定するためにC#を使用しています。私は、MicrosoftからDSOFileとして知られているインポートされたライブラリを使用して、CustomPropertiesプロパティに書き込みます。私が取り組んでいる問題の1つは、コードが、CompanyやYearなどのカスタムプロパティが既に書き込まれているExcelファイルに書き込もうとするたびに、ファイルのカスタムプロパティが既に存在していることを示すCOMException例外がスローされます。その名前のフィールド。正確なメッセージ: "その名前のアイテムは既にコレクションに存在しています"。コレクションにそのアイテムを削除してファイルに書き直すことができるようにしたいと思います。たとえば、誤ってファイルのyear属性に間違った年を追加した場合、そのフィールドをクリアして新しい値を書き込むことができます。私は、メタデータを削除するメソッドをDSOFileクラスで見つけることができませんでした。とにかく "プログラムで"ファイルのメタデータをクリアするには、ファイルのプロパティウィンドウからメタデータを削除する必要はありませんか?C#を使用してExcelファイルからメタデータを削除しますか?

サンプルコード:

DSOFILE.OleDocumentProperties dso = new DSOFile.OleDocumentProperties(); 
dso.Open(@"c\temp\test.xls", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault); 

//add metadata 
dso.CustomProperties.Add("Company", "Sony"); 
dso.Save(); 
dso.Close(false); 
+0

は、既存のCustomPropertyの値を変更することが可能ですか? – StingyJack

+0

この行を変更する 'dso.Open(" c \ temp \ test.xls "、false、DSOFile.dsoFileOpenOptions.dsoOptionDefault);'次へ 'dso.Open(@" c \ temp \ test.xls "、false 、DSOFile.dsoFileOpenOptions.dsoOptionDefault); ' – MethodMan

+0

@StingyJackはい、それは私の質問です。 – Dwayne

答えて

0

あなたが会社や著者のようなオフィスで使用されるデフォルトのプロパティを変更したい場合は、あなただけのSummaryPropertiesオブジェクトを介してそれらを更新することができます

OleDocumentProperties dso = new DSOFile.OleDocumentProperties(); 
    dso.Open(@"c:\temp\test.xls", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault); 

    //Update Company 
    dso.SummaryProperties.Company = "Hello World!"; 

    dso.Save(); 
    dso.Close(false); 

。なお、 dboのCustomPropertiesオブジェクトを介してSummaryPropertiesオブジェクト経由でアクセスできるドキュメントの既定のプロパティを変更することはできません。 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:\temp\test.xls", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault); 

    UpdateProperty(dso.CustomProperties, "Year", "2017"); 

    dso.Save(); 
    dso.Close(false); 
} 
+0

あなたは奇妙な人生と救命救助者。それは働いた!ありがとう! – Dwayne

関連する問題