13

環境:

WindowsXPマシン
Excel2007とExcel2003の両方がインストールされています(時系列ではなく、この順序で)。
C#3.5

問題:

PIAを使用してOfficeオートメーションを実行するときは、次のコード行を使用します。

var excel = new ApplicationClass();

PIAのバージョンでは、具体的にはExcel 12と呼ばれています
。C:\ WINDOWS \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
ただし、次のようになります。

 excel.Version;//this is 11.0 instead of 12.0

したがって、拡張子が.xlsxのファイルを開こうとすると、ファイル変換で機能が失われることを警告し、Excel2003で開きます。インストール順序が2007->2003であることに関係していると確信しています。しかし、2003を自分のマシンにアンインストールすることはできません。Excel2003を使用する無関係のプロジェクトのために、Webサーバーにオフィスオートメーションがあります。

Policy.11.0.Microsoft.Office.Interop.Excel.configのものを見てきましたが、

<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>

だから、私は途方に暮れています。使用するExcelのバージョンをCOM相互運用機能に指示できないのはなぜですか?

4

1 に答える 1

24

どのバージョンの Excel を使用するかをプログラムで指示することはできません。PIA は、開発対象のインターフェイスまたはオブジェクト モデルを指定するだけです。ただし、実際に実行されている Excel のバージョンは、レジストリによって制御されます。

ただし、PIA の実行に関しては、実際には、システムにインストールされている最高レベルの PIA に対して実行されます。したがって、Excel 2003 PIA に対して開発を行っても、クライアントが Excel 2007 PIA を備えた Excel 2007 を使用している場合、コードは Excel 2007 PIA に対して実行されます。Excel 2007 PIA には下位互換性があるため、正常に実行されるはずです。つまり、番号の大きい各 PIA バージョン (および Excel オブジェクト モデル) は、古い PIA および古い Excel オブジェクト モデルに対してコンパイルされたコマンドと下位互換性があります。クライアントがマシン上に Excel 2007 と Excel 2003 の両方の PIA を持っている場合、実行中の Excel のバージョンに関係なく、バージョンの高い PIA が読み込まれることに注意してください。つまり、両方の PIA が利用可能であれば、Excel 2007 の PIA が実行されます。

[編集: 1 つの注意点は、VB.NET または C# 4.0 を使用する場合、Excel 2007 PIA は 100% 下位互換性がある必要があるということです。C# 3.0 以下を使用している場合、C# 3.0 以下から呼び出されたときにオプションのパラメーターが実際に必要であるという事実により、上位バージョンの PIA またはオブジェクト モデルに対して実行すると、一部のコードで中断が発生します。ただし、これは比較的まれであり、C# 4.0 では、この問題は理論上は解消されるはずです。]

さて、開発した PIA は、クライアント マシンで実際に実行される PIA を実際には制御しないため、PIA をあまり制御できません。

どのバージョンの Excel を起動するかについても、あまり制御できません。たとえば、次の方法で新しい Excel インスタンスを作成する場合:

Excel.Application excelApp = new Application();

読み込まれた Excel アプリケーションは、レジストリに設定されている現在のバージョンに従って設定されます。現在のバージョンは次の場所に保存されています。

HKEY_CLASSES_ROOT\Excel.Application\CurVer

あなたの場合の「CurVer」キーのデフォルト値は、「Excel.Application.12」ではなく「Excel.Application.11」になるようです。これを変更するだけでもうまくいくかもしれませんが、すべてのレジストリ設定が正しく修正されていることを確認するために、代わりに修復を行うことをお勧めします。(そして、すべての設定がどうあるべきかをおそらく知ることができませんでした。)わかりました、別のものを見つけました:あなたも変更する必要があります:

[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]

「Excel.Application.12」の値を保持します。ただし、代わりに修復を実行することを強くお勧めします。他にどのような設定を変更する必要があるのか​​ わからないので、手動で変更するのは少し危険です.

さらに、次のキーも見つける必要があります。

HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12

これらは、インストールした Excel のバージョンであるためです。

(詳細については、こちらを参照してください。)

インストール順序が 2007 -> 2003 であることと関係があると確信しています。

はい、これは 100% 正しいです。Excel 2007 で修復を実行してみてください。これが最も簡単な方法です。これが機能しない場合は、両方をアンインストールしてから、両方を再インストールします。Excel 2003 をアンインストールしてから 2007 をアンインストールし (インストールした順序を逆にして)、Excel 2003 をインストールしてから Excel 2007 をインストールし、両方のバージョンを正しい順序でインストールするようにします。

ただし、これを行うと、 を呼び出したときに既定で Excel 2007 が実行されることに注意してくださいExcel.Application excelApp = new Application()

実際に推奨される方法は、開発者のコ​​ンピューターで両方のバージョンの Excel を実行しないことです。詳細については、次を参照してください。

以前は、同じ開発マシンで複数のバージョンの Excel を使用していましたが、個人的には、これらの記事で聞こえるほど欠点は複雑ではないと感じていました。一般に、Excel 2007 PIA は Excel 2003 PIA と下位互換性があり、すべて正常に動作します。しかし、私はかつてあなたのようなレジストリの混乱に陥り、「正しいことをする」ことにしました。両方をアンインストールしてから、Excel 2007 のみを再インストールしました。

そこから無料の Virtual PC をインストールし (実際には VM ウェアの方が少し優れていますが、無料ではありません)、2003、2002、2000、および '97 用の以前のバージョンの Excel を別の VM にインストールしました。セットアップには確かに多少の作業が必要ですが、これを実行すると、すべてが 100% クリーンになります。

とは言っても、VM 上の下位バージョンの Excel に対して実際に開発したいとは思わないでしょう。VM 内でホストされている Visual Studio を使用するのは難しすぎるでしょう。したがって、これらの VM は、システムがさまざまなクライアント構成に対して機能することを確認するためのデプロイのテストにのみ適しています。わかる?

お役に立てれば!

マイク

于 2010-02-11T02:33:22.940 に答える