trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

【Visual Studio】IAをPIAに変更してC#からExcelを操作できるようにする。Visual Studio 2008のプロジェクトをVisual Studio 2019へ

IAでExcelを操作しているVisual Studio 2008のプロジェクトをVisual Studio 2019に持ってくる。コンパイルはできるけど、Excelを操作するところで実行時エラーとなる。

ファイルまたはアセンブリ 'Interop.Office, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。":"Interop.Office, Version=2.1.0.0, Culture=neutral, PublicKeyToken=null"} System.IO.FileNotFoundException

f:id:trapemiya:20200217230016j:plain

Interop.Officeが読み込めないエラー

 IAの実態であるInterop.Excel.dllがGACに無いからだろう。
で、GACに以下のコマンドでインストールしようとするが、

gacutil -i c:\work\Interop.Excel.dll

Interop.Excel.dllが厳密名を持っていないため、「厳密な名前のないアセンブリをインストールしようとしました」とメッセージが出てインストールできない。
これはソースファイルでも無ければどうしようもないので、あっさり諦める。

 

で、PIAへ移行する。
まず、参照の追加で、Microsoft Excel 16.0 Object Libraryを追加する。

f:id:trapemiya:20200217230251j:plain

Microsoft Excel 16.0 Object Libraryの追加

追加されると、Microsoft.Office.Interop.Excelが参照設定に増える。
ちなみにInterop.ExcelはIAのもので、もう使わないので削除して良い。

f:id:trapemiya:20200217230534j:plain

Microsoft.Office.Interop.Excelが追加された

 

これがPIAで、名前空間Microsoft.Office.Interop.Excelなので、IAの名前空間であるExcelMicrosoft.Office.Interop.Excelに変更する。例えば、

Excel.Application m_objExcel =  null;

Microsoft.Office.Interop.Excel.Application m_objExcel =  null;

に変更する。

これでコンパイルしてみるが、以下でエラーとなる。

m_objSheet = (Microsoft.Office.Interop.Excel._Worksheet)(m_objSheets.get_Item(1));

エラーメッセージは、

エラー CS0656 コンパイラが必要とするメンバー 'Microsoft.CSharp.RuntimeBinder.Binder.Convert' がありません

 この解決方法は、ググってすぐに解決した。

'Microsoft.CSharp.RuntimeBinder.Binder.Convert' がありません

https://nonbiri-dotnet.blogspot.com/2017/11/microsoftcsharpruntimebinderbinderconve.html

要は、 Microsoft.CSharpを参照に設定すれば良い。 

ありがとう!

 

これで無事にコンパイルも出来て、Excelファイルを出力することができた。

今ならClosedXMLを使って、簡単にExcelファイルを作ったり弄ったりできるようになったので、PIAでの操作と比べて随分楽になったものです。