learn-ruby-in-kansai:128
From: tomoya <tomoya@c...>
Date: Sat, 25 Dec 2004 10:24:15 +0900
Subject: [learn-ruby-in-kansai:128] Re: WIN32OLEについての質問
cuzicです。 メリークリスマスですね。 > 酒井信之です。 > > >るびまの記事について「ここがわかりにくい」とか > >「もっとここについて説明してほしい」とかありましたら、参考に > >しますんで、教えてください。 > > EXCELでのWIN32OLEについて > 1:EXCELのcellは、cell[r, c]の様に参照したい。 > CELLの参照は、cellcell[r, c]の様にしたいのでmoduleの定義を以下の様にす > るのは、どうでしょう。 snip > これでcell.item(i, j).value = '文字: size20,黒,Center,Center'が > cell[i, j] = '文字: size20,黒,Center,Center' とできる。 いいんじゃないでしょうか? 私がたとえばライブラリ作成のような方法ではなく、Win32OLEの記事を書く という形で私が得ている知見を役立てようと思ったのには理由があります。 それは、読んだ人がそれぞれ自分のやり方をしていってもらうためです。 自分なりのやり方でやっていってもらえるとうれしいです。 > 問題点 > しかし、cell.item(i, j).Font.Size = 20は、cell[i, j].Font.Size = 20とは、でき > ない。 > Fontに関する再定義がまた必要になる。(CELLに関する属性は沢山あり面倒) 次のような方法はどうでしょうか? # 僕のやり方で Worksheet モジュールを使っている点はご容赦を。 module Worksheet def [] y,x cell = self.Cells.Item(y,x) v = cell.Value def v.cell= cell @cell = cell end v.cell = cell def v.method_missing(name,*args) @cell.__send__(name,*args) end return v end end ... openExcelWorkbook("sample2.xls") do |book| sheet = book.Worksheets.Item(2) sheet.extend Worksheet puts sheet[2,2].Font.Size end ポイントは method_missing を使うことで、cell にdelegate するようにしてい る点です。 > cell = sheet.Range("B2") > borders = cell.Borders > ... > border = borders.Item(index) > border.extend Border > で定義する方法は、かえってわかりにくいのではないですか。 > cell.item(i, j).Borders(position('l')).LineStyle = line_s('c') > cell.item(i, j).Borders(position('l')).Weight = line_w('s') > の方がわかりやすい気がしますが。 境界線に関するスクリプトは自分でもわかりにくかったと思います。 ああなってしまった理由は、Ruby とWin32OLE の定数の扱いを 説明したかったからです。 この記事は Win32OLE を簡単に使うことだけが重視して書かれているわけ ではなく、合わせて Ruby のあまり知られていない(と、勝手に思っている) テクニックを紹介することも目標にしています。 ただ、簡単に使うということを重視すると、ラッパークラスを用意するのが 良いでしょうね。 > 2:EXCELの初めて見る呼び出しかた。 > 以下の呼び出し方は、処理と終了またはエラーが近くにあり非常に参考になりました。 > 個人的には、eachを繰り返し以外に使うには、少し抵抗がありますが。 > def openExcelWorkbook filename > filename = getAbsolutePath(filename) > xl = WIN32OLE.new('Excel.Application') > book = xl.Workbooks.Open(filename) > begin > yield book > ensure > xl.Workbooks.Close > xl.Quit > end > end > > 問題点 > 複数のsheetを扱うときは、適用できないのでは。 > 色々な場合にも適用できてわかりやすい書き方を模索しています。どなたが教えて > ください。 この方法はbook を返しますから、複数のワークシートには対応できますが、複 数のブックには対応できませんね。 複数のブックを一度に扱うことは私にとってはあまりないので、これで不自由し ていません。もしもある場合は次のような形でしょうか? (検証していません) def openExcelWorkbooks *filenames books = [] xl = WIN32OLE.new('Excel.Application') filenames.each do |filename| filename = getAbsolutePath(filename) book = xl.Workbooks.Open(filename) books << book end begin yield books ensure xl.Workbooks.Close xl.Quit end end > 以上 気が付いた事を書きました。 今回の記事には、知らないことがいろいろとあ > り勉強になりました。 参考にしますので、どのテクニックが知らなかったのかとか、これは使える!と 思ったテクニックにどんなものがあったのかも教えて欲しいです。 褒めてもらえると、なんかやる気がでてきます(笑) よろしくお願いします。 -- cuzic <tomoya@c...> http://www.cuzic.com/ -- ML: learn-ruby-in-kansai@r... 使い方: http://QuickML.com/
119 2004-12-22 05:19 [gollum@h... ] 第1回 日本Ruby の会関西勉強会開催の案内 120 2004-12-23 00:08 ┣[tomoya@c... ] 123 2004-12-23 05:17 ┃┣[gollum@h... ] 124 2004-12-23 07:46 ┃┃┣[xml@t... ] 129 2004-12-25 02:24 ┃┃┗[tomoya@c... ] 126 2004-12-24 12:47 ┃┗[sakai-n@m... ] WIN32OLEについての質問 -> 128 2004-12-25 02:24 ┃ ┗[tomoya@c... ] 134 2004-12-25 16:43 ┃ ┣[xml@t... ] 136 2004-12-26 11:39 ┃ ┗[gollum@h... ] Re: WIN32OLEについての質問/Object#.... 122 2004-12-23 05:02 ┣[zn@m... ] 125 2004-12-23 08:39 ┣[sakai-n@m... ] 130 2004-12-25 07:12 ┣[mash@a... ] 133 2004-12-25 14:59 ┃┣[zn@m... ] 138 2004-12-26 12:57 ┃┃┗[tomoya@c... ] 140 2004-12-27 03:41 ┃┗[mash@a... ] Cygwin 環境から MSWIN32 版 Ruby を使う際のパス変換について 143 2004-12-29 13:20 ┗[babie7a0@y... ]