RSpec.describe TalltyImportExport::Importable do before do class Test include TalltyImportExport::Importable class << self def model_headers [ { key: 'name', name: '名称' }, { key: 'code', name: '学号', convert: :handle_code }, { key: 'sub_code', name: '副学号', convert: :skip }, { key: 'meta1', name: 'meta字段1', json: :meta }, { key: 'meta2', name: 'meta字段2', json: :meta }, { key: 'sum', name: '累计值', convert: :handle_sum }, # 表格里 name 为 累加值 ] end end class Import def import_record line_info, associations associations << line_info end def handle_code code, processing_line_info, raw_line_info "#{code}_#{raw_line_info[:sub_code]}" end def handle_sum num, processing_line_info, raw_line_info context.last_line_info ? context.last_line_info['sum'] + num : num end end end end it 'import file directly' do # 名称 学号 副学号 meta字段1 meta字段2 累加值 # 1 20070101 1 meta1 metaA 1 # 2 20070102 2 meta2 metaB 2 # 3 20070103 3 meta3 metaC 3 # 4 20070104 4 meta4 metaD 4 # 5 20070105 5 meta5 metaE 5 @result = [] Test.import_xlsx('./spec/test1.xlsx', @result, headers: [ { key: 'name', name: '名称' }, { key: 'code', name: '学号' }, { key: 'sub_code', name: '副学号' }, { key: 'meta1', name: 'meta字段1', json: :meta }, { key: 'meta2', name: 'meta字段2', json: :meta }, { key: 'sum', name: '累加值' }, ] ) expect(@result).to eq([ {"name"=>1, "code"=>"20070101_1", "sub_code"=>nil, "meta"=>{"meta1"=>"meta1", "meta2"=>"metaA" }, "sum" => 1 }, {"name"=>2, "code"=>"20070102_2", "sub_code"=>nil, "meta"=>{"meta1"=>"meta2", "meta2"=>"metaB" }, "sum" => 3 }, {"name"=>3, "code"=>"20070103_3", "sub_code"=>nil, "meta"=>{"meta1"=>"meta3", "meta2"=>"metaC" }, "sum" => 6 }, {"name"=>4, "code"=>"20070104_4", "sub_code"=>nil, "meta"=>{"meta1"=>"meta4", "meta2"=>"metaD" }, "sum" => 10 }, {"name"=>5, "code"=>"20070105_5", "sub_code"=>nil, "meta"=>{"meta1"=>"meta5", "meta2"=>"metaE" }, "sum" => 15 }, ]) end it 'import excel object' do # 名称 学号 副学号 meta字段1 meta字段2 累加值 # 1 20070101 1 meta1 metaA 1 # 2 20070102 2 meta2 metaB 2 # 3 20070103 3 meta3 metaC 3 # 4 20070104 4 meta4 metaD 4 # 5 20070105 5 meta5 metaE 5 @result = [] @excel = TalltyImportExport::Excel.new @excel.load('./spec/test1.xlsx') Test.import_xlsx(@excel, @result, headers: [ { key: 'name', name: '名称' }, { key: 'code', name: '学号' }, { key: 'sub_code', name: '副学号' }, { key: 'meta1', name: 'meta字段1', json: :meta }, { key: 'meta2', name: 'meta字段2', json: :meta }, { key: 'sum', name: '累加值' }, ] ) expect(@result).to eq([ {"name"=>1, "code"=>"20070101_1", "sub_code"=>nil, "meta"=>{"meta1"=>"meta1", "meta2"=>"metaA" }, "sum" => 1 }, {"name"=>2, "code"=>"20070102_2", "sub_code"=>nil, "meta"=>{"meta1"=>"meta2", "meta2"=>"metaB" }, "sum" => 3 }, {"name"=>3, "code"=>"20070103_3", "sub_code"=>nil, "meta"=>{"meta1"=>"meta3", "meta2"=>"metaC" }, "sum" => 6 }, {"name"=>4, "code"=>"20070104_4", "sub_code"=>nil, "meta"=>{"meta1"=>"meta4", "meta2"=>"metaD" }, "sum" => 10 }, {"name"=>5, "code"=>"20070105_5", "sub_code"=>nil, "meta"=>{"meta1"=>"meta5", "meta2"=>"metaE" }, "sum" => 15 }, ]) end it 'import data' do @result = [] @data = [ { '名称' => 1, '学号' => '20070101', '副学号' => 1, 'meta字段1' => 'meta1', 'meta字段2' => 'metaA', '累加值' => 1 }, { '名称' => 2, '学号' => '20070102', '副学号' => 2, 'meta字段1' => 'meta2', 'meta字段2' => 'metaB', '累加值' => 2 }, { '名称' => 3, '学号' => '20070103', '副学号' => 3, 'meta字段1' => 'meta3', 'meta字段2' => 'metaC', '累加值' => 3 }, { '名称' => 4, '学号' => '20070104', '副学号' => 4, 'meta字段1' => 'meta4', 'meta字段2' => 'metaD', '累加值' => 4 }, { '名称' => 5, '学号' => '20070105', '副学号' => 5, 'meta字段1' => 'meta5', 'meta字段2' => 'metaE', '累加值' => 5 }, ] Test.import_data(@data, @result) expect(@result).to eq([ {"name"=>1, "code"=>"20070101_1", "sub_code"=>nil, "meta"=>{"meta1"=>"meta1", "meta2"=>"metaA" }}, {"name"=>2, "code"=>"20070102_2", "sub_code"=>nil, "meta"=>{"meta1"=>"meta2", "meta2"=>"metaB" }}, {"name"=>3, "code"=>"20070103_3", "sub_code"=>nil, "meta"=>{"meta1"=>"meta3", "meta2"=>"metaC" }}, {"name"=>4, "code"=>"20070104_4", "sub_code"=>nil, "meta"=>{"meta1"=>"meta4", "meta2"=>"metaD" }}, {"name"=>5, "code"=>"20070105_5", "sub_code"=>nil, "meta"=>{"meta1"=>"meta5", "meta2"=>"metaE" }}, ]) end end