class Statsample::Excel

Public Instance Methods

read(filename, opts=Hash.new) click to toggle source

Returns a dataset based on a xls file USE:

ds = Statsample::Excel.read("test.xls")
# File pkg/statsample-1.4.0/lib/statsample/converters.rb, line 185
def read(filename, opts=Hash.new)
  require 'spreadsheet'
  raise "options should be Hash" unless opts.is_a? Hash
  opts_default={
    :worksheet_id=>0, 
    :ignore_lines=>0, 
    :empty=>['']
  }
  
  opts=opts_default.merge opts
  
  worksheet_id=opts[:worksheet_id]
  ignore_lines=opts[:ignore_lines]
  empty=opts[:empty]
  
  first_row=true
  fields=[]
  fields_data={}
  ds=nil
  line_number=0
  book = Spreadsheet.open filename
  sheet= book.worksheet worksheet_id
  sheet.each do |row|
    begin
      dates=[]
      row.formats.each_index{|i|
        if !row.formats[i].nil? and row.formats[i].number_format=="DD/MM/YYYY"
          dates.push(i)
        end
      }
      line_number+=1
      next if(line_number<=ignore_lines)
      
      preprocess_row(row,dates)
      if first_row
        fields=extract_fields(row)
        ds=Statsample::Dataset.new(fields)
        first_row=false
      else
        rowa=process_row(row,empty)
        (fields.size - rowa.size).times {
          rowa << nil
        }
        ds.add_case(rowa,false)
      end
    rescue => e
      error="#{e.to_s}\nError on Line # #{line_number}:#{row.join(",")}"
      raise
    end
  end
  convert_to_scale_and_date(ds, fields)
  ds.update_valid_data
  fields.each {|f|
    ds[f].name=f
  }
  ds.name=filename
  ds
end
write(dataset,filename) click to toggle source

Write a Excel spreadsheet based on a dataset

  • TODO: Format nicely date values

# File pkg/statsample-1.4.0/lib/statsample/converters.rb, line 144
def write(dataset,filename)
  require 'spreadsheet'
  book = Spreadsheet::Workbook.new
  sheet = book.create_worksheet
  format = Spreadsheet::Format.new :color => :blue,
                     :weight => :bold
  sheet.row(0).concat(dataset.fields.map {|i| i.dup}) # Unfreeze strings
  sheet.row(0).default_format = format
  i=1
  dataset.each_array{|row|
    sheet.row(i).concat(row)
    i+=1
  }
  book.write(filename)
end