クライアント側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'
};
いっこしか試してないけど。