投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/4/12 18:37:39
IIS から Excel を呼び出すことは、基本的に『悪手』です。
https://support.microsoft.com/ja-jp/help/257757/considerations-for-server-side-automation-of-office


ご存じのように ReleaseComObject を忘れることによる解放漏れの危険もありますし、
For Each での列挙が制限されがちである、という問題もあります。
As Object からのレイトバインドだと、型判定の段階で、内部的に参照カウントが
予期せず増加してしまい、一部の解放処理を FinalReleaseComObject へと
差し替えねばならないケースもあります。
https://support.microsoft.com/ja-jp/help/317109/office-application-does-not-exit-after-automation-from-visual-studio-n
https://divakk.co.jp/aoyagi/csharp_tips_vssenum.html


…これらの点は、提示頂いたコードの範囲内ではクリアできているようですが、
るきおさんが書かれていたように、ライセンスの問題や、
シングルスレッド アパートメント固有の問題もありますので、
Web アプリから Excel を呼び出すことがあまり良い手段ではないことは確かです。


> スタック トレース: 
御提示の内容だと、BtnPrint_Click の 17 行目にある CreateObject が失敗しているようですが
先に提示していただいた「最小限のコード」だと、17行目ではないですね…?


まず、Excel は、対話型セッション(いわゆるデスクトップ)を必要とします。
一方 Web サイトは、無人実行が前提の、非対話型のサービスとして動作します。

通常、サービス 起動されたアカウントには、Excel を起動する権限が与えられていません。
実行できるようにするには、権限設定を操作する必要があります。
https://itblogdsi.blog.fc2.com/blog-entry-418.html


また、サーバーサイドの印刷だとしたら、アプリケーションプールのアカウントに対して
プリンターへのアクセス権が付与されている必要があります。
また、プリンター設定にはユーザー単位の設定も含まれるため、
偽装した実行アカウントに対してプリンターの設定が行われている必要もありそうです。
https://support.microsoft.com/ja-jp/help/2673341
https://social.technet.microsoft.com/Forums/azure/ja-JP/b40728e3-e951-40cf-bb19-4ba5f86ad0ea/aspnet?forum=iis7ja


ただ、現在のエラーは CreateObject の時点でおきているようなので、印刷以前の話のようです。
アプリケーションプールなどの権限周りに着目して調査してみてはいかがでしょう?



> 印刷後終了するという流れなのですが

「ブラウザーを呼び出したクライアント側」で印刷する想定でしょうか?
それとも「Web サイトを運営しているサーバー側」で印刷する想定でしょうか?
サーバーで印刷するなら、どのユーザに定義したプリンターを使用するのかも考慮が必要です。

localhost 上で実行する前提の場合は、クライアント側なのかサーバー側なのかが
区別されにくいところですが、動作的には全然別物となりますのでご注意ください。


> シートの印刷はできないのでしょうか・・・

クライアント側での印刷処理なら、 無料の ReoGrid を用いる選択肢もあります。
https://reogrid.net/jp/document/print/
https://reogrid.net/jp/document/

しかし ReoGrid だと、サーバー側での印刷はできません。
ファイルの読み書きはサーバー側でもできるので、Excel ファイルを HTML に変換して
ブラウザー側の機能で印刷してもらうということはできますが…本筋からは外れてしまいますね。