Trabajando con la gema spreadsheet-excel

Hoy he tenido que luchar con spreadsheet-excel.

Estaba intentando leer datos de un excel con esta gema, y parecia todo muy sencillo, cuando empezaron las pruebas me encontré con el problemón. Los caracteres que me devolvía eran ilegibles.
Pronto comprendí que el encoding era diferente, ya que en excel es UTF-16LE y yo utilizo ISO-8859-1. Intente aplicarlo y nada, solo conseguía errores.
Hasta que me dí cuenta que los tipos de los valores que me estaba devolviendo eran diferentes a los que la aplicación excel me indicaba. Se suponía que todos eran Texto, pues no. Con spreadsheet algunos me decía que eran enteros. Claro yo a los enteros no les colocaba la codificación. Así que se la coloqué y funcionando.

Ejemplo de utilización:

require 'win32ole'
require 'parseexcel'

class Reader

def process_xls_files (param_prod_cd)
logger.info "Inicio proceso..."
Dir.entries(C:\\TEMP" ).each do d
if d != '.' && d != '..'
f_path = File.join("C:\\TEMP" , d)
workbook = Spreadsheet::ParseExcel.parse(f_path)
worksheet = workbook.worksheet(0)
cell = readCell(worksheet, contador, 0)
puts cell
end
end


def readCell(worksheet, linea, columna)
valorDevuelto = nil
begin
cell = (worksheet.row(linea).at(columna) )
cell_type = cell.type
cell_encoding = cell.encoding
if cell_type == :numeric
ivalorDevuelto = 0
ivalorDevuelto = cell.value
valorDevuelto = ivalorDevuelto.to_s.gsub('.0','')
elsif cell_type == :date
day = cell.date.day.to_s
mon = cell.date.mon.to_s
year = cell.date.year.to_s
valorDevuelto = "#{year}#{mon}#{day}"
elsif cell_type == :text
valorDevuelto = Iconv.iconv('ISO-8859-1',cell.encoding,(cell.to_s))
else
valorDevuelto = cell.to_s
end
rescue
valorDevuelto = ""
end
return valorDevuelto
end

end

No hay comentarios:

Nube