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で帳票印刷
-,

執筆者:

関連記事

Rails4でフォーム要素を動的に追加したり削除したり〜nested_form

目次1 参考2 前提の環境3 Gemfile4 View5 Controller6 できた7 パーシャル化8 フォームを追加する場所を指定する9 一対一の場合10 そのほか11 番外編: 1つのモデル …

Rails5でtextareaをコードエディタにする〜Ace Editor

By: Mike Mozart – CC BY 2.0 目次1 Ace Editor2 Gemfile3 application.js4 View5 coffeescript6 できた A …

no image

Rails3.2.8でPostgreSQLを使う(開発環境)〜pg gem

環境 Ubuntu server12.04にPostgreSQLをインストールする 参考 #342 Migrating to PostgreSQL @railscasts 目次1 準備2 データベース …

no image

Rails3.2でOpenDocumentText(.odt)を作成~serenity

  これも途中経過デス   odtはOpenOffice.orgのwriterなんかの保存形式 serenityはerbライクなodtテンプレートから変数を利用して文書を作成してく …

Rails3.2でコードのお作法を指摘してもらう~Rails Best Practices

コードのお作法を自動でチェックしてくれるrails_best_practiceを導入した

あとは、Railsのルートで[crayon- …