2

とりわけ、GridFs を使用して Excel ファイルを保存しています。Spreadsheet gem を使用してこれらを解析したいと思います。

私はこれを試しましたが、(明らかに!)うまくいきませんでした:

1.9.3p194 :036 > db = Mongo::Connection.new.db(Mongoid.database.name)
1.9.3p194 :037 > grid = Mongo::GridFileSystem.new(db)
1.9.3p194 :038 > f = grid.open('test1.xls', 'r')
 => #<GridIO _id: 500ef7cdc5ebb515c9000005>
1.9.3p194 :039 > Spreadsheet.open(f)
NoMethodError: undefined method `flush' for #<GridIO _id: 500ef7cdc5ebb515c9000005>

ExcelファイルをSpreadsheet openメソッドに渡すことができるように、GridIOクラスを IO::File のようなインスタンスに「変換」または「ラップ」する良い提案はありますか?

スプレッドシートの open メソッドは、ディスク上のパスを指定する IO インスタンスまたは String のいずれかを取ります (GridFS を使用する場合、後者は役に立ちません)。

(Object) open(io_or_path, mode = "rb+", &block)

ありがとう!

4

2 に答える 2

2

これは、まだ存在しない ruby​​ ドライバーの望ましい機能のようです。 https://jira.mongodb.org/browse/RUBY-368

jira チケットで提案されているように、ブロックを Spreadsheet.open に渡すことができます。

db = Mongo::Connection.new.db(Mongoid.database.name)
Spreadsheet.open('filename', 'w') do |f|
   gridfs = Mongo::GridFileSystem.new(db)
   gridfs_file = gridfs.open('test1.xls', 'r')
   f.write(gridfs_file.read()) until gridfs_file.eof?
end
于 2012-07-24T22:02:22.127 に答える
1

エミリーのポインターは非常に役に立ちました。とりあえず、一時ファイルを使用することになりました:

Tempfile.open(["test", ".xls"]) do |fh|
 gridfs = Mongo::GridFileSystem.new(Mongoid.database)
 gridfs_file = gridfs.open('test1.xls', 'r')
 fh.binmode
 fh.write(gridfs_file.read)
 @xls = Excel.new(fh)
 fh.close
end
于 2012-07-27T08:06:46.830 に答える