重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

エクセルのデータをTAB区切りテキストに出力

1.エクセルのデータをTAB区切りテキストに出力して
2.そのテキストを入力としてrubyでデータ加工

という作業があります。現在1を手動で行っておりますが、ファイルが多いためこの操作をファイル名とシート名を指定してrubyから操作できればと考えております。
できれば追加でライブラリをインストールすることなく実現できればありがたいのですが、簡単な方法がございましたらご教示ください。

環境は、Win XP、Office 2003、ruby 1.9.1です。

最終的にはエクセルファイルから直接データを取得できるようにしたいのですが、当面は上記の方法で凌ぎたいと考えております。

A 回答 (2件)

sample1.xlsをダウンロードされましたでしょうか?


おそらく11行目でエラーがでていますので、sample1.xlsファイルが見つからない為に
エラーが発生しているものと思われます。
同じ環境で試していますが、問題なく動作します。

また、タブ区切りのcsvを生成する方法の1つは、
標準ライブラリのcsvを利用して下記のように書けます。

CSV.open("test.csv", "w",{:col_sep=>"\t"}) do |writer|
writer << ["foo", "bar", "huga"]
end

これを利用して、excel1.rbを下記のように変更。

require 'win32ole'
require 'CSV'

def getAbsolutePath filename
fso = WIN32OLE.new('Scripting.FileSystemObject')
return fso.GetAbsolutePathName(filename)
end
filename = getAbsolutePath("sample1.xls")

xl = WIN32OLE.new('Excel.Application')

book = xl.Workbooks.Open(filename)

csv = CSV.open("test.csv", "w",{:col_sep=>"\t"})  #追加
begin
book.Worksheets.each do |sheet|
sheet.UsedRange.Rows.each do |row|
record = []
row.Columns.each do |cell|
record << cell.Value
end
csv <<record   #追加
end
end
ensure
book.Close
xl.Quit
csv.close  #追加
end

この回答への補足

sample1.xlsがあるのに気がつかず、自分で作成しておりました。
ですが、ダウンロードしたsample1.xlsでも同様でした。
同じ環境で動作するということですので、他の要因がありそうですね。

補足日時:2010/06/19 02:39
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
office側にトラブルが在った様で、原因不明ですが別ユーザー名で確認しましたところ動作しました。


> 手動での「名前をつけて保存(タブ区切り)」と同じ操作

私の書き方が拙かった様で申し訳ありません。
Rubyのスクリプト側で各セルの値を拾う方法ではなく、つまり
book.Worksheets.each do |sheet|
sheet.UsedRange.Rows.each do |row|
row.Columns.each do |cell|
を使用せずに
rubyから保存コマンド(?)の様なものをole経由(?)で発行してシートを一括保存するような方法を知りたいのです。
ご存じの方がいらっしゃいましたら、ご教示をお願いいたします。

お礼日時:2010/06/20 07:44

>>追加でライブラリをインストールすることなく実現できれば



Win32OLEを使用されてみてはいかがでしょうか?

使い方は、Rubyist Magazineで紹介されています。

http://jp.rubyist.net/magazine/?0004-Win32OLE
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
提示いただいたリンク先のexcel1.rbを試してみたのですが、エラーになってしまいました。
----------
excel1.rb:11:in `method_missing': (in OLE method `Open': ) (WIN32OLERuntimeError
)
OLE error code:0 in <Unknown>
<No Description>
HRESULT error code:0x800a03ec

from excel1.rb:11:in `<main>'
--------

使用しているRubyは以下のとおりですが、1.9.1では動作しないのでしょうか?
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mswin32]

またサンプルの内容は、各セルをスキャンしてデータを取得する内容ですが、手動での「名前をつけて保存(タブ区切り)」と同じ操作をする方法もありましたら、ご教示いただければ幸いです。

お礼日時:2010/06/18 06:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!