在使用 Rails 和 Roo-xls gem 保存之前验证上传的 Excel 文件

Validation of uploaded Excel file before save using Rails with Roo-xls gem

在模型中,在上传 .xls 文件之前,我希望能够在应用程序保存文件之前验证 excel 文件。我正在尝试从 :file_url 对象(将保存 .xls 文件的 comits table 中的列)打开要保存的 excel 文件,然后验证它但我收到 no implicit conversion of Symbol into String 错误。

当我将已由 carrierwave 上传并保存的 excel 文件的实际文件路径放入 Roo::Excel.new("") 时,验证有效,但这违背了我验证的目的。

如何获取 excel 文件而不存储在应用程序中?

感谢您的帮助!我希望不会太混乱。

这是我的comit.rb

class Comit < ActiveRecord::Base
  belongs_to :user
  mount_uploader :file_url, ComitUploader, mount_on: :file_url
  validates :filename, :file_url, presence: true
  validates_format_of :file_url, with: /.xls/, message: "Wrong file format"
  before_save :validate_excel

  def validate_excel
    sheet = Roo::Excel.new(:file_url)
    errors = []

    header = sheet.row(1)
    num_of_columns = sheet.last_column

    errors << 'Need headers' unless
    errors << 'Need more columns' if num_of_columns < 21

    errors
  end
end

您正在将符号 :file_url 传递给 Roo::Excel.new,它需要文件的路径。尝试:

sheet = Roo::Excel.new(file_url)

您可以将 临时文件 发送到 Roo
假设您将文件发送到 params 作为 :file:

Roo::Excel.open(params[:file].tempfile.to_path.to_s)

好的,我明白了。而不是 Roo::Excell,它需要是

sheet = Roo::Spreadsheet.open(self.file_url)

此外,我需要安装 gem 'roo-xls' gem 才能阅读电子表格。

在我的例子中,以下代码工作正常。 (假设您已经安装了所需的 gem)在我的例子中,我的根目录中有 .xls 文件

require 'roo'
require 'roo-xls'
class ExcelReader
  def read_file()
  sheet = Roo::Spreadsheet.open('Test.xls')
  sheet.each do |row|
  puts row
end
 end
  obj=ExcelReader.new()
  obj.read_file()
 end