none
C#でExcelを操作する機能でビルドエラーが発生する RRS feed

  • 質問

  • お世話になっております。
    現在、Web画面からExcelファイルを操作する機能を作成中です。
    質問があります。

      実行環境:Windows10(64bit)
         VS:Microsoft Visual Studio Community 2019 Version 16.8.2
    プロジェクト:ASP.NET Core Web アプリケーション(C#)(Model-View-Controller)
           .NET Core (ASP.NET Core 5.0)

    Excelの操作のためCOM参照で「microsoft excel 15.0 object library」を選択してビルドを行ったのですが
    「The assembly path obj\Debug\net5.0\Interop.Microsoft.Office.Interop.Excel.dll is invalid. Assembly paths must be rooted.」
    というエラーが「Microsoft.NET.Sdk.Razor.CodeGeneration.targets」で発生します。

    対処法がわからないので、このエラーの発生原因と解決方法を教えていただけますでしょうか。

    よろしくお願いいたします。
    2020年12月17日 13:19

すべての返信

  • > Excelの操作のためCOM参照で「microsoft excel 15.0 object library」を選択してビルドを行ったのですが

    自分の環境の Visual Studio Community 2019 v16.8.3 .NET 5.0 で試してみましたが、以下のフォルダにある Microsoft.Office.Interop.Excel.dll を参照に追加した場合は少なくともビルドエラーにはならなかったです。(下のパスのフォルダ名 ADL Tools というのは Azure Data Lake Tools です・・・特にそれを選んだということではなく、自分の環境の C:\Program Files (x86)\Microsoft Visual Studio 下にある唯一の Microsoft.Office.Interop.Excel.dll という理由だけです)

    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\ADL Tools\2.6.3000.0

    ただし、質問者さんの期待する機能、

    > 現在、Web画面からExcelファイルを操作する機能を作成中です。

    が実装できるかどうかは分かりませんが。


    その「操作」というのが具体的にどういうことか不明ですが、もし Excel アプリを立ち上げてそれにファイルを表示しユーザーが操作するというようなことでしたら、それは Web アプリでは無理です。(絶対に 100% 不可能とまでは言いませんが、限りなくそれに近い無理筋です)

    そうではなくて、何らかのユーザー情報に基づいて Excel ファイルをサーバー側で生成し、それをユーザーが自分の PC にダウンロードしても使ってもらうということなら可能です。

    しかし、サーバー側で Office.Interop.Excel 等を使うのは Microsoft は「推奨もサポートも行っていません」ということです。詳しくは以下の記事を見てください。

    Office のサーバーサイド オートメーションについて
    https://support.microsoft.com/ja-jp/help/257757/considerations-for-server-side-automation-of-office

    質問者さんが高いスキルをお持ちで上のドキュメントに書いてあるような問題には対処できるということなら余計なお世話かもしれませんが、Open XML とかサードパーティ製のライブラリを使うことも検討されてはいかがですか?

    「.net core office interop」などをキーワードにググれば参考になる記事が見つかると思います。例えば下記:

    Read and Write Excel file in C# .NET Core using NPOI
    https://www.thecodebuzz.com/read-and-write-excel-file-in-net-core-using-npoi/





    • 編集済み SurferOnWww 2020年12月18日 5:22 訂正
    2020年12月18日 2:33
  • bibanon-nonさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    SurferOnWwwさんから寄せられた投稿はお役に立ちましたか。

    別の提案としては、NuGetを使用することです。
    古い参照を削除し、Microsoft.Office.Interop.Excel.dllをプロジェクト ルートにコピーして、ルートフォルダのファイルを参照することをお薦めします。

    実行環境:Windows10(64bit)
         VS:Microsoft Visual Studio Enterprise 2019 Version 16.8.2
    プロジェクト:ASP.NET Core Web Application(C#)
           .NET Core (ASP.NET Core 5.0)

    ステップ1:NuGet パケージの管理を開きます。
          プロジェクトを右クリックして、「NuGet パケージの管理」を選択します。

    ステップ2:NuGet パケージをインストールします。
          Microsoft.Office.Interop.Excelを捜索してインストールします。


    テストコードは下記のように正常に動作しています。



    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年12月22日 3:53
    モデレータ
  • Microsoft.NET.Sdk.Razor.CodeGeneration.targets(手元の環境ではC:\Program Files\dotnet\sdk\5.0.101\Sdks\Microsoft.NET.Sdk.Razor\build\netstandard2.0\Microsoft.NET.Sdk.Razor.CodeGeneration.targetsにある)に記述されているRazorTagHelperという処理は相対パスを受け付けないのに、COM参照でビルド時生成されるファイルパスが相対パス(obj\Debug\net5.0\Interop.Microsoft.Office.Interop.Excel.dll)となっているためにエラーになってます。

    ですから、COM参照の出力先を絶対パス指定にしてやればいいということになります。
    つまり、プロジェクトファイル(*.csproj)に以下のようにTargetを追加するとビルドが通ります。

    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
      <Target Name="resolveInteropOutputPath" BeforeTargets="ResolveComReferences"
              Condition="'@(COMReference)'!='' or '@(COMFileReference)'!=''">
        <PropertyGroup Condition=" '$(InteropOutputPath)' == '' ">
          <InteropOutputPath>$(MSBuildProjectDirectory)\$(IntermediateOutputPath)</InteropOutputPath>
        </PropertyGroup>
      </Target>

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年12月22日 3:53