自由形式のExcelファイルをアップロードし、データを読み込む手順を確認します。
ForgeコンポーネントAdvanced Excelを利用します。
前提:前回の(1)使い方に従って、セットアップがすんでいること
動作確認環境
Platform Version:11.0.212.0
Service Studio Version:11.5.42
Advanced Excel:2.1.23
Table of Contents
概要
こんな感じの入力ファイルを取り込みます。
本来であれば、表の部分はループ処理にしてRecord Listに読み込むはずです。
ここでは例を簡単にするために、青い枠をつけた3カ所だけを対象にします。
API
前回の(1)使い方にも、今回使うAPIの説明があります。
以下では、新しく出てくるAPIだけ説明します。
ファイルを開く
Workbook_Open Actionを使用。
FileName(ファイルのURLなどを指定)かBinary_DataのどちらかのInput Parameterを指定します。
ここでは、ファイルをアップロードしますので、Binary_DataにUpload部品のContentを渡しましょう。
値を読む
Cell_Read Actionを使用します。
Input ParameterにWorksheetがあるため、事前にWorksheet_SelectでWorksheetオブジェクトを取得しておきます。方法は前回記事を参考にしてください。
他に、読み込み対象の行位置(CellRow)と列位置(CellColumn)を指定します。共に1から数え始めます。例えば、上のファイルフォーマットの社員Noであれば、2Cの位置なので、CellRow=2/CellColumn=3です。
参考情報
Worksheet_Selectに存在しないシート名を渡してデバッグで値を確認すると、Outputが-undefined-になりました。
そのままCell_Readに-undefined-のOutput Parameterを渡してみたら、結果は空文字列でした。つまり例外にはなりませんでした。
サンプルプログラム
画面
①FileUpload Widget
②Button Widget。Screen Actionで、次の「ロジック」に示したActionを起動します。
③Input Widget3つ。ファイルから読み込んだ値を表示します。
ロジック
大まかな流れ:
- Workbook_OpenでFileUpload Widgetから受け取ったファイルバイナリ(Upload1.Contentなど)を開く
- Worksheet_Select。1のOutput ParameterをWorkbook Parameterとして、シート名をWorksheetNameに設定してWorksheetオブジェクトを取得
- Cell_Readで対象3セルをそれぞれ指定して値を取得(赤枠で囲んだ部分)。結果は画面のIputに紐付けた変数に設定
- Workbook_Closeで1で開いたWorkbookを閉じる(メモリを解放するため)
例外発生時もWorkbookをCloseするため、Workbook_Openした結果はObject型の変数にいったん格納しています。Workbook_Closeはこの変数に対して実行するようにしています。
Cell_Read_StartDateで読むセルは日付型です。日付型のセルは整数値でとれます。
この値は1900/1/1を1として、「整数-1」日後の日付に対応しています。が、そのまま計算すると、Excelと計算が合わない。どうもこれは、Excelで1900年の閏年判定がおかしいようです。
そこで、Date型のセルについては、以下の式を使って実際の日付を計算しています。
「1900/1/1から、セルから取得した数字-2日後」
AddDays(TextToDate("1900/1/1"), TextToInteger(Cell_Read_StartDate.CellValue) - 2)
1900/3/1より前の日付があり得る場合は、微修正の必要があります。たぶん無いと思いますが。