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でOpenDocumentText(.odt)を作成~serenity

Rails4でOpenDocumentText(.odt)を作成~serenity(未完) Rails3.2でOpenDocumentText(.odt)を作成~serenity theooさんのフォ …

RubyでWikiをはじめる〜gollum

目次1 環境2 インストール3  ハロー Gollum4 Powでつかう5 情報 環境 Ruby 2.1.0 Mac OSX Mavericks インストール 自分の環境ではこれをいれとかないとインス …

no image

Rails3でTwitter Bootstrapのサーチフォームを実装する~form_tag

目次1 git & gitolite2 仕組みを考える3 フィーチャの作成4 Viewの作成5 Controllerの作成6 Modelの作成7 テストが通らない!8 mergeして終わり g …

Rails4とBootstrapをつかった動的なナビゲーションとパンくずリスト〜acts_as_nested_set

By: anko.gaku_ula – CC BY 2.0 目次1 Railscast2 acts_as_nested_set3 ヘッダーnav4 サイドメニュー5 パンくずリスト6 でき …

docxをhtmlに変換する~ydocx

  github.com/zdavatz/ydocx プレビューの見た目を少しよくしたくて良さげなパーサーを試してみた 準備