2023-06-14
https://support.questetra.com/bpmn-icons/converter-excelcsv-to-table/
https://support.questetra.com/ja/bpmn-icons/converter-excelcsv-to-table/
This item overwrites the value of a Table type data item with a contents of an Excel
compatible CSV file(TSV UTF-16 LE with BOM) stored in a File type data item.
この工程は、テーブル型データ項目の値を、ファイル型データ項目に格納されている Excel 対応 CSV ファイル(TSV
UTF-16 LE BOM あり)の内容で、上書きします。
(C) Questetra, Inc. (MIT License)
3
2
{
// データ項目を作成
const tableDef = engine.createDataDefinition(
"テーブル",
10,
"tableDef",
"LIST"
);
// 1列目を文字型データ項目にする
tableDef.addSubDataDefinition("文字", "string", "STRING");
return tableDef;
};
/**
* 複数列のテーブル型データ項目の設定の準備
* @return {Object} multiColumnTableDef テーブル型データ項目
*/
const prepareTableDefMultiColumn = () => {
// データ項目を作成
const multiColumnTableDef = engine.createDataDefinition(
"テーブル",
10,
"tableDef",
"LIST"
);
// 1列目を文字型データ項目にする
multiColumnTableDef.addSubDataDefinition("文字", "string", "STRING");
// 2列目を数値型データ項目にする
multiColumnTableDef.addSubDataDefinition("数値", "decimal", "DECIMAL");
// 3列目を日付型データ項目にする
multiColumnTableDef.addSubDataDefinition("日付", "date", "DATE_YMD");
// 4列目を選択型データ項目にする
multiColumnTableDef.addSubDataDefinition("選択", "select", "SELECT");
return multiColumnTableDef;
};
/**
* 1行1列の正常系
* content-type に charset あり。UTF-16。
*/
test("success-1row-1column", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const file = engine.createQfile(
"テスト.csv",
"text/tab-separated-values; charset=UTF-16",
"x-UTF-16LE-BOM",
"hogehoge"
);
// ArrayList に CSV ファイルを追加
files.add(file);
// ファイル型データ項目に値を指定
engine.setData(fileDef, files);
// テーブル型データ項目を準備して、config に指定
const tableDef = prepareTableDef();
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に null を指定
engine.setData(tableDef, null);
// main() を実行
main();
// テーブル型データ項目の値を参照する
const myTable = engine.findData(tableDef);
// テーブル型データ項目の値の行数
const numOfRows = myTable.size(); // 行(Tableの高さ)
expect(numOfRows).toEqual(1);
// テーブル型データ項目の値の列数
const numOfCols = myTable.getRow(0).size(); // 列(Tableの幅)
expect(numOfCols).toEqual(1);
// テーブル型データ項目の0行0列目の値がhogehogeであることを確認
expect(myTable.get(0, 0)).toEqual("hogehoge");
});
/**
* 2行1列の正常系
* content-type に charset の指定なし
*/
test("success-2row-1column", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const file = engine.createQfile(
"テスト.csv",
"text/tab-separated-values",
"x-UTF-16LE-BOM",
"hogehoge\npiyopiyo"
);
// ArrayList に CSV ファイルを追加
files.add(file);
// ファイル型データ項目に値を指定
engine.setData(fileDef, files);
// テーブル型データ項目を準備して、config に指定
const tableDef = prepareTableDef();
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に null を指定
engine.setData(tableDef, null);
// main() を実行
main();
// テーブル型データ項目の値を参照する
const myTable = engine.findData(tableDef);
// テーブル型データ項目の値の行数
const numOfRows = myTable.size(); // 行(Tableの高さ)
expect(numOfRows).toEqual(2);
// テーブル型データ項目の値の列数
const numOfCols0 = myTable.getRow(0).size(); // 列(Tableの幅)
const numOfCols1 = myTable.getRow(1).size();
expect(numOfCols0).toEqual(1);
expect(numOfCols1).toEqual(1);
// テーブル型データ項目の各カラムの値
expect(myTable.get(0, 0)).toEqual("hogehoge");
expect(myTable.get(1, 0)).toEqual("piyopiyo");
});
/**
* 2行1列の正常系
* テーブル型データ項目の値を上書き
* content-type に charset あり。UTF-16。
*/
test("overwrite-2row-1column", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const file = engine.createQfile(
"テスト.csv",
"text/tab-separated-values; charset=UTF-16",
"x-UTF-16LE-BOM",
"hogehoge\npiyopiyo"
);
// ArrayList に CSV ファイルを追加
files.add(file);
// ファイル型データ項目に値を指定する
engine.setData(fileDef, files);
// テーブル型データ項目を準備して、config に指定
const tableDef = prepareTableDef();
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に ListArray を作成する
const list = tableDef.createListArray();
// 新しい行を用意する
const newRow = list.addRow();
newRow.setCol(0, "fugafuga");
// テーブル型データ項目に値を指定
engine.setData(tableDef, newRow);
// main() を実行
main();
// テーブル型データ項目の値を参照する
const myTable = engine.findData(tableDef);
// テーブル型データ項目の値の行数
const numOfRows = myTable.size(); // 行(Tableの高さ)
expect(numOfRows).toEqual(2);
// テーブル型データ項目の値の列数
const numOfCols = myTable.getRow(0).size(); // 列(Tableの幅)
expect(numOfCols).toEqual(1);
// テーブル型データ項目の各カラムの値
expect(myTable.get(0, 0)).toEqual("hogehoge");
expect(myTable.get(1, 0)).toEqual("piyopiyo");
});
/**
* 1行複数列の正常系
* content-type に charset の指定なし
*/
test("success-1row-multicolumns", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const file = engine.createQfile(
"テスト.csv",
"text/tab-separated-values",
"x-UTF-16LE-BOM",
"hogehoge\t123.45\t2021-10-21\tfalse\n"
);
// ArrayList に CSV ファイルを追加
files.add(file);
// ファイル型データ項目をセットする
engine.setData(fileDef, files);
// テーブル型データ項目を定義する
const tableDef = prepareTableDefMultiColumn();
// テーブル型データ項目を指定する
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に null を指定
engine.setData(tableDef, null);
// main() を実行
main();
// テーブル型データ項目の値を参照する
const myTable = engine.findData(tableDef);
// テーブル型データ項目の値の行数
const numOfRows = myTable.size(); // 行(Tableの高さ)
expect(numOfRows).toEqual(1);
// テーブル型データ項目の値の列数
const numOfCols = myTable.getRow(0).size(); // 列(Tableの幅)
expect(numOfCols).toEqual(4);
// テーブル型データ項目の各カラムの値
expect(myTable.get(0, 0)).toEqual("hogehoge");
expect(myTable.get(0, 1)).toEqual("123.45");
expect(myTable.get(0, 2)).toEqual("2021-10-21");
expect(myTable.get(0, 3)).toEqual("false");
});
/**
* 複数行複数列の正常系
* content-type に charset あり。UTF-16。
*/
test("success-multirows-multicolumns", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const file = engine.createQfile(
"テスト.csv",
"text/tab-separated-values; charset=UTF-16",
"x-UTF-16LE-BOM",
"hogehoge\t123.45\t2021-10-21\tfalse\npiyopiyo\t42.195\t2022-10-21\ttrue\n"
);
// ArrayList に CSV ファイルを追加
files.add(file);
// ファイル型データ項目をセットする
engine.setData(fileDef, files);
// テーブル型データ項目を定義する
const tableDef = prepareTableDefMultiColumn();
// テーブル型データ項目を指定する
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に null を指定
engine.setData(tableDef, null);
// main() を実行
main();
// テーブル型データ項目の値を参照する
const myTable = engine.findData(tableDef);
// テーブル型データ項目の値の行数
const numOfRows = myTable.size(); // 行(Tableの高さ)
expect(numOfRows).toEqual(2);
// テーブル型データ項目の値の列数
const numOfCols0 = myTable.getRow(0).size(); // 列(Tableの幅)
const numOfCols1 = myTable.getRow(1).size();
expect(numOfCols0).toEqual(4);
expect(numOfCols1).toEqual(4);
// テーブル型データ項目の各カラムの値
expect(myTable.get(0, 0)).toEqual("hogehoge");
expect(myTable.get(0, 1)).toEqual("123.45");
expect(myTable.get(0, 2)).toEqual("2021-10-21");
expect(myTable.get(0, 3)).toEqual("false");
expect(myTable.get(1, 0)).toEqual("piyopiyo");
expect(myTable.get(1, 1)).toEqual("42.195");
expect(myTable.get(1, 2)).toEqual("2022-10-21");
expect(myTable.get(1, 3)).toEqual("true");
});
/**
* テーブル型データ項目よりも少ない列数
*/
test("few-column", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const file = engine.createQfile(
"テスト.csv",
"text/tab-separated-values; charset=UTF-16",
"x-UTF-16LE-BOM",
"hogehoge\t123.45"
);
// ArrayList に CSV ファイルを追加
files.add(file);
// ファイル型データ項目をセットする
engine.setData(fileDef, files);
// テーブル型データ項目を定義する
const tableDef = prepareTableDefMultiColumn();
// テーブル型データ項目を指定する
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に null を指定
//engine.setData(tableDef, null);
try {
main();
} catch (e) {
expect(e.toString()).toEqual(`Error: Incorrect number of rows at line 1`);
}
});
/**
* テーブル型データ項目よりも多い列数
*/
test("over-columns", () => {
// ファイル型データ項目を準備して、config に指定
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
// ArrayList を作成
let files = new java.util.ArrayList();
const fileArrayList = engine.createQfile(
"テスト.csv",
"text/tab-separated-values; charset=UTF-16",
"x-UTF-16LE-BOM",
"hogehoge\t123.45\t2021-10-21\tfalse\nfugafuga\t543.21\t2021-01-23\ttrue\tfalse"
);
// ArrayList に CSV ファイルを追加
files.add(fileArrayList);
// ファイル型データ項目をセットする
engine.setData(fileDef, files);
// テーブル型データ項目を定義する
const tableDef = prepareTableDefMultiColumn();
// テーブル型データ項目を指定する
configs.putObject("Table_DataId", tableDef);
// テーブル型データ項目に null を指定
engine.setData(tableDef, null);
try {
main();
} catch (e) {
expect(e.toString()).toEqual(`Error: Incorrect number of rows at line 2`);
}
});
/**
* 複数ファイル
*/
test("multiple files", () => {
const fileDef = engine.createDataDefinition("ファイル", 5, "q_file", "FILE");
configs.putObject("File_DataId", fileDef);
const files = new java.util.ArrayList();
const file1 = engine.createQfile(
"1.csv",
"text/tab-separated-values",
"x-UTF-16LE-BOM",
"テスト1"
);
files.add(file1);
const file2 = engine.createQfile(
"2.csv",
"text/tab-separated-values",
"x-UTF-16LE-BOM",
"テスト2"
);
files.add(file2);
engine.setData(fileDef, files);
try {
main();
} catch (e) {
expect(e.toString()).toEqual(`Error: Attachment of multiple files can not be supported.`);
}
});
]]>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACx0lEQVRYR8WXz0sUYRjHP5O0CLX+
uHTIQ7sHIby0BdIh0EU6hwmd20Vx9mb9AUvlQQSRVhBq0WW3gxcFKzx4000kBKO2QNgSssgS6uDu
oQQJJt4ZZ3ecH+s4O+kLyy7s+z7fz/PM87zPMxKnvKRj6afpBbpRiCDRAkQOzhdQKCEhvvMkeOnW
7tEAWVrYZwi4B6qom1UCUgSYII747bhqAzwhxhkeH0PYLCTE48i8cCJwBnhKCkn13I+VQua+nSF7
gDQ54K4fyhUbCjkSxM02rQD+en5YT2GChJpLlXUYQHvmWV89txq7bcyJKoCW7Vt1JJxb7hIBwnp1
VAHSPAQeuLVSa99U1xTzW/Msflt02vYIWdXDCCBKptkPgI07GzQFmhhcGXSCKCHTWgXQbrjnRvGe
iz20nWvzxJO8lqS9uZ3t39u1INRc0CJgk/nCi47WDk8AxkOOEAcVoQGkyat3vGH5BbD3d4/RwijD
b4fNzrxCJqoDfAEuGXdMd03TeaHTUwRC50NqDgjx8Q/jJN8k7ewUkLmqAyielBwOieiFg+Fa4tpJ
GelIgODZIJnuDDt/dhh67a41rN5aZfnHspPnVWwDgOURiF1CPBvN0hvqJfcxx8DKgH+BUnhPgohj
EhrFG6QG1n6usVne9ASw9H2J3CfR3w4tQxLalOHszVn6wn0I8XpXppixRs9UhpaLaPLGJP2X+2ls
aKxXH1sAMFxE2l1guYqNEHOf51j4uuAJplgqsv5r3Xi2jKyNd0c2Ix1iZnPGzyS0aUZaOxbVYGlI
Y9fH2N3fZeTdiKcImA6VCRCytmOx61QHEh3zf45kUAm9LndyQyk8QyZmfoYnNZZbPK8dAf1fbVAR
V5jXSakMxLy9mOgQWnWIUVp83IIIYfFqlqrv1cz8wEREFKJIRFBoQeKKukU0FokSCgUk8rU8dp8D
flS8Cxv/AFp57iGwqv7bAAAAAElFTkSuQmCC