SmartPad4iでは、CSVファイルを出力できるAPIがあり、簡単に容量の大きなCSVファイルや、タブ区切りのファイルを取得できます。出力するテキストファイル(CSV)のデータが少量の場合には、APIだけでなく、JavaScriptを使用して手軽にファイルダウンロードを実装することも可能です。
Tipsでは、SmartPad4iのサブファイル(tableタグ)に出力した情報から、JavaScriptを使用してtxtファイルやcsvファイルを取得する方法についてご紹介します。
SmartPad4iアプリでサブファイル(tableタグ)を作成
SmartPad4iでサブファイルを作成するには、tableタグを記述して、td要素内に入力欄や、ラジオボタン等の要素を設定したり、tdタグへid属性を設定します。
また、サブファイルとして認識させるために、tableタグ自体にid属性を設定することも必要です。SmartPad4i Designerで読み込むだけで、サブファイルとしてタグが認識されます。
Tipsでは、以下アプリケーションのサブファイルのデータをテキストファイルでダウンロードします。
SmartPad4i Designerの定義
アプリケーションのサブファイルは、Designerでは以下のように定義されています。
サブファイルの中にラベル要素LB01~LB05までが定義されています。それぞれ文字列のラベル要素です。
テキストファイルダウンロード処理の実装
テキストファイルダウンロード処理の実装は以下になります。
- HTMLの編集 テーブルタグ (データを取得しやすいように属性を変更)
- HTMLの編集 ボタンの追加
- JavaScriptの追加 ダウンロード処理記述
1.HTMLの編集 テーブルタグ
テーブルタグのHTMLを以下のように変更しました。
ダウンロード対象のデータを取得しやすいようにカスタムデータ属性data-dwn-fieldを定義して、それぞれに識別用の名前を設定しています。
カスタムデータ属性data-dwn-fieldと設定していますが、カスタムデータ属性は、自由に名称を設定できるため、任意の名前を設定しても問題ありません。
<table class="table is-fullwidth is-hoverable" id="SFL01">
<tbody>
<tr>
<td id="LB01" data-dwn-field="userid" > ykunimoto@migaro.co.jp</td>
<td id="LB02" data-dwn-field="username" style="width:120px">ミガロ. 太郎</td>
<td id="LB03" data-dwn-field="userdep" style="width:120px">営業部</td>
<td id="LB04" data-dwn-field="userauth" style="width:120px">管理者</td>
<td id="LB05" data-dwn-field="userdate" style="width:110px">2021-12-31</td>
</tr>
</tbody>
</table>
2.HTMLの編集 ボタンの追加
次に、ダウンロード用のボタンを追加します。
ダウンロード用ボタンのクリック時に処理を追加するため、以下のようにid属性を追加しています。
<div class="is-flex is-justify-content-left">
<a class="button is-info load-b" id="DOWNT" >
<i class="fa fa-download"></i>Download
</a>
</div>
3.JavaScriptの追加 ダウンロード処理記述
ダウンロードボタンがクリックされた際の処理を追加します。
JavaScriptの処理は、以下の手順となります。
- 対象データを配列に取得
- 対象データをテキストデータに変換
- URLオブジェクトに変換してアンカータグからダウンロード
対象データを配列に取得
ダウンロードボタン(id属性DOWNT)をクリック時に実行する処理を記述しています。
$('#DOWNT').on('click',function(){
var id_arr = $.makeArray($('[data-dwn-field="userid"]'));
var name_arr = $.makeArray($('[data-dwn-field="username"]'));
var dep_arr = $.makeArray($('[data-dwn-field="userdep"]'));
var auth_arr = $.makeArray($('[data-dwn-field="userauth"]'));
var date_arr = $.makeArray($('[data-dwn-field="userdate"]'));
var data = [];
var loopCount = $('[data-dwn-field="userid"]').length;
for(var i=0;i<loopCount;i++){
var line = [];
line.push(id_arr[i].innerText);
line.push(name_arr[i].innerText);
line.push(dep_arr[i].innerText);
line.push(auth_arr[i].innerText);
line.push(date_arr[i].innerText);
data.push(line);
}
});
最初にdataの配列要素を定義します。
dataの配列要素は、テキストデータの元となる、行全体のデータです。
次にdata-dwn-field=”userid”の個数を取得してループ数(loopCount)としています。
line配列は、行のデータを格納します。
各フィールドのテキスト情報をline配列に追加後、dataの配列に追加しています。
dataの配列の中にline配列が格納されている、2次元配列の形式でデータを取得します。
対象データをテキストデータに変換
取得した2次元配列のデータを、テキストデータに変換します。
「対象データを配列に取得」のJavaScriptの続きに記述しています。
前の箇所は<!– 省略 –>の部分になります。
$('#DOWNT').on('click',function(){
<!-- 省略 -->
// BOM(Byte Order Mark)
var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
// Tab区切り テキストデータ
var text_data = data.map(function(i){return i.join('\t')}).join('\r\n');
var blob = new Blob([bom, text_data], { type: 'text/plain' });
});
最初にBOMを設定します。
BOMはByte Order Markの略です。
詳しくは、以下URLを参照ください。
■バイト順マーク
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF
bom変数にBOMのデータを格納後、テキストデータを作成します。
配列のメソッド mapを使用してタブ区切りのデータを作成しています。
タブ区切りにしていますが、mapメソッドの処理を変更することでCSV形式のファイルにすることもできます。
例えば、カンマ区切りにする場合は以下になります。
var text_data = data.map(function(i){return i.join(',')}).join('\r\n');
■Array.prototype.map()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map
mapメソッドのcallback関数で配列要素を取得、joinメソッドで配列をタブ区切りに変換します。
■Array.prototype.join()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join
text_data 変数に出力対象の文字列が設定されます。
Blobコンストラクタを使用して、Blob オブジェクトを作成します。
■Blob
https://developer.mozilla.org/ja/docs/Web/API/Blob/Blob
URLオブジェクトに変換してアンカータグからダウンロード
Blobに変換した要素をオブジェクトURLに変換してダウンロード処理を行います。
前の続きの処理に、JavaScriptを追加していきます。
//テキストファイル
$('#DOWNT').on('click',function(){
<!-- 省略 -->
var url = URL.createObjectURL(blob);
var anchor = $('<a></a>');
anchor.attr('download','sample.txt');
anchor.attr('href', url);
// ダウンロード
$(anchor)[0].click();
URL.revokeObjectURL(url);
});
blobをURL.createObjectURLスタティックメソッドを利用して、オブジェクトURLに変換します。
変換したオブジェクトURLはurl変数に格納しています。
■URL.createObjectURL()
https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL
ダウンロードするためのアンカータグをjQueryで作成します。
$(‘<a></a>’) の記述でアンカータグを作成できます。
作成したタグは、anchor変数に格納されています。
anchor変数にdownload属性(ファイル名)、href属性(オブジェクトURL)を設定後、clickメソッドでクリック処理してファイルをダウンロードしています。
最終行の、URL.revokeObjectURLは作成したurlオブジェクトを開放するための静的メソッドです。
■URL.revokeObjectURL()
https://developer.mozilla.org/ja/docs/Web/API/URL/revokeObjectURL
以上で実装は終了です。
追加したJavaScript全体
全体のJavaScriptは以下です。
$('#DOWNT').on('click',function(){
var id_arr = $.makeArray($('[data-dwn-field="userid"]'));
var name_arr = $.makeArray($('[data-dwn-field="username"]'));
var dep_arr = $.makeArray($('[data-dwn-field="userdep"]'));
var auth_arr = $.makeArray($('[data-dwn-field="userauth"]'));
var date_arr = $.makeArray($('[data-dwn-field="userdate"]'));
var data = [];
var loopCount = $('[data-dwn-field="userid"]').length;
for(var i=0;i<loopCount;i++){
var line = [];
line.push(id_arr[i].innerText);
line.push(name_arr[i].innerText);
line.push(dep_arr[i].innerText);
line.push(auth_arr[i].innerText);
line.push(date_arr[i].innerText);
data.push(line);
}
// BOM(Byte Order Mark)
var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
// Tab区切り テキストデータ
var text_data = data.map(function(i){return i.join('\t')}).join('\r\n');
var blob = new Blob([bom, text_data], { type: 'text/plain' });
var url = URL.createObjectURL(blob);
var anchor = $('<a></a>');
anchor.attr('download','sample.txt');
anchor.attr('href', url);
// ダウンロード
$(anchor)[0].click();
URL.revokeObjectURL(url);
});
ダウンロードできるファイル
ダウンロードボタンをクリックすると、テキストファイル(sample.txt)がダウンロードされます。
ダウンロードしたファイルは、タブ区切り UTF-8形式のBOM付きテキストファイルになります。
終わりに
今回のTipsは、JavaScriptで手軽にテキストファイルダウンロードを実装する方法をご紹介しました。手軽にテキストファイルのダウンロード機能を追加したい場合には是非ご活用ください。