InDesignの表組自動処理について、流し込みと溢れの処理には、感覚的には、textFrameより処理が遅い?!原因はよくわからないが、1セル=1textFrameで考えると、単純に数量のせいかもしれない。本文では、流し込み速度についての話で。とはいえ、架空のストーリーではなくで、実際の案件では色々使っている。
素材:10列*100行、カンマ区切りのcsv
前提:事前にInDesign上で行/列数分の空表組を用意
csvデータを読み込み
app.scriptPreferences.enableRedraw = false;//再描画を無効 var contents = readTxtFile("MOCK_DATA.csv"); var lines = contents.split("\n"); var len = lines.length;//1(header)+100=101 // function readTxtFile(txtFilePath) { var contents; var fileObj = new File(txtFilePath); fileObj.encoding = "UTF-8"; if (fileObj.open("r")) { contents = fileObj.read(); fileObj.close(); } else { alert("Failed to open file."); } return contents; }
セルずつ流し込み:テストマシンでは10秒前後
var start = new Date(); for (var r = 0; r < len; r++) { data = lines[r].split(","); for (var c = 0; c < cols; c++) { cells.itemByName(c + ":" + r).contents = data[c]; } } var end = new Date(); alert((end - start) / 1000);
1行ずつ流し込み。テストマシンでは1.5秒前後で、6-7倍も高速化できた!
var start = new Date(); for (var r = 0; r < len; r++) { data = lines[r].split(","); rows[r].contents = data; } var end = new Date(); alert((end - start) / 1000);
row/column.contentsに関して:
The text contents. For rows or columns, when specified as a string, the sting populates each cell in the row or column; when specified as an array, the first value in the array populates the left-most cell in the row or the top-most cell in the column; the next value populates the next cell to the right (for rows) or the next lowest cell (for columns), and so on.
訳すると:
テキストの内容を指定する。行または列の場合:
1、文字列を指定すると、その行または列の各セルにその文字列が入力されます。
例:row.contents="str"の場合、該当行全てのセルの内容が"str"になる
2、配列を指定すると、配列の最初の値は、行の左端のセルまたは列の最上位のセルに入力され、次の値は、右隣のセル(行の場合)または次の下位セル(列の場合)に、以降同様に入力します。
例:row.contents=["a","b","c"]の場合、1番目のセルが"a"、2番目が"b"、3番目が"c"になる
Javascritpのみで完結したい場合、row.contentsがやりやすいが、column.contentsを使うと、配列の別途処理が必要となる。(Python+Pandasのような素晴らしい組み合わせの場合は、論外です)。また、セルの結合により、処理が色々変わるケースもある。したがって、都度表組の特徴を見て、プログラムを工夫する必要があります。
また、流し込み後、最低限にセルの溢れ処理も必要、これに関しての高速化は、次回で。
元のcsvと流し込み後のイメージ: