最近刚刚做完报表的统计,有部分是导出到excel中,有xls格式和csv格式的,刚好看到有人在问答频道问有关问题,在此作一下总结:
1. 导出 .xls 文件 并下载到客户端:
这里使用 spreadsheet_on_rails 插件,安装两个gem就可以了
spreadsheet ,和它依赖的包 ruby-ole
sudo gem install spreadsheet
sudo gem install ruby-ole
*** LOCAL GEMS ***
spreadsheet (0.6.3.1)
ruby-ole (1.2.10)
并在配置文件中添加:
config.gem 'spreadsheet'
我以 user model 为例进行导出:
建议: 一个比较符合rails规范的做法是,请求格式为 xls,如 /users.xls
首先在 config/initializers/mime_types.rb 中添加
Mime::Type.register "text/excel", :xls
这样就可以在view 中可以使用 formatted_users_path 带格式请求了
view中:
<%= link_to "Excel", formatted_users_path(:format => 'xls')%>
请求到 index action,下面是关键的了
def index
@users = User.all
respond_to do |format|
format.xls {
send_data(xls_content_for(@users),
:type => "text/excel;charset=utf-8; header=present",
:filename => "Report_Users_#{Time.now.strftime("%Y%m%d")}.xls")
}
format.html
end
end
private
def xls_content_for(objs)
xls_report = StringIO.new
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet :name => "Users"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue
sheet1.row(0).concat %w{Username Email}
count_row = 1
objs.each do |obj|
sheet1[count_row,0]=obj.login
sheet1[count_row,1]=obj.email
count_row += 1
end
book.write xls_report
xls_report.string
end
这样就 ok 了,至于里面的样式看看文档己会改了。
2.导出 csv 格式的文件
先安装一个gem fastercsv :
sudo gem install fastercsv
# fastercsv (1.5.0)
添加配置:
config.gem 'fastercsv'
view中:
<%= link_to "CSV", formatted_users_path(:format => 'csv')%>
controller,respond_to 中继续添加:
format.csv {
send_data(csv_content_for(@users),
:type => "text/csv;charset=utf-8; header=present",
:filename => "Report_Users_#{Time.now.strftime("%Y%m%d")}.csv")
}
private
def csv_content_for(objs)
FasterCSV.generate do |csv|
csv << ["Username", "Email"]
objs.each do |record|
csv << [
record.login,
record.email
]
end
end
end
这样csv的也能导出了。
总得来说 功能都实现了,感觉这两个输出的效果差不多,不知一个spreadsheet gem 能不能搞定?
有知道的还请指教,这里先谢了。