- PR -

Excelオートシェイプで作成された図をgif保存

投稿者投稿内容
ぱぱ
常連さん
会議室デビュー日: 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でクリップボードを使えないように制御しているんですが
サーバ側もなんらかの制御が必要なのですか?

スキルアップ/キャリアアップ(JOB@IT)