4D View Proを使ってExcelシートを表示して値を置き換える

v18での事例を紹介。テンプレートのエクセルシートがあって、宛先などのセルにDBに登録されている値をセット、完成したエクセルシートを書き出す、という業務があり、シートの数が多いので面倒という案件があった。

これを4Dで解決するために、顧客からもらったエクセルシートをテンプレートとしてResourcesフォルダに置く、4D側でインポートしてセルの値をDBの値に置き換える、ことにした。4D View Proを使う。

手順の概要:

1)ViewProエリアのオブジェクトプロパティでon VP Readyイベントをチェック
on VP ReadyはVPエリアがロード完了したときに発生する。

2)ViewProエリアのオブジェクトメソッドにon VP Readyイベントハンドラを記述

  //B01_vpJissiKakuninsho
  //4D ViewProでエクセルシートを作成
C_LONGINT($frmEvnt)
$frmEvnt:=Form event code
Case of 
	: ($frmEvnt=On VP Ready)
	  //オンレディ
	B01_vpJK_onVPReady 
	
End case 

3)VP IMPORT DOCUMENTを記述、テンプレートファイル名とコールバックメソッド名を指定
これでインポートが完了したときに指定したメソッドが実行される。ここでは「B01_vpJK_make」をコールバックメソッドに指定した。VP IMPORT DOCUMENTの3番目の引数$optionsに渡すのだが、$optionsはオブジェクト型。

  //B01_vpJK_onVPReady
  //20211217 wat
  //オンレディ

C_TEXT($frmObjName)
$frmObjName:="vB01_vpJissiKakuninsho" 
C_TEXT($templateFileName)
$templateFileName:="jissi_kakuninsho_tmp.xlsx"
 
  // 外部からエクセルファイルを読み込む
C_OBJECT($options)
$options:=New object
$options.formula:=Formula(B01_vpJK_make )
$filePath:=Get 4D folder(Current resources folder)+$templateFileName

VP IMPORT DOCUMENT ($frmObjName;$filePath;$options)

4)コールバックメソッドを記述
ここでDBの値を取得してセルにセットしていく

  //B01_vpJK_make
  //VP IMPORT DOCUMENTのoptions.formulaで非同期呼び出し。
  //ここでセルに値をセットしたり、テンプレートの情報を取得して4Dフィールドに表示したりする。

4D View Proは4DのWebエリアを拡張したView ProエリアにSpreadJSのライブラリを埋め込んだ実装となっている。このためフォームオブジェクトのローディングが4DのOnLoadイベントではまだロードがされていない可能性がある。それでViewProエリアにイベントが発生する仕組みになっている。さらにテンプレートをインポートする際にも一度処理がSpreadJSに渡るため、4D側は非同期処理が必要になる。このときは$optionsに与えたメソッドがコールバック関数として呼び出される、という仕組み。わかってしまえばコード量はそれほど多くない。