Manchmal geht mit einem Entwickler einfach die Neugier durch. Da liest man auf LinkedIn einen Beitrag über einen automatisierten Export von Daten nach Excel mit Hilfe eines Python-Skripts. Und stellt sich die Frage, wie würde ich dieses Problem in Ruby, genauer in Ruby on Rails, lösen? Heute nachmittag hätte ich ein bisschen freie Zeit…
Es gibt natürlich auch in Ruby Bibliotheken, mit denen man Excel-Spreadsheets erzeugen kann. Ein sehr beliebtes Gem ist fast_excel. Damit hat man Zugriff auf Elemente von Excel wie Workbooks, Worksheets, Formatierungen, Formeln und so weiter als Ruby-Objekte:
require 'fast_excel'
creation_date = Date.current.to_s
workbook = FastExcel.open("export_#{creation_date}.xlsx", constant_memory: true)
worksheet = workbook.add_worksheet("Export #{creation_date}")
bold = workbook.bold_format
price = workbook.number_format('#,##0.00')
worksheet.set_column(1, 1, 20, price)
# table header
worksheet.append_row %w[Article Price], bold
# table rows
order_id = ...
order = Order.find(order_id)
num = order.articles.count
order.articles do |article|
price = '%.2f' % (article.price_in_cents/100).to_f
worksheet.append_row [article.name, price]
end
# sum up
worksheet.append_row []
sum_formula = FastExcel::Formular.new("SUM(B2:B#{num+1})")
worksheet.append_row ['Sum', sum_formula]
workbook.close
Dieser Code ist weitestgehend selbsterklärend. Denkbar ist beispielsweise, einen Job zu bauen, der auf diese Weise eine Excel-Datei erzeugt und die dann in einen Cloudspeicher lädt.
Direkter in Ruby on Rails integriert ist das Gem caxlsx_rails, das wiederum auf caxlsx basiert. Die beiden Gems waren früher als axlsx_rails beziehungsweise axlsx bekannt und werden mittlerweile von der Community (daher das zusätzliche ‘c’) weiterentwickelt.
caxlsx_rails bietet ein weiteres Format, das man im Controller verwendet. Neben format.html, format.json und so weiter hat man dann format.xlsx zur Verfügung:
class OrderController < ApplicationController
(...)
def export(order_id)
@articles = Order.find(order_id).articles
respond_to do |format|
format.xlsx
end
end
(...)
end
Dazu gibt es spezielle Views mit der Zungenbrecher-Endung .xlsx.axlsx, zum Beispiel export.xlsx.axlsx:
wb = xlsx_package.workbook
wb.add_worksheet(name: 'Order') do |sheet|
@articles.echo do |article|
price = '%.2f' % (article.price_in_cents/100).to_f
sheet.add_row [article.name, price]
end
end
Das Erstellen des eigentlichen Inhalts ist also ganz ähnlich wie bei fast_excel.
Sowohl fast_excel als auch dascaxlsx-Ökosystem bieten noch einiges mehr, aber vielleicht hat dieser kleine Artikel etwas neugierig gemacht. Und Neugierde ist für einen Entwickler nicht die schlechteste Eigenschaft. Bei der Recherche für diesen Blogbeitrag ist sogar noch etwas zusätzliches Wissen über LibreOffice Calc angefallen.