Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
WebアプリケーションからのExcel操作について
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30483#CommentId83929
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
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 に変換して
ブラウザー側の機能で印刷してもらうということはできますが…本筋からは外れてしまいますね。