Railsで使えるGem RubyOnRailsで帳票印刷

Rubyでdocxをいろいろ分析してみた

投稿日:

 

解凍~minizip

docxの正体はxmlファイル群をzipアーカイブしたもの.

まずはunzipをインストールして、これをrubyにラッパーしたライブラリminizipを使う

minizipの使い方はこんな感じで

解凍後のツリー構造は下のような感じ

基本的には[Contents_Type].xmlで使うコンテンツのタイプを指定して、_relファイルでファイル間の関連性を指定したりするとかあるらしいんだけど、本文はdocument.xmlに入ってるのでとりあえずはここだけ見ればいい.

ファイルを開く~File.open

rubyでファイルを開くのは標準のFileを使う

こんな感じで

出力結果はこんな感じ

document.xmlは2行のxmlファイルで1行目はxml宣言だけだからいらない.

全ファイルを解凍せずにzip内の必要なファイルだけを開く~zipruby

もっと高度なことができるziprubyというgemを使う

bitbucket.org/winebarrel/zip-ruby/wiki/Home

ファイルの保存は次のような感じで

 

 

置換~gsub

簡単に%= @hello %の部分を適当に置き換えてみる

出力結果

 

あとはこれをzipで固めれば

 

うん、できるな

docxのxmlの仕組みは下記の本を参照しましたが、情報が古いのでうまくいかない部分もあります.

カスタムマークアップ機能は特許訴訟でマイクロソフトが負けて削除したみたい.

 

xmlの操作~nokogiri

*saxとdomに関して

www.atmarkit.co.jp/fxml/rensai/rexml10/rexml10.html

nokogiriを使う

xmlビューアーとしてIEが使えることに気づいた

これをみるとルートの子どもに<body>タグがあって、その子どもに<p>タグが3つと<sectPr>タグがあることがわかる

上の参考書によると

  • <p>タグはパラグラフを定義して、1つまたは複数のラン<r>で構成される.
  • ランは1つまたは複数のテキスト<t>を定義する.
  • テキストへ適用するプロパティが異なれば別のランになる.
  • ちなみに、<sectPr>はセクションのプロパティタグで、これが出てくるとページ区切りになる.
  • セクションプロパティではページの幅や高さなどのレイアウトを定義できる.

ということらしい.

まずは全文を走査してテキストの値とその場所を確認したい.

テキストを取り出すのは次のような感じで

テキストの値の置換えはつぎのようにcontentで

クラスを作成

構想としては、

  1. URIを与えてインスタンス化するとそのURIのdocxから変数一覧を取得する.
  2. 変数一覧を問い合わせできる.
  3. 変数に任意のStringをいれられる.
  4. 任意の名前のdocxを作成できる.

うんできた

やること

  • 変数の仕様決定
    実はerbに任せようとしたら、まれに>とかが&gtとかになってしまうということが判明した
    よく考えたら、変数とindex(テキストの場所)の関係は1対多だった.
    ランの存在が鬼門すぎる.たまに文の途中でも区切られてしまう.特に日本語の文に変数を組み込んだとき.テンプレートを記述するときは、同じフォントになるように気を使わないといけない.
  • テーブルに対応
    ほかにもヘッダー/フッターとかも
  • xlsxに対応
    参考書によるとxlsxとpptxも同じ調子で操作できそうな予感
  • パーシャルテンプレート

-Railsで使えるGem, RubyOnRailsで帳票印刷
-,

執筆者:

関連記事

Rails3.2でJasmineをつかってCoffeeScriptをテスト~jasminerice

    #261 Testing JavaScript with Jasmine (revised)   addyosmani.github.com/backbone-f

Rails4.0でもajaxなデータテーブルを使う~ajax-datatables

Railsでajaxなテーブルを使う~datatables Rails4でのJSONテンプレート~jbuilder+rabl+ruby 目次1 index.json.jbuilder2 tasks.j …

no image

Railsで動画ファイルを管理する~CarrierWave Flowplayer

  参考 Ruby on Rails 3.2でファイルアップロード〜CarrierWave & RMagick Rails3で動画配信を試用~flowplayer 環境 Ubuntu …

状況に応じてRailsのフォームの種類を変える

By: Heidi De Vries – CC BY 2.0 目次1 前提2 仕様の決定3 正規表現の変更4 メタプログラミング第一歩5 helper6 view7 できた8 できてない9 …

Rails3でECサイト構築8 都道府県の登録~spree

  都道府県の登録を忘れていた seedを追っていくとわかるのだけど、rake db:load_file[tablename.yml, dir]で登録できる サンプルは、spree_core …