利用FastCSV将网站数据导出到csv文件

Posted by HoLin on September 25th, 2008 filed in Rails应用, Ruby应用

安装:

1
sudo gem install fastercsv

具体使用看Readme,下面介绍FastCSV在导出网站数据中的应用

主函数代码如下,在关键点已经给出注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def export_csv(showfieldname, showfield, records, &block)
  new_showfieldname = []
  showfieldname.each { |item|
    new_showfieldname <<  convert_gb(item) #需要转码到gb
  }
  csv_string = FasterCSV.generate do |csv|
    csv << new_showfieldname
    records.each do |record|
      arr = []
      showfield.each do |item|
        if item.index('.').blank?
          v = record[item]
        else
          #获取关联对象的值,比如lessons_user.lesson.name
          obj = record
          item.split('.').each {|m|  obj = obj.send(m)}
          v = obj
        end
        v = v.strftime("%Y-%m-%d %H:%M:%S") if item == "created_at" #格式化时间
        v = block.call item, v if block_given? #将key, value传给block,将返回结果作为新的value
        arr.push(convert_gb(v))
      end
      csv << arr
      # #csv &lt; 'text/csv; charset=gb2312; header=present',
  :filename => "output#{DateTime.now().strftime('%Y%m%d%H%M')}.csv")
end
 
 
#具体使用:
showfield = ['lessons_user.lesson.name', 'lessons_user.user.icard', 'lessons_user.user.profile.name', 'lessons_user.user.email', 'lessons_user.user.profile.style', 'passed', 'certificated', 'lessons_user.created_at', 'updated_at']
showfieldname = ['课程', '身份证', '姓名', '邮箱', '类别', '是否通过', '是否发证', '报名时间', '考试结束时间']
 
export(showfieldname, showfield, @scores)
 
def export(showfieldname, showfield, recorders)
  export_csv(showfieldname, showfield, recorders) { |k, v|
    if k == 'passed'
      v ? '已通过' : '未通过'
    elsif k == 'certificated'
      v ? '已发证' : '未发证'
    elsif k == 'lessons_user.created_at'
      v.to_ss
    elsif k == 'updated_at'
      v.to_ss
    else
      v
    end
  }
end

简单总结一下,业务部门可能用得更多的是windows系统,所以导出文件编码最好是gb格式的,需将数据转码。在类似“性别”之类的数据,数据库里存的可能是简单的boolean类型,导出前需要处理一下,主函数通过接受block来处理这种情况。导出的数据除了当前表,可能还需要关联表的数据,通过对字段解析,访问到了对应关联表的数据。

Related posts:

  1. Rails 导入导出CSV数据时的中文编码问题 在Rails中导入导出数据到 Excel 时,使用CSV格式较多,但在转换各种编码时,经常出现个别字符的乱码问题,主要原因在于 utf8, gb2321, gb18030, gbk 的字符集所包含的中文字不一样,在实践中,总结出来如下的办法来做导入导出。由于在实际应用中,以 utf8 为主,这里也以...

Related posts brought to you by Yet Another Related Posts Plugin.

Leave a Comment