I played a bit with SpreadSheet library and your file and checked the class of row[1]:
irb> sheet.each {|row| print row[1], ' ', row[1].class; puts }
866202F501 String
866201F000 String
866201G600 String
866201G800 String
8662026800.0 Float
866202H010 String
...
Gotcha! It chages! Some of values has type of Float, so when you call to_s on them (or ActiveRecord, if you don't), it adds .0. That is simply the behaviour of to_s method of Float: it always adds fractional part, even if it is zero. Database is not related here.
Probably there might be more elegant solution (somehow configure Spreadsheet lib, modify xls) but the fastest hack is: sees Float -> converts to int before converting to string.
Compare:
irb> sheet.each {|row| puts row[1].is_a?(Numeric) ? row[1].to_i.to_s : row[1] }
866202F501
866201F000
866201G600
866201G800
8662026800
866202H010
So you can just add this check to your check of .present?, probably wrapping this into a function in order not to look so ugly. Here I use Numeric instead of Float: it is base class for all numbers so in case you somehow get decimal or something else, it is also caught.
UPD: Here comes the code sample: you can replace your line with the following:
oem = row[1].is_a?(Numeric) ? row[1].to_i.to_s : row[1] if row[1].present?