NAME Catalyst::Action::Serialize::SimpleExcel - Serialize to Excel files SYNOPSIS Serializes tabular data to an Excel file. Not terribly configurable, but should suffice for simple purposes. In your REST Controller: package MyApp::Controller::REST; use parent 'Catalyst::Controller::REST'; use DBIx::Class::ResultClass::HashRefInflator (); use POSIX 'strftime'; __PACKAGE__->config->{map}{'application/vnd.ms-excel'} = 'SimpleExcel'; sub books : Local ActionClass('REST') {} sub books_GET { my ($self, $c) = @_; my $books_rs = $c->model('MyDB::Book')->search({}, { order_by => 'author,title' }); $books_rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); my @books = map { [ @{$_}{qw/author title/} ] } $books_rs->all; my $authors_rs = $c->model('MyDB::Author')->search({}, { order_by => 'last_name,middle_name,last_name' }); $authors_rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); my @authors = map { [ @{$_}{qw/first_name middle_name last_name/} ] } $authors_rs->all; my $entity = { sheets => [ { name => 'Books', header => ['Author', 'Title'], # will be bold rows => \@books, }, { name => 'Authors', header => ['First Name', 'Middle Name', 'Last Name'], rows => \@authors, }, ], # the part before .xls, which is automatically appended filename => 'myapp-books-'.strftime('%m-%d-%Y', localtime) }; $self->status_ok( $c, entity => $entity ); } In your javascript, to initiate a file download: // this uses jQuery function export_to_excel() { $('