rails 导出 excel 格式 xls 和 csv

最近刚刚做完报表的统计,有部分是导出到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 能不能搞定?
有知道的还请指教,这里先谢了。

你可能感兴趣的:(qq,Excel,Ruby,Rails)