以下、変数xlにはExlapオブジェクト(VBAのApplicationに相当)、wbにはExlwbオブジェクト(VBAのWorkbooks(1)などに相当)が代入されているものとする。
配列要素の数値化を行う ary2num() を廃止した。その代わり to_num() で同様のことが行える。
ary = Exl::to_num(ary)
上のようにすると、配列の各要素について、文字列であっても数値化できるものは数値に変換して返す。つまり計算に使えるようになる。
to_num() は、配列が与えられると、各々の要素について変換を行う。2次元配列を与えてもよい。
to_num() は、引数として文字列を与えることもできる。文字列でも配列でもないものは、変換せずそのまま返す。
Timeオブジェクトを単純に文字列に変換すると、「2014-04-23 00:00:00 +0900」のような形式になる。
time2str() は、世界標準時との差を示す「+0900」を削除し、更に、「00:00:00」といった省略可能な時刻の表示も削除する。
時刻が「18:57:00」のような場合は、末尾の「:00」を取り除いて「18:57」にする。
str = Exl::time2str(tm) ary = Exl::time2str(ary)
上のように、引数としてTimeオブジェクトと配列の両方をわたすことができる。
配列については、各要素をチェックして、要素がTimeオブジェクトなら文字列に変換し、そうでなければ何もしない。すべての要素を処理した上で、変換処理された配列を返す。2次元配列をわたしてもよい。
ary = Exl::str2ary(str) → 文字列(csvやタブ区切り)の配列化 str = Exl::ary2str(ary) → 配列の文字列(csvやタブ区切り)への変換
上の2つのメソッドは、その内部で文字エンコードの変換を行うようにしていた。exlap.rb をrequireしていれば Windows-31J に変換し、exlap_utf.rb だと utf-8 に変換していたが、エンコードの変換を行わないようにした。
rip_range:別名rrは、「このセルから、あのセルまで」の一定の範囲のRangeオブジェクトを返すものだが、前者のセルと後者のセルが同じものだった時にエラーになっていた。
例えば、「ss.rr(1,1, 1,1)」だとエラーになっていた。
これだと不便なので、「ss.rr(1,1, 1,1)」が「ss.Range("A1")」を返すよう改めた。
Excelでセルに書き込みを行う場合、utf-8の文字を書き込むことはできるが、Valueプロパティでデータを取り出すと、utf-8ではなくWindows-31Jになってしまう。
このため、exlap_utf.rbで定義している findf() など一部のメソッドがうまく機能しないケースがあった。
そこで、exlap_utf.rb の内部では、Valueプロパティで取得したデータをutf-8に変換するように改めた。findf() などは支障なく使えるはず。
とはいえ、exlap_utf.rbの利用者が自らのスクリプトで Valueプロパティを参照すると、やはり Windows-31J になっているので注意されたい。
Valueで取得した値を to_utf() に引きわたすと、utf-8に変換された状態になる。例えば下のように用いる。
str = Exl::to_utf( ss.Range("A1").Value ) ary = Exl::to_utf( ss.Range("A1:E1").Value )
Valueプロパティは、文字列の他に配列を返すこともあるが、to_utf() は、配列も処理する。配列の各要素に変換を施し、その新しい配列を戻り値として返す。
文字列でも配列でもない値(数値など)は、何も変換せずそのまま返す。
Valueプロパティの他に、Nameプロパティも同じように文字エンコードの影響を受ける。exlap_utf.rbの内部で、Nameプロパティの値をutf-8に変換した方がいい箇所については変換処理を施している。
ただ、ワークブック名(つまりファイル名)を扱う部分、あるいは、マクロを扱うメソッドの中で出てくるNameプロパティに関しては、変換しない方がいいと思われる部分があるため、変換処理していない箇所がある。不具合に遭遇した時は、自前で対応されたい。
to_utf() はnkfで変換を行っているが、半角カタカナを全角に変換せず半角のままに残すようにしている。-m0xw というオプションを付けて変換する(-xオプションが要点)。Excelのピボットテーブルなどで半角カタカナが出てくるケースがあるため、そのようにしている。
半角カタカナを全角に変換したい場合は、to_utf() を用いずに自前で変換されたい。ちなみに、nkfは、デフォルトでは半角カタカナを全角に変換する。Exl::to_enc(str) も、半角カタカナを全角に変換する。
ruby ver 1.8 のnkfで -x オプションを付けた場合、妙な文字が混入してしまうことがあるようなので、ruby 1.9 以降を推賞。
to_utf() と逆に Windows-31J に変換するためのメソッド to_org() も設けてある。
これら to_utf(), to_org() は、exlap.rb の中では定義されていない。exlap_utf.rb の方だけで定義されている。
ss.from_f("data.txt")
ss.save("test.csv") # csvファイル ss.save("test.txt") # タブ区切りテキスト ss.save("test.prn") # スペース区切りテキスト
ss.save("test", :csv) ss.save("test", :txt)
ワークシート ss が空のとき、ss.range_address が適切な戻り値を返さないことがあったのを修正。その影響で、ss.range_each なども期待どおりに機能しないケースがあったが是正した。
rng = ss.Range("A1:C3") p ss.range_address(rng) # => [1,1, 3,3]
上は、ワークシートが空か否かに関係なく、[1,1, 3,3] が返されるべきところだが、ver 1.11 では [] を返してしまうケースがあった。
xl.display_alert(false) do ss = wb.select_sheet("Sheet1") ss.Delete end
Exlap.new("test.xls") {|wb| wb.app.display_alert(false) do ss = wb.select_sheet("Sheet1") ss.Delete end wb.save }
(前略) xl = Exlap.new wb = xl.book_opentext({'Filename'=>"test.txt", 'DataType'=>XlDelimited, 'Tab'=>true, 'TextQualifier'=>XlTextQualifierNone, 'FieldInfo'=>[[1,XlTextFormat]]}) # 第1列を文字型として読み込む if wb ss = wb.ss(1) ss.range_autofit wb.save wb.filename.sub(/.txt$/i, ".xls") end xl.quit
以上。