Writing to Spreadsheets in Ruby on Rails

Frequently developers need to write data to files like .csv and .xlsx. This article will discuss this common use case in Ruby on Rails applications.

We will be using spreadsheet gem and writing a rake task to export data to the file.

First, set up an application.

1
2
3
rails new spreadsheet_app
rails generate model Post title body author
rails db:create db:migrate

Now seed in some data.

1
2
3
4
# db/seeds.rb

Post.create(title: "Working with Spreadsheet", body: "This post will discuss how to write to spreadsheets.", author: "Mike")
Post.create(title: "Working with Devise", body: "This post will discuss how to authenticate with Devise.", author: "John")

In Gemfile add spreadsheet gem and run bundle install.

1
gem spreadsheet

As mentioned earlier, we will be exporting the data to the Excel sheet through a rake task, which we will generate now.

1
rails g task posts export 

In the lib/tasks/posts.rake, put the following code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace :posts do
 desc "This task will export posts to excel sheet"

 task export: :environment do
   book = Spreadsheet::Workbook.new
   sheet = book.create_worksheet :name => 'Posts'

   posts = Post.all

   posts.each_with_index do |post, i|
     sheet.row(i).push post.title, post.body, post.author
   end
   book.write 'Posts.xls'
 end

end

Now test the implementation. In your terminal, run the following command:

1
rake posts:export

It should now create a file named Posts.xls and export the data successfully. Happy exporting!