2016-09-06 7 views
1

Я использую Roo Gem в рельсах 5 для обработки моих данных.неявное преобразование символа в целое число с использованием Roo gem/XLS, XLSX, CSV Импорт файлов

Мой CSV-импорт работает отлично, но я думаю, что его более эффективно использовать XLS и XLSLX, поскольку конечный пользователь будет лучше оснащен ими, и я могу предоставить им шаблон стиля для их использования.

ошибки я получаю, когда я пытаюсь импортировать лист выглядит следующим образом:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"X1k7+P2+YQtxJiKzuHZeErDCybH5jjCC1k/Q4OQwVL3hZ+ZEBdkxy8b9vXzGeHXhiMAKbukxvKsVbrQHh4FDFA==", "file"=>#<ActionDispatch::Http::UploadedFile:0x007fadab626f00 @tempfile=#<Tempfile:/var/folders/5z/7q_phgfd14d1cpgcpgwrgrj80000gp/T/RackMultipart20160905-12928-1hbqlew.xlsx>, @original_filename="User_import_excel.xlsx", @content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"User_import_excel.xlsx\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\r\n">, "commit"=>"Import"} 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]] 
Completed 500 Internal Server Error in 16ms (ActiveRecord: 0.3ms) 



TypeError (no implicit conversion of Symbol into Integer): 

app/models/user.rb:58:in `new' 
app/models/user.rb:58:in `open_spreadsheet' 
app/models/user.rb:44:in `import' 
app/controllers/users_controller.rb:71:in `import' 
    Rendering /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout 
    Rendering /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb 
    Rendered /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (2.6ms) 
    Rendering /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb 
    Rendered /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.4ms) 
    Rendering /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb 
    Rendered /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.1ms) 
    Rendered /Users/developer/.rvm/gems/ruby-2.3.1/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (49.8ms) 

Другой проблемой я столкнулся когда я пытаюсь импортировать файл CSV, который имеет предыдущие пользователь в нем, чтобы обновить их в На самом деле, это просто дает мне ошибку, которая говорит, что письмо уже принято. Если бы я мог получить помощь в этой ошибке, это было бы фантастически!

Моих пользователей действие контроллера импорта:

def import 
    User.import(params[:file]) 
    redirect_to users_path, notice: "Users successfully imported" 
    end 

Моих Пользователи Модель

# Accessible Attributes 
    def accessible_attributes 
    [:email, :f_name, :l_name, :telephone] 
    end 

    # XLSL Importer 
    def self.import(file) 
    spreadsheet = open_spreadsheet(file) 
    header = spreadsheet.row(1) 
    (2..spreadsheet.last_row).each do |i| 
     row = Hash[[header, spreadsheet.row(i)].transpose] 
     product = find_by_id(row["id"]) || new 
     product.attributes = row.to_hash.slice(*row.to_hash.keys) 
     product.save! 
    end 
    end 

    def self.open_spreadsheet(file) 
    case File.extname(file.original_filename) 
    when ".csv" then Roo::CSV.new(file.path, csv_options: {encoding: "iso-8859-1:utf-8"}) 
    when ".xls" then Roo::Excel.new(file.path, nil, :ignore) 
    when ".xlsx" then Roo::Excelx.new(file.path, :ignore) 
    else raise "Unknown file type: #{file.original_filename}" 
    end 
    end 

Пожалуйста, дайте мне знать, если вам требуется какая-либо другая информация. Любая помощь с этим будет принята с благодарностью!

EDIT # 1 enter image description here

ответ

2

Так получается, что мне нужно изменить

when ".xls" then Roo::Excel.new(file.path, nil, :ignore)

в

when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore) 

, а затем я должен был добавить

gem 'roo-xls' 

для импорта XLS файлов.