Thinreportsで帳票出力

仕事でRailsアプリに帳票出力(納品書とか請求書とか)機能を追加したのでメモ。

インストール

Gemfile
gem 'thinreports'

※この他に別途、ThinReports Editor(帳票レイアウトエディタ)が必要。

基本的な使い方(Rails関係無く)

先にThinReports Editorで帳票レイアウトを作成しておく。
styleはエディタでも指定しておける。

# coding: utf-8

require 'thinreports'

report = ThinReports::Report.new
# 帳票レイアウトの指定
report.use_layout 'hoge.tlf'

# ページの作成
report.start_new_page

# idがdateのテキストブロックに今日の日付を書き込む
report.page.item(:date).value(Time.now.strftime("%Y/%m/%d"))

# idがtotal_priceのテキストブロックに合計金額を書き込み、
# テキストの位置を右揃えにする
total = -1200
report.page.item(:total_price).value(total).style(:align, :left) # other :center/:right

# total_priceがマイナスの場合、文字をピンクにして太字にする
report.page.item(:text).style(:color, '#ff00ff').style(:bold, true) if total < 0

# PDFファイルの作成
report.generate_file('hoge.pdf')

一覧表

report = ThinReports::Report.new layout: 'hoge.tlf'

# 一覧表の設定?
# 一覧表のフッターに"終わり"を書き込む
report.layout.config.list(:list) do |c|
  c.use_stores row_count: 0

  c.events.on :footer_insert do |e| # ページフッターを設定する場合は:page_footer_insert
    e.section.item(:footer_message).value("終わり")
  end
end

# カレントページ番号を書き込む
report.event.on :page_create do |e|
  e.page.item(:current_page).value(e.page.no)
end

# 総ページ数を書き込む
report.event.on :generate do |e|
  page_count = e.report.page_count

  e.pages.each do |page|
    page.item(:total_page).value(page_count)
  end
end

report.start_new_page
# 一覧表の外のテキストブロックへの書き込み
report.page.item(:company).value("A商事")

# 一覧表への書き込み
details.each.do |detail|
  report.page.list(:list) do |list|
    list.store.row_count = 0 if list.overflow?
    list.store.row_count += 1
    list.add_row no: list.store.row_count, item: detail["item"], price: detail["price"]
  end
end

帳票ソリューション for Ruby and Rails | ThinReports
HowTo Ruby on Railsで利用 - ThinReports - Matsukei Open Source Center