利用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 < '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:
- Rails 导入导出CSV数据时的中文编码问题 在Rails中导入导出数据到 Excel 时,使用CSV格式较多,但在转换各种编码时,经常出现个别字符的乱码问题,主要原因在于 utf8, gb2321, gb18030, gbk 的字符集所包含的中文字不一样,在实践中,总结出来如下的办法来做导入导出。由于在实际应用中,以 utf8 为主,这里也以...
Related posts brought to you by Yet Another Related Posts Plugin.
Leave a Comment