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