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

執筆者:

関連記事

no image

Ruby on Rails 3.2でファイルアップロード〜CarrierWave & RMagick

    CarrierWaveはRubyでファイルのアップロードを簡便にするGemです。 RMagickはImageMagickという画像ファイルを加工するソフトのラッパーです。C …

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

  前提 railsでdocxを生成する動画 docxを生成するアプリは変数を自動で読み込むけど、状況に応じてフォームの種類を変えたい. Railsでは変数に応じてフォームの種類を用意してい …

no image

railsでdocxを生成する動画

  知り合いに試しに使ってもらうのに動画を作成しました

no image

Rubyでローカルで使うgemをつくる~bundler

  目次1 bundlerのインストール2 bundle gem ファイル名3 gemspec4 lib5 パッケージ化6 インストール7 使い方 bundlerのインストール gemパッケ …

RailsでECサイト構築4 確認メールを送る~spree

  spreeでは注文したときと発送したときにメールを送信できるように設定できるので、やってみた   目次1 設定2 翻訳 設定 管理画面から設定>メールシステムの設定から これで …