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

執筆者:

関連記事

SASS/SCSS+COMPASS+zurui-sass-railsで角丸・グラデ・半透明・テキストシャドウ・ボックスシャドウ

By: Ole Houen – CC BY 2.0 sass-lang.com/ Sassの基礎 (全15回) ドットインストール ネストを覚えた人のためのSassの便利な使い方 comp …

FullCalendarのagendaViewでselectの場所がずれる問題

  By: Ben Piddington 前回 Rails3.2でGoogle Calendarライクなカレンダーを使う〜fullcalendar-rails   gemは最新の1 …

no image

RailsでRedisを使う例のメモ

最近よく見かけるようなのでメモ Redisって大量にメモリを積んでないとダメかと思ってたけど、思ったよりいろんな方面に用途がありそう(リンク先の情報はわたしは未検証です) Redisの基礎 (全14回 …

Rails5でコントローラーの記述を省略~inherited_resources

By: Simon Matzinger – CC BY 2.0 目次1 inherited_resources2 Gemfile3 使い方 inherited_resources inhe …

no image

railsでdocxを生成する動画

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