- ぱぱ
- 常連さん
- 会議室デビュー日: 2005/09/01
- 投稿数: 34
|
投稿日時: 2005-09-14 16:54
いつも参考にさせていただいております。
ExcelのBookを「Webページとして保存」とすればxlhtmlファイルと
Book内に図があれば「ファイル名.files」というフォルダの中に
gifファイルができますよね。
あのgifファイルのみ作成したい(htmlとxmlはいらない)のですがExcelの機能のみでは
無理なのでしょうか?
いろいろ検索してみたのですが私の検索が悪いのかなかなか
いい方法は見つかりません。
Excelで図を作成し、gifファイルとして保存し、ActiveReportsのイメージとして
貼り付けようと試みております。
環境はWinXp,office2003です。
どなたかご存知の方、ご教授おねがいします。
|
- なおこ(・∀・)
- 大ベテラン
- 会議室デビュー日: 2004/04/08
- 投稿数: 174
- お住まい・勤務地: 東京都
|
投稿日時: 2005-09-14 18:16
お世話になります。
花ちゃんさんのサイト
http://www.bcap.co.jp/hanafusa/dotnet/Excel04.htm
を参考にして、実験してみたらできました
コード: |
|
Public Sub saveImage(ByVal excel_path As String)
Dim xlApp As Excel.Application = New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook
Dim xlSheets As Excel.Sheets
Dim xlSheet As Excel.Worksheet
Dim oShapes As Excel.Shapes
Dim oShape As Excel.Shape
Try
xlBook = xlBooks.Open(excel_path, , False)
xlSheets = xlBook.Worksheets
xlSheet = CType(xlSheets.Item(1), Excel.Worksheet)
oShapes = xlSheet.Shapes
oShape = oShapes.Item("Rectangle 1") '四角形を選択
oShape.Select()
'クリップボードにコピーする。
oShape.CopyPicture(Appearance:=Excel.XlPictureAppearance.xlScreen, _
Format:=Excel.XlCopyPictureFormat.xlBitmap)
Dim iData As IDataObject = Clipboard.GetDataObject()
Dim bmpData As Object = iData.GetData(System.Windows.Forms.DataFormats.Bitmap)
Dim imgData As System.Drawing.Image = CType(bmpData, Image)
imgData.Save("c:\test.gif", System.Drawing.Imaging.ImageFormat.Gif)
Catch ex As Exception
Throw ex
Finally
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(oShape)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oShapes)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
If Not IsNothing(xlBook) Then
xlBook.Close(False)
End If
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
If Not IsNothing(xlApp) Then
xlApp.Quit()
End If
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
Catch ex As Exception
End Try
End Try
End Sub
|
[ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-09-14 18:18 ]
|
- ぱぱ
- 常連さん
- 会議室デビュー日: 2005/09/01
- 投稿数: 34
|
投稿日時: 2005-09-14 18:59
引用: |
|
'クリップボードにコピーする。
oShape.CopyPicture(Appearance:=Excel.XlPictureAppearance.xlScreen, _
Format:=Excel.XlCopyPictureFormat.xlBitmap)
Dim iData As IDataObject = Clipboard.GetDataObject()
Dim bmpData As Object = iData.GetData(System.Windows.Forms.DataFormats.Bitmap)
|
IDataObject ってたしかSystem.Windowsクラスですよね。
Webアプリじゃきびしいってことですよね。
|
- なおこ(・∀・)
- 大ベテラン
- 会議室デビュー日: 2004/04/08
- 投稿数: 174
- お住まい・勤務地: 東京都
|
投稿日時: 2005-09-14 19:07
お世話になります。
引用: |
|
ぱぱさんの書き込み (2005-09-14 18:59) より:
IDataObject ってたしかSystem.Windowsクラスですよね。
Webアプリじゃきびしいってことですよね。
|
なんと、Webアプリケーションでしたか…
それは失礼いたしました…。
追記:
ほかにもやり方はあるのかもしれませんが、
Webアプリから、gif生成だけする、winアプリをキックするという
方法もあると思います。
[ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-09-14 19:10 ]
|
- ぱぱ
- 常連さん
- 会議室デビュー日: 2005/09/01
- 投稿数: 34
|
投稿日時: 2005-09-14 19:25
引用: |
|
ほかにもやり方はあるのかもしれませんが、
Webアプリから、gif生成だけする、winアプリをキックするという
方法もあると思います。
|
Winアプリではできました。
ありがとうございます。
でもまたひとつ問題できちゃいました。
これでいくと今はひとつのオートシェイプのみ
gif化ですよね。
今オートシェイプが重なり合っている状態なんです。
その複数のオートシェイプをgif化したくて・・。
oShapes = xlSheet.Sha
でシート内にあるオートシェイプをぐるぐる回して
すべてをグループ化とかできるんでしょうか?
いろいろやってみたのですが
あまり中身がわかっておらず的外れなことをしてるかも
しれませんが・・。
|
- かつのり
- ぬし
- 会議室デビュー日: 2004/03/18
- 投稿数: 2015
- お住まい・勤務地: 札幌
|
投稿日時: 2005-09-15 06:11
対象となるシェイプを全て選択してから、
Selection.CopyPicture
というメソッドで1つのファイルにできますよ。
違いは
oShape.CopyPictureとSelection.CopyPictureです。
前者はオブジェクトのメソッドを直接コールしているのに対して、
後者は選択されているオブジェクト全てに対してメソッドをコールしています。
エクセルのマクロの記録モードにして、手作業で自動化したい内容をやってみてください。
エクセル操作のメソッドに関しては、なおこさんのサンプルと同じようなソースができますので。
ちなみに、WEBアプリとの事なので、
クリップボードの排他制御が必要じゃないかなと思います。
|
- なおこ(・∀・)
- 大ベテラン
- 会議室デビュー日: 2004/04/08
- 投稿数: 174
- お住まい・勤務地: 東京都
|
投稿日時: 2005-09-15 10:36
お世話になります。
引用: |
|
かつのりさんの書き込み (2005-09-15 06:11) より:
対象となるシェイプを全て選択してから、
Selection.CopyPicture
というメソッドで1つのファイルにできますよ。
|
そんなことが出来るんだ〜!と思って、以下の様にやってみましたが、
xlApp.Selectionをキャストする所で躓いてしまいました…。
前の私の投稿の四角形を選択以降を以下の様に書き換え
(※xlApp.Selectionでキャストできない・Option Strict Offにしてもダメでした)
コード: |
|
xlSheet.Shapes.SelectAll()
xlApp.Selection.CopyPicture(Appearance:=Excel.XlPictureAppearance.xlScreen, _
Format:=Excel.XlCopyPictureFormat.xlBitmap)
|
で、とりあえず、以下のコードで全ての画像を保存することは出来ました。
コード: |
|
For i As Integer = 1 To oShapes.Count
oShape = oShapes.Item(i)
oShape.Select()
'クリップボードにコピーする。
oShape.CopyPicture(Appearance:=Excel.XlPictureAppearance.xlScreen, _
Format:=Excel.XlCopyPictureFormat.xlBitmap)
Dim iData As IDataObject = Clipboard.GetDataObject()
Dim bmpData As Object = iData.GetData(System.Windows.Forms.DataFormats.Bitmap)
Dim imgData As System.Drawing.Image = CType(bmpData, Image)
imgData.Save("c:\\" + oShape.Name + ".gif", System.Drawing.Imaging.ImageFormat.Gif)
Next
|
引用: |
|
ちなみに、WEBアプリとの事なので、
クリップボードの排他制御が必要じゃないかなと思います。
|
同意です。
|
- ぱぱ
- 常連さん
- 会議室デビュー日: 2005/09/01
- 投稿数: 34
|
投稿日時: 2005-09-15 11:10
引用: |
|
前の私の投稿の四角形を選択以降を以下の様に書き換え
(※xlApp.Selectionでキャストできない・Option Strict Offにしてもダメでした)
|
私もこれを昨日ずっとやってたんですがだめでした。
引用: |
|
で、とりあえず、以下のコードで全ての画像を保存することは出来ました。
|
なおこ(・∀・) さんの方法でいくとgifファイルがたくさんできちゃいますよね?
できればかつのり さんの方法でいきたいのですがデバッグでSelectionの
中身を見るとNothingになっちゃってるんですよね。
ソースはExcel.Application.Selectionなんですけど、これじゃだめなんですかね?
エクセルマクロではもちろんうまくいくんですけど・・。
引用: |
|
ちなみに、WEBアプリとの事なので、
クリップボードの排他制御が必要じゃないかなと思います。
|
サーバ側のクリップボードって何かで使用されることあるんですか?
今クライアント側のクリップボードはシステム立ち上げている間
JavaScriptでクリップボードを使えないように制御しているんですが
サーバ側もなんらかの制御が必要なのですか?
|