Как я могу загрузить и проанализировать файл Excel в Rails? - PullRequest
13 голосов
/ 28 января 2011

Я хочу иметь возможность загрузить файл Excel, который содержит контактную информацию. Затем я смог проанализировать его и создать записи для моей модели контактов.

Мое приложение является приложением Rails.

Я использую камень-скрепку на heroku, я смог разобрать карточки vim в модели Contact и ищу что-то подобное, но пройдусь по всем строкам файла Excel.

Полезны гемы, которые упрощают задачу и пример кода для разбора!

Ответы [ 3 ]

18 голосов
/ 28 января 2011

Spreadsheet - лучший анализатор Excel, который я нашел до сих пор.Он предлагает довольно много функций.

Вы говорите, что используете Paperclip для вложений, что хорошо.Однако, если вы сохраняете вложения в S3 (что, как я полагаю, поскольку вы используете Heroku), синтаксис для передачи файла в электронную таблицу немного отличается, но не сложен.

Вот пример чистого синтаксиса, который можетиспользоваться и не помещаться ни в какие классы или модули, так как я не знаю, как вы собираетесь начать разбор контактов.

# load the gem
require 'spreadsheet'

# In this example the model MyFile has_attached_file :attachment
@workbook = Spreadsheet.open(MyFile.first.attachment.to_file)

# Get the first worksheet in the Excel file
@worksheet = @workbook.worksheet(0)

# It can be a little tricky looping through the rows since the variable
# @worksheet.rows often seem to be empty, but this will work:
0.upto @worksheet.last_row_index do |index|
  # .row(index) will return the row which is a subclass of Array
  row = @worksheet.row(index)

  @contact = Contact.new
  #row[0] is the first cell in the current row, row[1] is the second cell, etc...
  @contact.first_name = row[0]
  @contact.last_name = row[1]

  @contact.save
end
10 голосов
/ 28 января 2011

У меня было похожее требование в одном из моих приложений на Rails 2.1.0.Я решил это следующим образом:

В папке 'lib' я написал такой модуль:

require 'spreadsheet'

module DataReader
  def read_bata(path_to_file)
    begin
      sheet = book.worksheet 0
      sheet.each 2 do |row|
        unless row[0].blank?
          # Create model and save it to DB
          ...
        end
      end
    rescue Exception => e
      puts e
    end
  end
end

Имеет модель Загрузить:

class Upload < AR::Base
  has_attached_file :doc, 
    :url => "datafiles/:id",
    :path => ":rails_root/uploads/:id/:style/:basename.:extension"

  # validations, if any
end

Сгенерировал UploadsController, который будет обрабатывать загрузку файла и сохранять его в соответствующем месте.Я использовал Paperclip для загрузки файлов.

class UploadsController < AC
  include DataReader

  def new 
    @upload = Upload.new
  end

  def create
    @upload = Upload.new(params[:upload])

    @upload.save
    file_path = "uploads/#{@upload.id}/original/#{@upload.doc_file_name}"
    @upload.read = DataReader.read_data(file_path)

    # respond_to block
  end
end

Подробнее о библиотеке электронных таблиц здесь и здесь .Вы можете внести соответствующие улучшения и заставить технику работать в Rails 3. Надеюсь, это поможет.

0 голосов
/ 24 февраля 2018

Я сделал драгоценный камень, чтобы достичь этого легко. Я назвал это Парксер и ...

  • Он построен из руо камень.
  • Позволяет анализировать файлы xls, xlsx и csv.
  • Имеет DSL для обработки:
    • Отображение столбцов.
    • Проверка файла, строки и столбца / ячейки.
    • Форматирование столбца / ячейки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...