C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: EXCEL操作


(過去ログ 124 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■74066 / inTopicNo.1)  EXCEL操作
  
□投稿者/ 小心者 (1回)-(2014/11/27(Thu) 17:09:02)

分類:[ASP.NET (VB)] 

初めての質問になりますがよろしくお願いいたします。

ASP.NETでサーバー側のEXCELの雛形ファイルをクライアント側がダウンロードし、クライアント側にあるダウンロードしたEXCELファイルの行の高さや行の色を変更したいと思っております。
いろいろと調査しましたところ、下記のサイトが目立ちました。

Office のサーバーサイド オートメーションについて
http://support.microsoft.com/kb/257757/ja

読解力がなくて理解した内容が違うかもしれませんが上記の内容はサーバー側でサーバーにあるEXCELの操作は保証しませんよってことでしょうか。
上記の場合、今回作成予定のサーバー側からクライアント側でのEXCEL操作は作成するにあたり問題ないのでしょうか。
(現在作成中ですがエラーが出てしまい焦っております…)

大変申し訳ございませんがご教授ください。
引用返信 編集キー/
■74067 / inTopicNo.2)  Re[1]: EXCEL操作
□投稿者/ 優希(ゆき) (14回)-(2014/11/27(Thu) 17:43:12)
No74066 (小心者 さん) に返信
このURLの中の内容は、サーバー側でOfficeを使用してファイルを作成するのは保証しませんって内容。
つか、そもそもクライアントがダウンロードしたファイルをいじろうというのが間違い。
やるのであれば、サーバーで作成する際にいじるべき。

絶対、仕様見なおしたほうがいいと思う。
私が見つけたら、即刻セキュリティーホールとして挙げます。
引用返信 編集キー/
■74068 / inTopicNo.3)  Re[1]: EXCEL操作
□投稿者/ 魔界の仮面弁士 (180回)-(2014/11/27(Thu) 17:58:41)
2014/11/27(Thu) 18:07:29 編集(投稿者)

No74066 (小心者 さん) に返信
> ASP.NETでサーバー側のEXCELの雛形ファイルをクライアント側がダウンロードし、
> クライアント側にあるダウンロードしたEXCELファイルの行の高さや行の色を変更したいと思っております。

ファイルの雛形は、サーバー上の *.xltx ファイル(あるいは *.xlsx ファイル)で、
それをクライアントにインストールされた Microsoft Excel で開くのですか?

操作対象となるのが クライアント上の Microsoft Excel なのであれば、
その処理は、サーバー側の ASP.NET コードではなく、クライアント側のコードで
処理することになりそうですが……現在の設計はそうなってはいないのですね?


> サーバー側でサーバーにあるEXCELの操作は保証しませんよってことでしょうか。
今回、サーバー側にあるのは雛形となる文書ファイルだけであり、
サーバー側に Microsoft Excel をインストールするわけでは無いのですよね?

だとすれば、今回のケースとは状況が異なるように思えますが、一応説明しておくと:


まず ASP.NET は、サービスとして実行されるものです。
サーバー上に、管理者さえもログオンしていない状態でも稼動しますよね。
(サーバーは起動しているが、ログオン前でデスクトップが表示されていない状態など)

一方の Excel は、ユーザー対話を前提とした設計になっています。
たとえばエラーがあれば、メッセージボックス等で報告する仕様です。
(メッセージを抑制するプロパティもありますが、リソース不足時などの
致命的なエラーなどでは、メッセージが表示されてしまうことがありえます)

仮にサーバー側でメッセージボックスが表示されたとしても、
クライアント側で OK ボタンを押すことはできませんよね?
しかもダイアログを閉じるまで、処理は中断されてしまいます。
このような事情から、対話型のアプリケーションはサーバー上での実行には向きません。


> 上記の場合、今回作成予定のサーバー側からクライアント側でのEXCEL操作は作成するにあたり問題ないのでしょうか。
可能か不可能かだけでいえば、
 CreateObject("Excel.Application", excelインストール済み端末)
のような指定を行えば、「DCOM」にてサーバー側からクライアント側の
Excel を操作することも一応は可能ですが、サーバーサイドでの
Office オートメーションは、先の KB257757 に書かれているように
保証される動作ではありませんし、そもそもセキュリティの観点からすると
こうしたリモート実行自体、望ましいものではありません。
設定の手間もありますし。
http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20030717/3/


> (現在作成中ですがエラーが出てしまい焦っております…)

どんなコードを書いて、どんなエラーになっているのかが分からないと、
アドバイスもできないです。(^^;


以下、代案として:

(案1) クライアント側の Microsoft Excel を使うのではなく、
 サーバー上に「Excel ファイルを編集可能なライブラリ」を導入する。

(案2) 雛形の Excel 文書ファイルを、「XML スプレッドシート形式」にしておき、
 サーバー側で、その XML ファイルの内容を動的に囲うし、背景色や行の高さを
 修正した Excel 文書ファイルがダウンロードされるようにする。

(案3) Excel 操作用のクライアント アプリケーション(*.EXE とか *.wsc とか)を
 用意し、それをサーバー側から配布する。ClickOnce という手もある。
 (ClickOnce なら、パラメータを指定して呼び出すことも可能)
引用返信 編集キー/
■74069 / inTopicNo.4)  Re[2]: EXCEL操作
□投稿者/ PANG2 (48回)-(2014/11/27(Thu) 18:31:40)
やりたいことは、雛形ファイルにデータを流し込んで、装飾(高さや行の色の調整)することでしょうか?

Excel-VBAかVSTOかな(データはASP.NET WebService)
引用返信 編集キー/
■74072 / inTopicNo.5)  Re[1]: EXCEL操作
□投稿者/ WebSurfer (403回)-(2014/11/27(Thu) 20:25:36)
No74066 (小心者 さん) に返信

混乱されているのではないかと思いますが・・・

> ASP.NETでサーバー側のEXCELの雛形ファイルをクライアント側がダウンロードし、
> クライアント側にあるダウンロードしたEXCELファイルの行の高さや行の色を変更
> したいと思っております。

その Web サーバーには雛型のエクセルファイルが置いてあり、ASP.NET とクライアントの PC の
ブラウザの仕事はそれをダウンロードするまでで終わりで、あとはクライアントの PC で Excel
を起動してダウンロードしたエクセルファイルを処理するのですよね?

であれば、参考にされている「Office のサーバーサイド オートメーションについて」のことは
質問者さんのケースでは何の関係もないです。

ちなみに、「Office のサーバーサイド オートメーションについて」が関係あるのは、サーバー
上でエクセルファイルの操作を行う(例えば、ASP.NET でサーバー上で雛形にデータを加えたり
書式を設定する)ような場合です。
引用返信 編集キー/
■74075 / inTopicNo.6)  Re[2]: EXCEL操作
□投稿者/ 小心者 (2回)-(2014/11/27(Thu) 22:06:10)
No74072 (WebSurfer さん) に返信
> ■No74066 (小心者 さん) に返信
>
> 混乱されているのではないかと思いますが・・・
>
>>ASP.NETでサーバー側のEXCELの雛形ファイルをクライアント側がダウンロードし、
>>クライアント側にあるダウンロードしたEXCELファイルの行の高さや行の色を変更
>>したいと思っております。
>
> その Web サーバーには雛型のエクセルファイルが置いてあり、ASP.NET とクライアントの PC の
> ブラウザの仕事はそれをダウンロードするまでで終わりで、あとはクライアントの PC で Excel
> を起動してダウンロードしたエクセルファイルを処理するのですよね?
>
> であれば、参考にされている「Office のサーバーサイド オートメーションについて」のことは
> 質問者さんのケースでは何の関係もないです。
>
> ちなみに、「Office のサーバーサイド オートメーションについて」が関係あるのは、サーバー
> 上でエクセルファイルの操作を行う(例えば、ASP.NET でサーバー上で雛形にデータを加えたり
> 書式を設定する)ような場合です。
→回答をしてくださったみなさんありがとうございます。
 やりたい動作がいまいち伝わっていないと認識し、再度詳細な情報を記載したいと思います。
 私の説明が下手で皆さんに多大なご迷惑をおかけして申し訳ございません。

動作(ボタンを押下した時の一連の流れ)
@画面のボタンを押下します。

Aボタン押下時にサーバーにおいてある雛形ファイルをファイルのダウンロード機能を使用し、クライアント側に取得

クライアント側のPCでダウンロードしたEXCELファイルを開いたときに行の高さや色が変更されている予定です。

今のところ、どのように作成していいかわからずとりあえずクライアント側にあるEXCELファイル(パスを指定)の高さを正常に変更できるようなプログラムを作成しております。


今回の説明でさらに不明点が出てきたまたは説明が足りていない場合お申し付けください。

説明下手で申し訳ございません。。。

引用返信 編集キー/
■74076 / inTopicNo.7)  Re[3]: EXCEL操作
□投稿者/ Azulean (374回)-(2014/11/27(Thu) 22:16:50)
2014/11/27(Thu) 22:18:42 編集(投稿者)

No74075 (小心者 さん) に返信
> @画面のボタンを押下します。
> Aボタン押下時にサーバーにおいてある雛形ファイルをファイルのダウンロード機能を使用し、クライアント側に取得
> クライアント側のPCでダウンロードしたEXCELファイルを開いたときに行の高さや色が変更されている予定です。
> 今のところ、どのように作成していいかわからずとりあえずクライアント側にあるEXCELファイル(パスを指定)の高さを正常に変更できるようなプログラムを作成しております。

この「画面のボタン」とは何を指していますか?

(1)事前にユーザーにインストールしてもらう、今の作成中の「高さを変更できるようなプログラム」(クライアント PC で実行される Windows Forms/WPF アプリ)
(2)Web ブラウザ上で表示されている、Web ページの画面


(1)であれば、サーバーのオートメーションの話は無関係ですね。
引用返信 編集キー/
■74078 / inTopicNo.8)  Re[3]: EXCEL操作
□投稿者/ WebSurfer (404回)-(2014/11/27(Thu) 22:21:20)
No74075 (小心者 さん) に返信

> 動作(ボタンを押下した時の一連の流れ)
> @画面のボタンを押下します。
>
> Aボタン押下時にサーバーにおいてある雛形ファイルをファイルのダウンロード機能を使用し、クライアント側に取得
>
> クライアント側のPCでダウンロードしたEXCELファイルを開いたときに行の高さや色が変更されている予定です。
>
> 今のところ、どのように作成していいかわからずとりあえずクライアント側にあるEXCELファイル(パスを指定)の高さを正常に変更できるようなプログラムを作成しております。

それであれば、先のレスで書きました通り、参考にされている「Office のサーバーサイド
オートメーションについて」のことは質問者さんのケースでは何の関係もないです。

つまり、何も問題はないです。
引用返信 編集キー/
■74080 / inTopicNo.9)  Re[4]: EXCEL操作
□投稿者/ 小心者 (3回)-(2014/11/28(Fri) 09:24:45)
No74078 (WebSurfer さん) に返信
> それであれば、先のレスで書きました通り、参考にされている「Office のサーバーサイド 
> オートメーションについて」のことは質問者さんのケースでは何の関係もないです。
> 
> つまり、何も問題はないです。
ありがとうございます。
調べてみて「Office のサーバーサイドオートメーションについて」の記事があまりにも目立ちましたので不安でした…

ちょっとソースのことでわからないところがありましたので教えていただきたいのですがよろしいでしょうか。
http://jeanne.wankuma.com/tips/vb.net/programming/releasecom.html

上記のサイトを参考にEXCELの解放処理を記載しております。

下記は現在EXCELの行の高さを変更しようとしている箇所なのですが
シートと行のループはどのように書けばよろしいでしょうか。
現在固定の数値で記載しているのですがループ分を記載するとエラーになってしまいました…

' 必要な変数は Try の外で宣言する
Dim xlApplication As New Excel.Application
Dim intSheetCount As Integer
Dim intRowsCount As Integer

' COM オブジェクトの解放を保証するために Try 〜 Finally を使用する
Try

    ' 警告メッセージなどを表示しないようにする
    xlApplication.DisplayAlerts = False

    Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks

    Try
        Dim xlBook As Excel.Workbook = xlBooks.Open("ファイルパス")

        Try
            Dim xlSheets As Excel.Sheets = xlBook.Worksheets

            Try
                Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets(1), Excel.Worksheet)

                Try
                    Dim xlRows As Excel.Range = xlSheet.Rows

                    Try
                        Dim xlRange As Excel.Range = DirectCast(xlRows(1), Excel.Range)

                        Try

                            xlRange.RowHeight = 0

                            ' Microsoft Excel を表示する
                            xlApplication.Visible = True

                            ' 1000 ミリ秒 (1秒) 待機する
                            System.Threading.Thread.Sleep(1000)

                            xlBook.Save() '上書き保存

                        Finally
                            If Not xlRange Is Nothing Then
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                            End If
                        End Try
                    Finally
                        If Not xlRows Is Nothing Then
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRows)
                        End If
                    End Try

                Finally
                    If Not xlSheet Is Nothing Then
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
                    End If
                End Try
            Finally
                If Not xlSheets Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
                End If
            End Try
        Finally
            If Not xlBook Is Nothing Then
                Try
                    xlBook.Close()
                Finally
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                End Try
            End If
        End Try

    Finally
        If Not xlBooks Is Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
        End If
    End Try
Finally
    If Not xlApplication Is Nothing Then
        Try
            xlApplication.Quit()
        Finally
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
        End Try
    End If
End Try

お手数おかけしますがご教授ください。

引用返信 編集キー/
■74081 / inTopicNo.10)  Re[5]: EXCEL操作
□投稿者/ 優希(ゆき) (15回)-(2014/11/28(Fri) 09:52:05)
No74080 (小心者 さん) に返信

雛形自体に設定したのをダウンロードさせるのダメ?

それとも、VBAでいじるのもだめ?

(上記コードは、COMでローカルで使用するタイプだと思うから今回の状況じゃ使えないと思うけど…)
引用返信 編集キー/
■74082 / inTopicNo.11)  Re[6]: EXCEL操作
□投稿者/ 小心者 (4回)-(2014/11/28(Fri) 10:02:20)
No74081 (優希(ゆき) さん) に返信
> (上記コードは、COMでローカルで使用するタイプだと思うから今回の状況じゃ使えないと思うけど…)
そうなんですか…!?
なんかいろいろと自信がなくなってきました…

> 雛形自体に設定したのをダウンロードさせるのダメ?
複数パターンありますので雛形ファイルをその分用意するのはあまりよろしくないと思います

>それとも、VBAでいじるのもだめ?
VBAでいじるのは大丈夫だと思いますがVBAで作成したことがなくあまり自信がありません。
ダウンロードしたEXCELファイルを開いたときにマクロを実行し、行の高さ等を変える処理を記載するという考えであっていますか?
引用返信 編集キー/
■74083 / inTopicNo.12)  Re[3]: EXCEL操作
□投稿者/ PANG2 (49回)-(2014/11/28(Fri) 10:06:15)
> Dim xlApplication As New Excel.Application

いつどこで実行されるのかを考えましたか?
サーバーサイドで、ダウンロード前に動いていませんか?
引用返信 編集キー/
■74084 / inTopicNo.13)  Re[5]: EXCEL操作
□投稿者/ 魔界の仮面弁士 (181回)-(2014/11/28(Fri) 10:12:46)
2014/11/28(Fri) 10:22:21 編集(投稿者)

誤記修正「サーバー側(*.aspx)等」→「サーバー側(*.aspx等)」

No74080 (小心者 さん) に返信
> 下記は現在EXCELの行の高さを変更しようとしている箇所なのですが

このコードを、サーバー側(*.aspx等)に書くのは NG です。
Excel がインストールされているのはクライアントであって、
サーバー側では無いため、そもそも実行できません。

サーバー上での動作を想定したライブラリ
(SpreadSheetGear とか ExcelCreator とか NPOI とか)を
サーバー側に導入して使う分には OK ですけれどね。


サーバー側に Excel をインストールしてあるのなら、提示されたコードを
サーバー上で実行できますが、その場合は問題視されていた
「Office のサーバーサイドオートメーション」に当たるのでどっちみち NG。
それでなくとも、サーバーに誰もログオンしていないときに、
Excel を Visible = True にしようとしても無意味ですよね。


今回の場合は、クライアント側で実行されるコードとして書く必要があります。

たとえば *.xlsm や *.xlsb ファイル内の VBA コードとして実装する手法があります。
この場合、言語は VB.NET ではなく VBA になりますし、マクロの実行許可を
クライアント側に許諾させる必要が生じますのでご注意を。

もしも VB.NET でコーディングしたいのであれば、VSTO を使うか、
ClickOnce やノータッチデプロイメントで対処しましょう。この場合、
クライアント側に .NET Framework が導入されている必要があります。
(今時、.NET Framework 未搭載の OS は稀だと思いますが、バージョンは気にする必要あり)

あるいは先に回答したように、クライアントの VBScript や JScript から
操作するという手もありますね。*.wsc とか *.hta とかで。


> System.Threading.Thread.Sleep(1000)
Office オートメーション利用時は Sleep を使用するべきではありません。
引用返信 編集キー/
■74085 / inTopicNo.14)  Re[7]: EXCEL操作
□投稿者/ 優希(ゆき) (16回)-(2014/11/28(Fri) 10:14:57)
No74082 (小心者 さん) に返信
> ■No74081 (優希(ゆき) さん) に返信
>>(上記コードは、COMでローカルで使用するタイプだと思うから今回の状況じゃ使えないと思うけど…)
> そうなんですか…!?
> なんかいろいろと自信がなくなってきました…

検索すれば出てくるし、上にもやるならDCOMって出てきてるような…

>
>>雛形自体に設定したのをダウンロードさせるのダメ?
> 複数パターンありますので雛形ファイルをその分用意するのはあまりよろしくないと思います

コーディングに時間掛けるぐらいなら、雛形を何種類か作成してダウンロードしてもらったほうが工数少なくて済むと思いますが…

>
> >それとも、VBAでいじるのもだめ?
> VBAでいじるのは大丈夫だと思いますがVBAで作成したことがなくあまり自信がありません。
> ダウンロードしたEXCELファイルを開いたときにマクロを実行し、行の高さ等を変える処理を記載するという考えであっていますか?

VBAでやる場合はそれの認識で問題無いです
引用返信 編集キー/
■74086 / inTopicNo.15)  Re[5]: EXCEL操作
□投稿者/ WebSurfer (405回)-(2014/11/28(Fri) 11:34:17)
No74080 (小心者 さん) に返信

回答者が多いとかえって混乱するかもしれませんが、他の回答者の方が触れてない
点を一言・・・

自分も理解が足りなかったのですが、先の質問者さんのレス、

> 動作(ボタンを押下した時の一連の流れ)
> @画面のボタンを押下します。
>
> Aボタン押下時にサーバーにおいてある雛形ファイルをファイルのダウンロード機能を使用し、クライアント側に取得
>
> クライアント側のPCでダウンロードしたEXCELファイルを開いたときに行の高さや色が変更されている予定です。
>
> 今のところ、どのように作成していいかわからずとりあえずクライアント側にあるEXCELファイル(パスを指定)
> の高さを正常に変更できるようなプログラムを作成しております

で @、A はクリアしていて、その次の「クライアント側のPCでダウンロードしたEXCEL
ファイルを開いたときに行の高さや色が変更」(=ユーザーの要求などに応じて動的
に雛形に修正をかける)を行うためのプログラムを作成しているのだと理解しました。

でも、それは ASP.NET の Web アプリの世界の話ではないです。他の回答者の方から
それを実現するためのヒントが出ていますが、それらはかなり敷居が高そうです。

どうしても、ユーザーの要求などに応じて動的に雛形に修正をかけ、ユーザーがそれ
をダウンロードして自分の PC で開いた時は修正済みにしたいということであれば、
上の @ と A の間にもう一ステップ設けて Web サーバーで修正するのが現実的だ
と思います。

それを、参考にされている「Office のサーバーサイド オートメーションについて」
に引っかからないように行うには、サーバーで使えるように開発されたサードパーテ
ィ製品や、Open XML を利用するのがよさそうです。

Open XML SDK 2.0 を使用して Excel 2010 ブックを生成する
http://msdn.microsoft.com/ja-jp/library/office/hh180830(v=office.14).aspx

Excel 2007 以降なら ClosedXML というのもあります。

ClosedXML - The easy way to OpenXML
http://closedxml.codeplex.com/

引用返信 編集キー/
■74087 / inTopicNo.16)  Re[6]: EXCEL操作
□投稿者/ 優希(ゆき) (17回)-(2014/11/28(Fri) 11:42:50)
そもそも、雛形が何個あるのか気になったり…
(データを落とし込まないってことは、帳票関係ではなさそうと思ったり…)
引用返信 編集キー/
■74088 / inTopicNo.17)  Re[7]: EXCEL操作
□投稿者/ PANG2 (50回)-(2014/11/28(Fri) 17:51:03)
最初の質問の意味がようやく分かったので答えておきます。

No74066 (小心者 さん) に返信
> 読解力がなくて理解した内容が違うかもしれませんが上記の内容はサーバー側でサーバーにあるEXCELの操作は保証しませんよってことでしょうか。

はい。
ここでいう「Excel操作」は、ExcelオートメーションによるExcelアプリの制御です。
具体的にはASP.NETで、以下のコードを書くことです。

Dim xlApplication As New Excel.Application

サーバーサイドで別の手段でxls ファイルを編集することは問題に含まれません。


> 上記の場合、今回作成予定のサーバー側からクライアント側でのEXCEL操作は作成するにあたり問題ないのでしょうか。

三つの問題あり。
xlsがサーバーにあるのが問題なのではなく、Excelオートメーションをサーバーで動かすのが問題です。
ASP.NETからクライアント側にダウンロードしたファイルにアクセスすることは出来ませんし、
ましてダウンロード前にコードを書いても意味がありません。


代替案
(1)
Excelオートメーション以外の方法でxlsの完成品をサーバーサイドで作成する
(2)
雛形ファイルに auto_open マクロを仕込んでおく

# Excel-VBAがExcelオートメーションより難しいというのは誤解です

引用返信 編集キー/
■74103 / inTopicNo.18)  Re[8]: EXCEL操作
□投稿者/ 小心者 (5回)-(2014/12/01(Mon) 09:32:53)
PANG2 様
魔界の仮面弁士 様
優希(ゆき) 様
WebSurfer 様
ご回答ありがとうございます。

皆様からたくさんの回答及び解決策を提示して頂き自分なりに対応策をまとめてみました。

@雛形ファイルを複数用意する

AEXCELオートメーション以外の方法で作成する

B雛形ファイルにマクロを仕込んでおく

上記の順番で対応を考えたいと思っております。

私の説明不足及び理解不足で皆様に多大な迷惑をおかけして誠に申し訳ございませんでした。

方向性が見えてきましたので今回の質問は完了とさせていただきます。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -