lib/poi/workbook/workbook.rb in jruby-poi-0.1.0 vs lib/poi/workbook/workbook.rb in jruby-poi-0.4.0

- old
+ new

@@ -1,25 +1,36 @@ +require 'tmpdir' +require 'stringio' + module POI class Workbook - def self.open(filename) - raise Exception, "FileNotFound" unless File.exists? filename - instance = self.new(filename) - + def self.open(filename_or_stream) + name, stream = if filename_or_stream.kind_of?(java.io.InputStream) + [File.join(Dir.tmpdir, "spreadsheet.xlsx"), filename_or_stream] + elsif filename_or_stream.kind_of?(IO) || StringIO === filename_or_stream || filename_or_stream.respond_to?(:read) + # NOTE: the String.unpack here can be very inefficient + [File.join(Dir.tmpdir, "spreadsheet.xlsx"), java.io.ByteArrayInputStream.new(filename_or_stream.read.unpack('c*').to_java(:byte))] + else + raise Exception, "FileNotFound" unless File.exists?( filename_or_stream ) + [filename_or_stream, java.io.FileInputStream.new(filename_or_stream)] + end + instance = self.new(name, stream) if block_given? result = yield instance return result end - instance end + + attr_reader :filename - def initialize(filename) + def initialize(filename, io_stream) @filename = filename - @workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(java.io.FileInputStream.new(filename)) + @workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(io_stream) end def save - @workbook.write(java.io.FileOutputStream.new(@filename)) + save_as(@filename) end def save_as(filename) @workbook.write(java.io.FileOutputStream.new(filename)) end