0

私はc#でExcelアドインを作成しています。アドインでは、ユーザーが「クエリ」オブジェクトを作成し、クエリが実行され、データがExcelで表示されます。'query'オブジェクトを保存し、ワークシートを指定してそれをフェッチして、編集してクエリを再実行できるようにしたい。

私は次の可能性を見つけました:

public static void SetDocumentProperty(string propertyName, String str)
        {
            DeleteDocumentProperty(propertyName);
            var workbook = Globals.ThisAddIn.GetActiveWorkBook();
            workbook.CustomDocumentProperties.Add(propertyName, false, Microsoft.Office.Core.MsoDocProperties.msoPropertyTypeString, str);
        }

これにより、クエリが文字列として保存されます(オブジェクトをシリアル化した後)。クエリをワークシートに接続する方法がまだ必要です。シート名を使用してみました。これに関する問題は、シート名が変更される可能性があることです。だから私の質問は:

  1. ワークシートの一意の識別子を取得する方法はありますか?
  2. 私がやろうとしていることを達成するためのより良い方法はありますか?

ありがとう

4

1 に答える 1

2

私はこれを使用することになりました:

public static void SetWorkSheetQuery(Microsoft.Office.Interop.Excel.Worksheet ws, EntityQuery q)
 {
                    var cp = GetCustomProperty(ws,"query");
                    if (cp == null)
                        ws.CustomProperties.Add("query", q.ToJson());
                    else cp.Value = q.ToJson();
 }

これにより、オブジェクトがシリアル化された後、ワークシートのカスタムプロパティにアタッチされます。後で(プロパティの名前は"query")を使用してフェッチできます。

private static CustomProperty GetCustomProperty(Worksheet ws, String name)
        {
            for (int i = 1; i <= ws.CustomProperties.Count; i++)
            {
                if (ws.CustomProperties.get_Item(i).Name == name)
                    return ws.CustomProperties.get_Item(i);
            }

            return null;
        }

以下を使用して削除できます。

var cp = GetCustomProperty(ws, "query");
            if (cp != null)
                cp.Delete();
于 2011-04-04T06:16:09.137 に答える