You can easily export an XML file into Excel.
There’s an introductory tutorial at the MSDN Blog: Office XML Formats and more complete information is available in the Office 2003 XML Reference Schemas (you’ll need a CHM viewer for your platform and a way to extract an MSI to make use of it though).
Here’s a quick example:
In your controller (replace “Record” with your model):
def export
headers['Content-Type'] = "application/vnd.ms-excel"
headers['Content-Disposition'] = 'attachment; filename="excel-export.xls"'
headers['Cache-Control'] = ''
@records = Record.find(:all)
end
The export.rxml view for this (will generate a simple table form any ActiveRecord object, again replace “Record” with your model):
xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
xml.Workbook({
'xmlns' => "urn:schemas-microsoft-com:office:spreadsheet",
'xmlns:o' => "urn:schemas-microsoft-com:office:office",
'xmlns:x' => "urn:schemas-microsoft-com:office:excel",
'xmlns:html' => "http://www.w3.org/TR/REC-html40",
'xmlns:ss' => "urn:schemas-microsoft-com:office:spreadsheet"
}) do
xml.Styles do
xml.Style 'ss:ID' => 'Default', 'ss:Name' => 'Normal' do
xml.Alignment 'ss:Vertical' => 'Bottom'
xml.Borders
xml.Font 'ss:FontName' => 'Verdana'
xml.Interior
xml.NumberFormat
xml.Protection
end
xml.Style 'ss:ID' => 's22' do
xml.NumberFormat 'ss:Format' => 'General Date'
end
end
xml.Worksheet 'ss:Name' => 'Blahblah' do
xml.Table do
# Header
xml.Row do
for column in Record.content_columns do
xml.Cell do
xml.Data column.human_name, 'ss:Type' => 'String'
end
end
end
# Rows
for record in @records
xml.Row do
for column in Record.content_columns do
xml.Cell do
xml.Data record.send(column.name), 'ss:Type' => 'String'
end
end
end
end
end
end
end
If you want more formatting etc, just use Excel to layout/design, save as Excel xml file and inspect the file with your favourite text or XML editor.
Setting the “Cache-Control” header to nil prevents the “Internet Explorer was not able to open this internet site” error.
It seems that the above method only work for Office 2003 , and for the version before that, we may use the Apache POI Ruby Bindings which is original written in Java. For more information, please check here
http://jakarta.apache.org/poi/poi-ruby.html
Example Excel generate by the above method is here
Also see rubyspreadsheet The functionality is quite basic, eg no charts, but it works.
Or just use CSVs (Ruby comes with a CSV library). Note that using the XML format has some advantages, even when you’re not generating formatted content, like support of UTF-8 and multiple worksheets.
Make sure you disable layout for your export method. _Note: This can also be accomplished with render :layout => false
class YourController < ApplicationController
layout "layouts/yourLayout" , :except => :export
def export
..
end
end
You could try Scio Excel library:
http://rolando.cl/media/ruby/scio_excel.rb
The rdoc is here:
http://rolando.cl/media/ruby/doc/index.html
It allows you to apply simple formatting and styling.
When writing xls-format for send_file you might want to use something like
ic = Iconv.new('latin1','utf-8')
worksheet.write(row_index, column_index, ic.iconv(your_text_from_db), your_text_format)
and importing file from form you will want to parse text-cells from xls with
worksheet.each(number_of_lines_to_skip) { |row|
text = row.at(column_index).to_s('utf-8')
}
Screencast on Practical way to export excel in Rails
Perhaps you want to figure out HowToImportFromExcel
category: Howto
You can easily export an XML file into Excel.
There’s an introductory tutorial at the MSDN Blog: Office XML Formats and more complete information is available in the Office 2003 XML Reference Schemas (you’ll need a CHM viewer for your platform and a way to extract an MSI to make use of it though).
Here’s a quick example:
In your controller (replace “Record” with your model):
def export
headers['Content-Type'] = "application/vnd.ms-excel"
headers['Content-Disposition'] = 'attachment; filename="excel-export.xls"'
headers['Cache-Control'] = ''
@records = Record.find(:all)
end
The export.rxml view for this (will generate a simple table form any ActiveRecord object, again replace “Record” with your model):
xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
xml.Workbook({
'xmlns' => "urn:schemas-microsoft-com:office:spreadsheet",
'xmlns:o' => "urn:schemas-microsoft-com:office:office",
'xmlns:x' => "urn:schemas-microsoft-com:office:excel",
'xmlns:html' => "http://www.w3.org/TR/REC-html40",
'xmlns:ss' => "urn:schemas-microsoft-com:office:spreadsheet"
}) do
xml.Styles do
xml.Style 'ss:ID' => 'Default', 'ss:Name' => 'Normal' do
xml.Alignment 'ss:Vertical' => 'Bottom'
xml.Borders
xml.Font 'ss:FontName' => 'Verdana'
xml.Interior
xml.NumberFormat
xml.Protection
end
xml.Style 'ss:ID' => 's22' do
xml.NumberFormat 'ss:Format' => 'General Date'
end
end
xml.Worksheet 'ss:Name' => 'Blahblah' do
xml.Table do
# Header
xml.Row do
for column in Record.content_columns do
xml.Cell do
xml.Data column.human_name, 'ss:Type' => 'String'
end
end
end
# Rows
for record in @records
xml.Row do
for column in Record.content_columns do
xml.Cell do
xml.Data record.send(column.name), 'ss:Type' => 'String'
end
end
end
end
end
end
end
If you want more formatting etc, just use Excel to layout/design, save as Excel xml file and inspect the file with your favourite text or XML editor.
Setting the “Cache-Control” header to nil prevents the “Internet Explorer was not able to open this internet site” error.
It seems that the above method only work for Office 2003 , and for the version before that, we may use the Apache POI Ruby Bindings which is original written in Java. For more information, please check here
http://jakarta.apache.org/poi/poi-ruby.html
Example Excel generate by the above method is here
Also see rubyspreadsheet The functionality is quite basic, eg no charts, but it works.
Or just use CSVs (Ruby comes with a CSV library). Note that using the XML format has some advantages, even when you’re not generating formatted content, like support of UTF-8 and multiple worksheets.
Make sure you disable layout for your export method. _Note: This can also be accomplished with render :layout => false
class YourController < ApplicationController
layout "layouts/yourLayout" , :except => :export
def export
..
end
end
You could try Scio Excel library:
http://rolando.cl/media/ruby/scio_excel.rb
The rdoc is here:
http://rolando.cl/media/ruby/doc/index.html
It allows you to apply simple formatting and styling.
When writing xls-format for send_file you might want to use something like
ic = Iconv.new('latin1','utf-8')
worksheet.write(row_index, column_index, ic.iconv(your_text_from_db), your_text_format)
and importing file from form you will want to parse text-cells from xls with
worksheet.each(number_of_lines_to_skip) { |row|
text = row.at(column_index).to_s('utf-8')
}
Screencast on Practical way to export excel in Rails
Perhaps you want to figure out HowToImportFromExcel
category: Howto