js-xlsxでセル書式「パーセント」のファイル作成

クライアント側JavaScriptのみでエクセルファイルを生成できる便利なJSモジュール「js-xlsx」でエクセルファイルを生成する時に、セルの書式(スタイル)を「パーセント」にしたい。

js-xlsxのサンプルコードに含まれる sheet_from_array_of_arrays 関数を、以下のように変更した。(19~24行目)

function sheet_from_array_of_arrays(data, opts) {
    var ws = {};
    var range = {s: {c:10000000, r:10000000}, e: {c:0, r:0 }};
    for(var R = 0; R != data.length; ++R) {
        for(var C = 0; C != data[R].length; ++C) {
            if(range.s.r > R) range.s.r = R;
            if(range.s.c > C) range.s.c = C;
            if(range.e.r < R) range.e.r = R;
            if(range.e.c < C) range.e.c = C;
            var cell = {v: data[R][C] };
            if(cell.v == null) continue;
            var cell_ref = XLSX.utils.encode_cell({c:C,r:R});
            if(typeof cell.v === 'number') cell.t = 'n';
            else if(typeof cell.v === 'boolean') cell.t = 'b';
            else if(cell.v instanceof Date) {
                cell.t = 'n'; cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
            }
            // パーセント書式(スタイル)0.00%
            // 例えば '10%' という文字列を入れておくと 10.00% になる
            else if(/^[\d\.]+%$/.test(cell.v)) {
                cell.t = 'n'; cell.z = XLSX.SSF._table[10];
                cell.v = Number(cell.v.slice(0,-1))/100;
            }
            else cell.t = 's';
            ws[cell_ref] = cell;
        }
    }
    if(range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    return ws;
}

22行目の

cell.z = XLSX.SSF._table[10];

がセルの書式を指定しているらしい。

js-xlsx の内部ファイル(?) /blob/master/bits/10_ssf.js の、26行目あたりからはじまる table_fmt 変数に入ってる形式が使えるのかな?

var table_fmt = {
	0:  'General',
	1:  '0',
	2:  '0.00',
	3:  '#,##0',
	4:  '#,##0.00',
	9:  '0%',
	10: '0.00%',
	11: '0.00E+00',
	12: '# ?/?',
	13: '# ??/??',
	14: 'm/d/yy',
	15: 'd-mmm-yy',
	16: 'd-mmm',
	17: 'mmm-yy',
	18: 'h:mm AM/PM',
	19: 'h:mm:ss AM/PM',
	20: 'h:mm',
	21: 'h:mm:ss',
	22: 'm/d/yy h:mm',
	37: '#,##0 ;(#,##0)',
	38: '#,##0 ;[Red](#,##0)',
	39: '#,##0.00;(#,##0.00)',
	40: '#,##0.00;[Red](#,##0.00)',
	45: 'mm:ss',
	46: '[h]:mm:ss',
	47: 'mmss.0',
	48: '##0.0E+0',
	49: '@',
	56: '"上午/下午 "hh"時"mm"分"ss"秒 "',
	65535: 'General'
};

いっこしか試してないけど。