1

Excel セッション間でユーザーの選択を保持する必要がある Excel リボン アドインを作成しました。これには、カスタム XML パーツを使用するのが最適なオプションのようです。ただし、COMExceptions を取得せずにこれを機能させることはできません。

MSDN ドキュメントはあまり役に立ちません (http://msdn.microsoft.com/en-us/library/bb608612.aspx)。Excel リボン アドインでこれを機能させる例を誰か教えてもらえますか?

4

4 に答える 4

4

私が知っている3つの異なる方法があります:

カスタム XML パーツ アプリケーション レベルのアドインの場合、ユーザーに表示されることなく、保存された xls ファイルに永続化する必要があるアプリケーション データを保存する方法として、これが私の推奨方法です。

http://msdn.microsoft.com/en-us/library/bb608612.aspx

キャッシュ データ アイランド これは、ドキュメント レベルのアドインでのみ機能します。アプリケーション レベルのアドインで使用しようとすると、例外が発生します。

http://blogs.msdn.com/b/eric_carter/archive/2004/04/23/119294.aspx

非表示のワークシート VSTO を使用すると、ユーザーには見えない非表示のワークシートを作成できます。これはうまく機能しますが、データを Excel シートに収まるように変換するには、多くの扱いにくいコーディングが必要になります。

更新 (2014): 最終的に、カスタム XML パーツの使用がパフォーマンスの問題であることが判明したため、非表示のワークシートを使用するようにアプリケーションを元に戻す必要がありました。どうやら、XML が特定のサイズに達すると、Excel は非常に遅くなります。私のアドインではカスタム パーツが数千のノードに到達し、XML が大きくなるほど、Excelのすべてが遅くなりました。たとえば、任意のセルをクリックするだけで、非常に顕著な遅延が発生します。

于 2012-11-26T19:26:17.277 に答える
2

特定のドキュメントでアプリケーション レベルのアドインから任意の種類のメタデータを保存する場合は、データをある種の文字列 (base64、xml など) にシリアル化し、それを「非常に非表示の」シートに保存できます。可視性が「非常に非表示」に設定されたワークシートには、プログラミング API を介してのみアクセスできます。そのため、ユーザーが非表示のシートを見つけたとしても、アクセスすることはできず、実際にそこにあることさえ知りません。

        // create sheet for this save
        workbook.Sheets.Add();
        newSettingsWorksheet = workbook.ActiveSheet;
        newSettingsWorksheet.Name = hiddenSheetName;
        newSettingsWorksheet.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden;

注意すべき重要な点の 1 つは、32767 文字 (セルに収まる最大文字数) を超える文字列を保存する場合は、それをチャンクに分割し、複数のセルに分散させる必要があることです。

発生している COM 例外に関しては、COM オブジェクト (例: ワークシート、セル、または Excel に属するもの) に触れるすべての要求に対して、Excel が別のオブジェクトでビジー状態の場合、いつでも COM 例外をスローできることに注意してください。要求 (例: ユーザーが入力中、数式を再計算中)。予想される例外は次のとおりです。

HRESULT: 0x800AC472 (無視)

HRESULT: 0x8000101A (後で再試行)

Excel アプリの開発者がこれを行っているのは、アドインが Excel 自体の見栄えを悪くしたり応答しなくなったりしないようにするためだと思います。

于 2012-11-28T12:33:16.437 に答える
1

レジストリを使用して、アプリケーションのシャットダウン後も保持する必要がある、または複数のインスタンス間で共有する必要がある、ユーザー設定や履歴などの情報を保存する必要があります。

ユーザーのハイブ (HKEY_CURRENT_USER) にアクセス許可の問題が発生することはありません。.NET レジストリ クラスを参照してください: http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.aspx

于 2012-11-26T19:13:28.167 に答える