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と流し込み後のイメージ: