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)
并在配置文件中添加:
Ruby代码
我以 user model 为例进行导出:
建议: 一个比较符合rails规范的做法是,请求格式为 xls,如 /users.xls
首先在 config/initializers/mime_types.rb 中添加
Ruby代码
- Mime::Type.register "text/excel", :xls
这样就可以在view 中可以使用 formatted_users_path 带格式请求了
view中:
Ruby代码
- <%= link_to "Excel", formatted_users_path(:format => 'xls')%>
请求到 index action,下面是关键的了
Ruby代码
- 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)
添加配置:
Ruby代码
view中:
Ruby代码
- <%= link_to "CSV", formatted_users_path(:format => 'csv')%>
controller,respond_to 中继续添加:
Ruby代码
- 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 能不能搞定?
有知道的还请指教,这里先谢了。
|