Docurain Labo

Docurainサービス開発日記

pptxテンプレート機能をリリースしました

本日は、非常に大きな機能追加をお知らせします💪


pptxでテンプレートを記述して*1新たにpptxを生成したり、Excelのテンプレートにpptxテンプレートを埋め込んで、動的な図形を出力することが可能になりました。

Excelに埋め込む*2場合、pptxファイルをOLEで埋め込むと画像として最終結果へ出力されます。

しかも、画像はベクターグラフィック形式*3のため、ピクセルパーフェクトな図表として埋め込まれる仕様です。



帳票に複雑な図表を入れることは多々あると思いますが、Excel上でこれを実現するとなると、かなり面倒ですよね...

それが、Docurainでpptxを使えるようになったため、ずっと簡単に複雑な図表を動的に差し込むことができるようになりました!

早速試してみよう!

まずpptxを作成します。

今回は以下のようなpptxを考えてみます。

サンプル(pptx,xlsx,json)のダウンロードはこちらです

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-14.58.20.png

  • テストの点数を横棒チャートで表示する
  • 点数に応じて横棒の長さが可変
  • 横棒のテキストで点数も表示する(「80点」のように)
  • 科目数は可変、1科目~4科目の任意

シェイプの表示非表示を制御する

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-14.58.47.png

棒チャートの2つのシェイプ(科目名表示部と棒チャート)をグループ化し、 グループ化されたシェイプに対して代替テキストで

#if(!%{科目4名称}) #REMOVE #end

と指定します。すると、 科目4名称が無ければこのシェイプを削除する という意味になります。

シェイプの大きさを可変にする

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-14.58.55.png

棒チャートの長さを点数に応じて可変にするため、棒チャートの代替テキストに以下のように指定します。

#SCALE(`%{科目4点数} / 100.0`, 1)

%{科目1点数} / 100.0は、マクロ#SCALE(number, number)を用いてシェイプの長さを動的に変更する指定について、 第一引数であるx軸方向の縮尺を計算する指示です。ここでは式リテラルを用いて簡潔に表現しています。

なお、100ではなく100.0なのは、整数と整数の除算結果は整数になる仕様のため、50/100 = 0ではなく50/100.0 = 0.5としたいためです。

JSONの用意

データのJSONを用意します。以下の通りです。

{
  "科目1名称": "算数",
  "科目1点数": 95,
  "科目2名称": "国語",
  "科目2点数": 70,
  "科目3名称": "理科",
  "科目3点数": 85
}

以上でpptxとデータの準備ができましたので、まずはこのpptxをテンプレートとして出力してみます。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-14.41.41.png

データの通りシェイプや文字列が出力されましたね!

これでデータに基づいた動的な図を作成できました。

Excelテンプレートにpptxを埋め込む

次にExcelテンプレートを作成し、pptxを埋め込んで出力してみましょう。

[挿入]タブ -> [テキスト]グループ -> [オブジェクト] で↑で作成したpptxを選択し埋め込みます。 https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-15.08.26.png

以下のようなExcelとなります。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-14.43.44.png

このExcelテンプレート用にJSONを用意します。以下の通りです。

{
    "年度": 2,
    "学年": 5,
    "クラス": 1,
    "児童名": "佐藤 太郎",
    "科目1名称": "算数",
    "科目1点数": 95,
    "科目2名称": "国語",
    "科目2点数": 70,
    "科目3名称": "理科",
    "科目3点数": 85,
    "科目4名称": "社会",
    "科目4点数": 68
}

出力してみると...

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-14.45.02.png

問題なく出力されましたね。 図の変更時もpptxを編集して挿入し直すだけなので簡単にできます。

このPowerPointテンプレート・Excelへのpptx埋め込みにつきまして詳細はマニュアルもございますので、そちらも参照ください。(ログイン要)

今回作成したサンプルを、こちらのページからも登録不要で試してみることが出来ますので、気になったらぜひ試してみて下さい。

他にも様々な機能がありますので、アカウント無料登録してマニュアルを参照のうえお試しください。

*1:*.ppt形式は使用できません

*2:pptxを埋め込めるのはxlsxのみです

*3:具体的にはSVGです

わかりやすいテンプレートのために - 番号付き省略記法のご紹介

新年あけましておめでとうございます。 今年もDocurainは開発者の皆様をラクにする、便利な機能をどんどん開発していきます!

さて、本日は「番号付き省略記法」のご紹介です。

以前、省略記法を紹介しました。

今回はその省略記法で同時に複数のコンテキスト(省略記法の起点となるオブジェクト) を設定できるようにした番号付き省略記法を紹介します。

{
  "先月": {
    "売上": 1234,
    "来客数": 123
  },
  "今月": {
    "売上": 5678,
    "来客数": 456
  }
}

上記のようなJSONがある場合、テンプレート側で

#with(%{先月})

としてJSONの先月#WITH or #withの引数に指定すると、以下のように簡潔な書き方で参照できるようなります。

https://docurain.jp/wp/wp-content/uploads/2020/11/スクリーンショット-2020-11-05-11.14.34.png

これが省略記法です。

ただし、コンテキストを「先月」にすると、「今月」の売上は%{売上}では参照できないため

https://docurain.jp/wp/wp-content/uploads/2020/11/スクリーンショット-2020-11-05-11.15.35.png

のように書くことになります。

このようなケースで使えるのが番号付き省略記法です。

#with(%{先月})
#with2(%{今月})

とすることで

先月の売上は%{売上}、今月の売上は%2{売上}です

のように参照することが可能です。なお、番号は1から9まで使用できます。

https://docurain.jp/wp/wp-content/uploads/2020/11/スクリーンショット-2020-11-05-11.17.15.png

#with2で指定したオブジェクトは%2{XXXX}のように
#with3で指定したオブジェクトは%3{XXXX}のように
記述が可能になります。*1

このようにテンプレートを分かりやすく簡潔にするための機能も随時追加しております。

テンプレートは最大限シンプルにしていきましょう!

他にも様々な機能がありますので、ぜひアカウント無料登録してマニュアルを参照のうえ、お試しください。

*1:番号は1から9まで指定可能です。0は無指定と同義です。すなわち#with0(...)と#with(...)は同じです。

令和の時代は帳票も絵文字で圧倒的成長☝😉✨✨✨

注:この記事は本来、昨年前半に公開予定でしたが、管理上の都合で公開が遅れました。(忘れていたとも言う)

要約

  • 令和元号に対応しています
  • サロゲートペアに対応しています

どちらも4月の段階では対応していましたが、諸事情あって(主に筆者の遅筆により)報告が遅れてしまいました…。

新元号

PDF出力の場合、Excelの書式設定で和暦を設定すると、2019年5月1日以降は「令和」の元号で表示されます。Excel出力の場合はクライアント側にインストールされているExcelの環境に依存しますが、アップデートが適用されていればすでに対応済みになっているはずです。

forest.watch.impress.co.jp

サロゲートペア対応

Docurainでは当初、サロゲートペアには対応しておりませんでしたが、今は完全対応しています。サロゲートペアで表現されている日本語文字としては、JIS第3・第4水準の漢字の一部が該当しまが、これらはすべてDocurainから出力可能であることを確認済みです。

www13.plala.or.jp

www13.plala.or.jp

JIS第3・第4水準の漢字は人名や一部住所で用いられておりますが、Docurainであればそれらを含む帳票も文字化けやエラーを発生させることなく出力可能です。

そしてサロゲートペアに対応したということは…。絵文字も表示できるということです!今回は試しに適当な帳票として報告書(日報)を作成して新しい機能を試してみます。

作成したテンプレート

いきなりですが完成した帳票がこれです。

f:id:withpop:20190528140344p:plain

どうってことない帳票です。このくらいの帳票であれば、頑張れば10分かそこらで作成できると思います。右下にはよくあるような承認欄を設けてみました。テキスト(名字など)を入力する想定ですが、Docurainでは画像も差し込むことができるので印影を挿入することも可能です。

使用するデータ

データは以下のような感じです。とりあえず絵文字をふんだんに使ってみました。

{
    "date": "2019-05-27",
    "reporter": "超票 太郎",
    "division": "営業2課",
    "summary": "いっけなーい 🔪殺意殺意 💦私、帳票開発エンジニア😘入り組んだ罫線を見ると正気を保てなくなるの✨\nでもある日、「ここに備考欄追加してよ、すぐできるでしょ?」とか言われてもう大変 😢 \n簡単にできると思ってるならまずは自分でやってみなよ 👆💕 \n\n次回「やっぱり元に戻しておいてくれる?」お楽しみに❤️",
    "detail": [
        {"time": "2019-05-27T09:00", "description": "な、なに?😧"},
        {"time": "2019-05-27T10:00", "description": "「帳票開発は大変」だと?😨"},
        {"time": "2019-05-27T11:30", "description": "ふ、ふざけるな✊😡 💢💢"},
        {"time": "2019-05-27T14:00", "description": "Docurainなら日本人好みの罫線の多い帳票もExcelで簡単に作成できます✋😤🙅"},
        {"time": "2019-05-27T16:00", "description": "「面倒くさい帳票開発をサクっと済ませる」で、“圧倒的成長\"✋😤😤😤"},
        {"time": "2019-05-27T18:00", "description": "だれもやりたくない作業から開放させて楽しいビジネスに集中させてくれるサービスに圧倒的感謝☝😉✨✨✨"}
    ],

    "comment": "太郎ちゃん、お疲れ様✨✨✨❤\nブチョーはお昼ご飯を食べに来てるョ😘😘\n帳票開発は大変😨😨だけど太郎チャンはしっかり仕事してる📃からボクも鼻が高いよ😚😚😚\nこれからもがんばってね☝😉✨✨✨",

    "tanto": "😆",
    "kakaricho": "😉",
    "kacho": "😍",
    "bucho": "😨"
}

日時も令和の日付を指定してみました。

出力結果

f:id:withpop:20190528151506p:plain

ちゃんと出力されていますね。ただし、絵文字は独自のグリフになっております。ここは諦めてください。

セルの結合を簡単に行えるようにしました

リスト・一覧形式の帳票では以下のように分類ごとにセルを結合・マージさせたいことがあります。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/11/2160.png

その際にDocurainでは簡単に分類ごとの枠(セル)を結合することが可能です。

#MERGE_CELL([キー])#MC([キー])を使用します。
#MC#MERGE_CELLのエイリアスです)
引数は、結合するセルのグループを指定するための一意のキーです。

早速試してみます

サンプルのテンプレートとデータ(JSON)です。

ダウンロード

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/11/スクリーンショット-2020-11-04-13.24.23.png

[
  {
    "name": "食料品",
    "items": [
      {
        "name": "肉類",
        "items": [
          { "name": "輸入牛肉", "amount": 1 },
          { "name": "和牛", "amount": 2 }
        ]
      },
      {
        "name": "肉類",
        "items": [
          { "name": "ブロイラー", "amount": 1 },
          { "name": "地鶏", "amount": 2 }
        ]
      },
      ..中略..
    ]
  },
  ..中略..
  {
    "name": "雑貨",
    "items": [
      {
        "name": "電池",
        "items": [
          { "name": "単1", "amount": 1 },
          { "name": "単2", "amount": 2 },
          { "name": "単3", "amount": 3 }
        ]
      }
    ]
  }
]

出力結果は以下の通りです。
同じ分類名の場合に該当のエリア(セル)がマージされていますね。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/11/スクリーンショット-2020-11-04-11.44.37.png

また以下のような書き方も可能です。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/11/スクリーンショット-2020-11-04-13.33.10.png

このように引数無しの場合、セルの値そのものが引数として扱われます。
セルに出力させたい値とキーが同じ場合はこちらの書き方の方が簡潔で分かりやすいですね。 出力結果は↑と同様じです。

大項目は異なるが中項目は同一の場合

このJSONのように大項目は異なるが中項目は同一の場合もあります。

JSONダウンロード

[
  {
    "name": "",
    "items": [
      {
        "name": "A1",
        ..中略..
      },
    ]
  },
  {
    "name": "",
    "items": [
      {
        "name": "A1",
        ..中略..
      }
    ]
  }
]

先ほどと同じテンプレートで出力するとこのようになります。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/11/スクリーンショット-2020-11-04-12.59.01.png

大項目が異なる場合に中項目が同じでも枠を分割させたい場合は、
中項目の#MERGE_CELL or #MCの引数に大項目の値も含めます。
例): #MERGE_CELL(`$catL.name+$catM.name`) $catM.name

修正版テンプレートダウンロード

これにより以下のような出力結果となります。
中項目が同じでも枠が分割されてますね。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/11/スクリーンショット-2020-11-04-13.05.58.png

分類ごとに枠をマージさせるような帳票出力が必要な場合は、 今回作成したサンプル帳票を、こちらのページからも登録不要で試してみることが出来ますので、気になったらぜひ試してみて下さい。

他にも様々な機能がありますので、アカウント無料登録してマニュアルを参照のうえお試しください。

わかりやすいテンプレートのために - IF / IFS / SWITCHのご紹介

今回は条件分岐がシンプルに書けるようになったIF / IFS / SWITCHをご紹介します。

従来の条件分岐

従来はセル内で条件分岐をさせて値を出力する場合に

#if($cond) $a #end
#if($cond) $a #else $b #end
#if($cond1) $a #elseif($cond2) $b #elseif($cond3) $c #else $d #end

のように書かなければならず、少し面倒でした。

プログラマの美徳は怠惰。というわけで、より簡潔な表現のためにExcelの関数(IF / IFS / SWITCH)とほぼ同等の記述を可能にしました。 それが #IF / #IFS / #SWITCH マクロです。

#IF / #IFS / #SWITCH

上記の通り、Excelの関数(IF / IFS / SWITCH)と類似の記法・動作になっています。

概要は次の通りです。

#IF

従来の書き方(#if) #IF
#if($cond)

#end
#IF($cond, 'A')
#if($cond)

#else

#end
#IF($cond, 'A', 'B')

#IFS

従来の書き方(#if) #IFS
#if($cond1)

#elseif($cond2)

#elseif($cond3)

#end
#IFS([$cond1, 'A', $cond2, 'B', $cond3, 'C'])
#if($cond1)

#elseif($cond2)

#elseif($cond3)

#else

#end
#IFS([$cond1, 'A', $cond2, 'B', $cond3, 'C'], 'D')

#SWITCH

従来の書き方(#if) #SWITCH
#if($val == 1)

#elseif($val == 2)

#elseif($val == 3)

#else

#end
#SWITCH($val, [1, 'A', 2, 'B', 3, 'C'], 'D')

詳細はDocurainのマニュアル 帳票作成マニュアル(条件分岐支援) をご参照ください。

実際に使うとこんな感じです。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/09/スクリーンショット-2020-09-09-12.41.02.png

このようにセル内がスッキリして、テンプレートが読みやすくなりました。

帳票はただでさえ複雑な物が多いですし...

テンプレートは最大限単純にしておきたいものです!

他にも様々な機能がありますので、ぜひアカウント無料登録してマニュアルを参照しお試しください。

わかりやすいテンプレートのために - 式リテラルのご紹介

Docurainのテンプレート

DocurainではExcelテンプレートに差し込みたいデータの位置をプレースホルダーとして記述します。

また、出力する帳票の行を動的に増やす、特定の条件のときだけ表示する、などの動的な部分は組み込みのマクロ命令により実現します。 このマクロ命令はVelocityに準拠しています。

式リテラル

今回ご紹介する式リテラルはこのVelocityの制約を突破するために追加されたDocurain独自の機能です。 Velocityの制約とは、いわゆる「式」を使える箇所が限られている点です。

通常、式を指定できるのは

#if($a < 0) ... #end
#set($b = $a + 1)

のような箇所だけです。つまり、

$a 足す 1 は $a + 1 です。
#set($list = [$a, $a + 1, $a + 2])

のような記述ができず、

#set($plus1 = $a + 1)
#set($plus2 = $a + 2)

$a 足す 1 は $plus1 です。
#set($list = [$a, $plus1, $plus2])

のように回りくどい書き方になります。なかなかキツいですねこれは。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/08/スクリーンショット-2020-08-31-14.27.10.png

エンジニアは怠惰であるべき。怠けるために全力を出した結果、生み出されたのが「式リテラル」です。

使用例

式リテラルは、バッククオート ` で囲んだ文字列がそのまま値として評価されます。*1

↑のテンプレートを式リテラルを使用することにより簡潔にすることが可能です。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/08/スクリーンショット-2020-08-31-14.41.40.png

#set($plus1 = %{num} + 1)
%{num} 足す 1 は $plus1 です。
%{num} 足す 1 は `%{num} + 1` です。
#set($b = %{a} + 1)
#set($c = %{a} + 2)
#set($list = [%{a}, $b, $c])
#set($list = [%{a}, `%{a} + 1`, `%{a} + 2`])

のように記述できるようになりました。

スッキリしてわかりやすくなりましたね! Javascriptのテンプレートリテラルに似せたデザインにしたので、違和感も少ないかと思います。

他にも様々な機能がありますので、ぜひアカウント無料登録してマニュアルを参照しお試しください。

*1:現在のところバッククオートのエスケープはできません。すなわち、バッククオートを含む式リテラルは使用できません。

DocuSign対抗! Docurainも画像、回せます

このようなツイートを目にしました。

そこでDocuSignに対抗??して、Docurainでも画像回転できるようにしました!
(DocuSign... 名前も似てますし、やるしかないですよね...!!)

通常の画像出力

通常の画像出力です。
シェイプに#IMAGE($e.stamp)のように記載することで渡された画像データを出力します。

画像回転の指定方法

上記の画像出力で#IMAGE($e.stamp, 'rotate=[角度]')のようにすると、画像を指定した角度に回転させることができます。
-360°から360°の範囲で指定可能で、それぞれ以下の意味を持ちます。

正の角度 元画像のサイズのままで回転される。
よって、長方形の場合は見切れることがある。
負の角度 元画像のサイズを超えないように自動縮小される。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2020/08/2120.png (画像はこちらをお借りしております 「たいへんよくできました」のようなハンコのジェネレーターを作ってみた。 - RainbowVortex)

回していきましょう!

まずは正の角度を指定します。
#IMAGE($e.stamp, 'rotate=30')

回ってますね〜
画像サイズはそのままですね。

次は負の角度を指定して出力します。
#IMAGE($e.stamp, 'rotate=-30')

こちらは元画像のサイズを超えないように自動縮小がされてますね。

このようにDocurainでも手軽に画像がまわせます。

はんこお辞儀が必要な場合にも使えます...!

 

他にも様々な機能がありますので、ぜひ登録無料、試用期限なしのアカウント取得をしてマニュアルを参照しお試しください。