Разбор электронной таблицы XLS в Rails с использованием Roo Gem - PullRequest
1 голос
/ 07 марта 2012

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

Я получаю ошибку:

#<File:0x007ffac2282250> is not an Excel file

Таким образом, roo не распознает файл как файл Excel. Нужно ли сохранять файл локально, чтобы использовать roo, или есть способ обойти это. Я хотел бы проанализировать данные файла Excel непосредственно в базе данных.

Параметры, которые проходят через:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"yLqOpSK981tDNYjKSoWBh0VnFEKSk0XA/wOt3r+yWJc=", "uploadform"=>{"name"=>"xls", "file"=>#<ActionDispatch::Http::UploadedFile:0x007ffac22b6550 @original_filename="cities2.xls", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"uploadform[file]\"; filename=\"cities2.xls\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/qn/70msrkt90pd390sdr14_0g2m0000gn/T/RackMultipart20120306-3729-1m2xcsp>>}, "commit"=>"Save Uploadform"}

Я пытаюсь получить доступ к файлу с помощью

    if params[:uploadform][:file].original_filename =~ /.*\.xls$/i
        oo = Excel.new(params[:uploadform][:file].open)

        rooparse(oo)
    end

Я также пробовал params [: uploadform] [: file] .read и params [: uploadform] [: file], но я думаю, что .open будет правильным методом здесь !?

А вы бы порекомендовали использовать здесь скрепку или несущую?

Спасибо за вашу помощь!

Ответы [ 3 ]

5 голосов
/ 07 марта 2012

Да, я пока не могу разобрать полный файл, но это еще одна проблема. По крайней мере, я получаю первую строку из таблицы в свою базу данных со следующими строками:

require 'fileutils'
require 'iconv'

tmp = params[:uploadform][:file].tempfile
file = File.join("public", params[:uploadform][:file].original_filename)
FileUtils.cp tmp.path, file

oo = Excel.new(file)

rooparse(oo)
FileUtils.rm file

Спасибо за ваш вклад!

2 голосов
/ 07 марта 2012

Глядя на источник для Excel.new , кажется, что ему нужно имя файла, а не объект File или обработчик. Другими словами, требуется строковое представление полного пути, включая имя файла, к файлу, который вы хотите проанализировать. Также он проверяет расширение файла. Поэтому, если временный файл не заканчивается на «.xls», вам сначала нужно переименовать файл.

0 голосов
/ 18 июня 2018

Это путь:

params[:file].tempfile.path.

Вы можете попробовать это:

Excel.new(params[:uploadform][:file].tempfile.path)
...