`
xu_ch
  • 浏览: 22375 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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 能不能搞定?
有知道的还请指教,这里先谢了。
9
2
分享到:
评论
9 楼 天马-行空 2017-03-06  
比文档写的好,条例很清晰,一看就懂。
8 楼 sdoliwei11 2013-11-08  
不错不错,赞一个
7 楼 angjunwen 2013-09-26  
导出的csv文件中的中文是乱码,如何解决的?
6 楼 vikki 2013-07-26  
vikki 写道
为什么我的能在本地生成文件,但是直接使用StringIO生成并下载,后台log

Rendered text template (0.0ms)
Sent data all_user_20130726093416.xls (0.8ms)
Completed 200 OK in 26ms (Views: 0.7ms | ActiveRecord: 1.8ms)


但是浏览器没有任何下载或另存为的提示信息。


检查本地代码发现,原来当初考虑到请求会产生页面刷新或跳转,所以使用了一个remote: :true 进行的ajax 请求,这样就下不了东西了, 把 remote 参数去掉,就可以下载了。
5 楼 vikki 2013-07-26  
为什么我的能在本地生成文件,但是直接使用StringIO生成并下载,后台log

Rendered text template (0.0ms)
Sent data all_user_20130726093416.xls (0.8ms)
Completed 200 OK in 26ms (Views: 0.7ms | ActiveRecord: 1.8ms)


但是浏览器没有任何下载或另存为的提示信息。
4 楼 991142 2012-02-16  
yangzhihuan 写道
我上次做了一个输入excel的功能,直接修改响应头,把页面输出(页面就是一个table),简直快速,专门用于偷懒.

还请详情说说~
3 楼 yangzhihuan 2010-01-30  
我上次做了一个输入excel的功能,直接修改响应头,把页面输出(页面就是一个table),简直快速,专门用于偷懒.
2 楼 xu_ch 2010-01-28  
adidaskebi123 写道
呵呵,我这就没写routes文件!我用了一个插件!不过要是数据量大了并不适用。QQ留给你了,有空一起看看!

我使用这个插件 做过一个rake 任务:调用的 open 操作,读取了7500多行记录,然后保存到数据库,速度不是特别快,但也可以。
有更好的方法,还请指教。
1 楼 adidaskebi123 2010-01-28  
呵呵,我这就没写routes文件!我用了一个插件!不过要是数据量大了并不适用。QQ留给你了,有空一起看看!

相关推荐

    to_xls-rails:将Rails ActiveRecord或Mongid数据导出到Excel文件

    这个简单的插件使您能够调用to_xls到Rails的数组集合。 数组元素支持对象:ActiveRecord,Mongid,哈希。 在您的Gemfile中: gem 'to_xls-rails' # Last officially released gem # gem "to_xls-rails", :git =&gt; ...

    xport:将Rails模型导出到XLSX,CSV

    Xport 表格数据导出到Excel,CSV等产品特点- column :name, group: :project 列宽- column :name, width: 10 列标题标题- column :name, header: "Full name" 列类型- column :name, type: :string 列样式- column :...

    poi导出excel需要的jar

    2. **poi**: 包含了处理HSSF(旧版的Excel .xls格式)和XSSF(新的Excel .xlsx格式)的API。 3. **poi-ooxml**: 提供了处理OOXML文档的类,支持.xlsx格式。 4. **poi-ooxml-lite**: 如果只处理.xlsx文件,可以使用轻...

    to_csv-rails:导出到 csv 文件

    导出为CSV on Rails的 这个简单的插件使您能够调用 to_csv 到一系列活动记录。 除了 :include 之外,构建器选项与 to_json / to_xml 相同。入门 在您的 Gemfile 中: gem 'to_csv-rails' # Last officially released...

    ruby导出csv文件

    在Rails框架中,你可能会在`views`目录下创建一个视图文件来处理CSV导出逻辑,而在`controllers`目录下的控制器文件中处理请求和响应。 在`views`文件夹中,你可以创建一个`.rhtml`或`.erb`文件,如`export.csv.erb...

    rails-exporter-源码.rar

    4. 查看 views 文件,理解数据如何被格式化为特定导出格式。 5. 深入 lib 文件,学习自定义的导出逻辑和文件处理函数。 通过以上分析,我们可以掌握 Rails Exporter 的核心功能和实现方式,这对于提升我们自己的 ...

    to_xls:这个 Rails 插件是导出到 Excel 的最简单方法。 它使您能够调用 to_xls 到一系列活动记录。 构建器选项与 to_json to_xml 相同,除了

    这个 Rails 插件是导出到 Excel 的最简单方法。 它使您能够调用 to_xls 到一系列活动记录(数组)。 除了 :include 之外,构建器选项与 to_json / to_xml 相同。 注意:IMO 我会使用 to_csv 插件; 它更兼容。 ( )...

    Ruby-此Gem将使您的AR模型能够使用PostgreSQLCOPY命令以CSV格式导入导出数据

    通过这个Gem,开发者可以更方便地进行大量数据的导入和导出,这对于数据分析、备份或迁移等场景非常有用。 在Ruby开发中,使用这样的Gem可以极大地提高效率,因为COPY命令比普通的SQL INSERT语句更快,特别是处理...

    rails3 api chm格式

    标签“源码”可能意味着这个CHM文件包含有关Rails 3框架源代码的解释和示例,这对于深入理解Rails的工作原理以及如何自定义和扩展框架非常有用。而“工具”标签可能表示这个文档可以作为开发者日常工作中的一种实用...

    Rails项目源代码

    这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何利用Rails的强大功能来创建一个允许用户上传、分享和浏览图片的应用。 1. **Rails框架基础**: Rails的核心理念是DRY(Don't...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    rails2-sample

    在这一部分,作者将引导读者如何安装和配置Ruby on Rails环境,包括Ruby语言本身、Rails框架以及相关的工具和库。这里还会涉及如何创建第一个Rails项目,以及如何运行服务器以查看项目。对于新手来说,这一步骤是至...

    [Rails] Crafting Rails Applications (英文版)

    ☆ 资源说明:☆ [Pragmatic Bookshelf] Crafting Rails Applications (英文版) [Pragmatic Bookshelf] Crafting Rails Applications Expert Practices for Everyday Rails Development (E-...[图书格式] PDF 格式

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **定义**:验证是在保存数据之前对模型进行检查的过程,确保数据符合预期的格式和约束条件。 - **类型**:Rails提供了多种内置的验证类型,如`presence`、`uniqueness`、`format`等。 #### 三、关联 - **定义**...

    rails api(文档)

    2. **更好的性能**:由于API通常处理的是JSON数据而非HTML,所以Rails API优化了对JSON格式的支持,降低了内存占用和处理时间。 3. **路由优化**:Rails API的路由系统更侧重于资源操作,简化了API路由的定义,方便...

    Rails

    Rails由David Heinemeier Hansson在2004年创建,其设计理念是强调代码的简洁性、DRY(Don't Repeat Yourself)原则和开发效率。 Rails的核心特性包括: 1. **约定优于配置**(Convention Over Configuration):...

    rails本地安装包完整版

    1. **activesupport-2.1.0.gem**:ActiveSupport是Rails的一个重要库,提供了许多实用的工具和方法,如时间区处理、字符串格式化、数组和哈希操作等。它也包含了一些核心的Ruby扩展,帮助开发者编写更简洁、更具表达...

    rails指南 中文版

    Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,强调“约定优于配置”(Conventions over Configuration)和“Don't Repeat Yourself”(DRY,不要...

    rails2.3.2

    这个压缩包很可能包含了 Rails 框架的源代码和其他相关文件,方便开发者进行下载、学习和使用。 标签 "rails ruby" 明确指出这个话题涉及到 Ruby 语言和 Rails 框架。Ruby 是一种面向对象的、动态类型的编程语言,...

Global site tag (gtag.js) - Google Analytics