2023年7月3日月曜日

Excelをアップロードしてフォームの穴埋めを行う

 以下のような簡単なExcelシートをAPEXアプリケーションにアップロードし、その内容でフォームの穴埋めをします。


以下のように動作するアプリケーションを作成します。


クラシック・レポートを使ってブラウザで穴埋めする実装と、APEXコレクションを使ってサーバー側で穴埋めする実装の2種類を試してみます。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前Excel Formとします。




クラシック・レポートを使う



空白ページを作成します。ページ定義名前Classic Reportとします。


フォームの穴埋めに使うExcelファイルを指定するページ・アイテムを作成します。

識別名前P2_FILEタイプファイル参照...を選びます。設定記憶域のタイプとしてTable APEX_APPLICATION_TEMP_FILESファイルをパージするタイミングとしてEnd of Sessionを選びます。表示形式は任意ですが、ここではInline File Browseを選択しています。

セッション・ステートストレージセッションごと(永続)を選択します。


ファイルをアップロードするボタンを作成します。

識別ボタン名SUBMITラベルSubmitとします。動作アクションページの送信です。


Excelシートから取り出した値を保持するページ・アイテムを作成します。

ページ・アイテムP2_NAME氏名P2_DEPT所属P2_PURPOSE目的P2_AMOUNT金額を保持します。P2_NAMEP2_DEPTP2_PURPOSEタイプテキスト・フィールドP2_AMOUNT数値フィールドとします。

セッション・ステートストレージリクエストごと(メモリーのみ)とします。


クラシック・レポートのリージョンを作成し、アップロードされたExcelを表形式にします。

リージョンを作成し、識別タイトルとしてDocumentタイプとしてクラシック・レポートを選択します。ソースタイプとしてSQL問合せを選択し、SQL問合せとして以下を記述します。

詳細静的IDとしてdocumentを設定します。


属性遅延ロードオフにします。


クラシック・レポートから値を取り出し、ページ・アイテムに設定します。

ページ・プロパティJavaScriptページ・ロード時に実行に、以下を記述します。



ページの表示時に一瞬レポートが表示されます。それを抑止するために、ページのテンプレート・オプションを開き、Deferred Page Renderingチェックを入れます。


以上で実装は完了です。


遅延ロードをオンにする



クラシック・レポートの遅延ロードオンの場合は、クラシック・レポートの表示はページのロードとは非同期で実行されます。そのため、JavaScriptによる穴埋め処理は動的アクションのイベントリフレッシュ後に実行する必要があります。

ページ番号2のコピーをページ番号3として作成し、クラシック・レポートの遅延ロードオンにします。

クラシック・レポートに動的アクションを作成します。

タイミングイベントとしてリフレッシュ後を選択します。


TRUEアクションとしてJavaScriptコードの実行を選択し、設定コードとして以下を記述します。



ページ・プロパティJavaScriptページ・ロード時に実行に記載されたコードは削除します。


以上で実装は完了です。

遅延ロードをオンにしている場合、レポートのリフレッシュ後に一瞬レポートが表示される状況を抑止するのは難しそうです。


APEXコレクションを使う



ページ番号3のコピーをページ番号4として作成し、クラシック・レポートのリージョンを削除します。

アップロードされたExcelからAPEXコレクションを作成し、それからフォームの穴埋めを行います。

プロセス・ビューを表示させ、新規にプロセスを作成します。

識別名前Fill Formタイプとしてコードを実行を選択します。ソースPL/SQLコードに以下を記述します。


サーバー側の条件ボタン押下時SUBMITを指定します。


サーバー側で実行されるプロセスでページ・アイテムに値を設定しているため、穴埋めに使用されるページ・アイテムのセッション・ステートストレージセッションごと(永続)にする必要があります。


反対に、アップロードするファイルを参照するページ・アイテムの設定ファイルをパージするタイミングEnd of Requestセッション・ステートストレージリクエストごと(メモリーのみ)に変更できます。


以上で実装は完了です。

クラシック・レポートを使った実装を紹介していますが、APEXコレクションを使った実装が一番扱いやすいと思います。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/fill-form-excel.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。