最近因为业务需求接触到 CSV 文件导入导出,刚开始的时候零基础,遇到了一些小坑, 现在把自己的解决方案分享,帮助那些重复造轮子朋友可以更快的到达目的地
1、CSV 文件导入,首先创建一个 html 来获取文件 将 Form 数据类型指定为 multipart/form-data 否则文件不能传到后端
<form method="post" action="<%= csv_create_company_finances_path %>" enctype="multipart/form-data">
<input class="form-control" type="file" name="data_file" accept=".csv">
<button type="submit" class="btn btn-primary" style="width: 120px">提交</button>
</form>
2、定义一个方法来获取传过来的 CSV 文件 解析后的文件内容是单挑的数组,根据数据内容顺序自定义字段信息 第一次解析的时候,因为给的文件编码格式不是 UTF-8, 导致报各种错,请注意事例文件的编码格式
require 'csv'
def csv_create
csv_text = params[:data_file].tempfile
csv = CSV.parse(csv_text, :headers => true)
csv.each do |item|
exp = Example.new
exp.a = item[1]
exp.b = item[2]
exp.c = item[3]
exp.d = item[4]
exp.save!
end
end
3、讲数据导出为 CSV 文件存储 在 Model 创建一个方法
require 'csv'
def self.to_csv(examples)
Rails.logger.info '「我要开始导出数据了」'
CSV.generate do |csv|
csv << ['A','B','C','D'] #这是文件的headers
examples.each do |item|
csv << [item.a,item.b,item.c,item.d] #数据内容
end
end
end
4、新建一个文件路径方法,将查询出的数据导出
require 'csv'
def export_csv
@examples = Example.all
respond_to do |format|
format.csv { send_data Example.to_csv(@examples), filename:"Example.csv"}
end
end