我正在研究Rails项目,我正在尝试导入excel文件,但我有以下问题:
我的excel文件包含列标题,如下所示
|姓名|地址|总余额|余额
在我的模特中
姓名,地址,总数,余额
我想读取每列的每个值 我已经实现了以下代码:
def self.import(file)
allowed_attributes = ["name","address"]
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
client = find_by_id(row["id"]) || new
client.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k }
client.save!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when '.csv' then Roo::Csv.new(file.path, file_warning: :ignore)
when '.xls' then Roo::Excel.new(file.path, file_warning: :ignore)
when '.xlsx' then Roo::Excelx.new(file.path, file_warning: :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
但我的问题是它没有从excel中读取列标题 只有当我把它变成与allowd_attributes一样的时候!
我可以在excel文件中使用其他列名,还可以在模型中使用其他列名? 或忽略excel中的列标题?或以某种方式转换列标题,e.x“地址” - > “地址”,“总余额” - > “总” 等等..
抱歉我的英语不好。
答案 0 :(得分:2)
好的,我这样做了,效果很好! 我只是指定每一栏!
def self.import(file)
spreadsheet = open_spreadsheet(file)
(2..spreadsheet.last_row).each do |i|
name = spreadsheet.cell(i,'A')
trading_name = spreadsheet.cell(i,'B')
address = spreadsheet.cell(i,'D')
@user = User.create(:name => name, :address =>address)
end
end