Skip to content

Instantly share code, notes, and snippets.

@hell0again
Last active December 28, 2015 10:59
Show Gist options
  • Save hell0again/7490450 to your computer and use it in GitHub Desktop.
Save hell0again/7490450 to your computer and use it in GitHub Desktop.
var xlsx = require('xlsx');
var _ = require('underscore');
var file = 'test.xlsx';
function parsePos(x) { // "AB" => 26*1 + 1*2 => 28
var str = x.toUpperCase();
var ret = 0;
for(var i=0,len=str.length; i<len; i++) {
ret += Math.pow(26,(len - i -1)) * (str.charCodeAt(i)-64);
}
return ret;
}
function convPos(pos) { // "B3" => {x:2, y:3}
return {
x: parsePos( pos.match(/^[a-zA-Z]+/)[0] ),
y: parseInt( pos.match(/[^a-zA-Z]+$/)[0] )
};
}
function xlsx2matrixs(xlsx_path) { // xlsxからシートごとに2次元配列
var ss = xlsx.readFile(xlsx_path);
var ret = {};
_.each( ss.SheetNames, function(sheet_name) {
var sheet = ss.Sheets[sheet_name];
var range = convPos( sheet['!ref'].match(/[a-zA-Z0-9]+$/)[0] ); // !ref: "A1:C6"
var matrix = new Array( range.y );
_.map( _.range(0, range.y), function(y) {
matrix[y] = new Array( range.x );
});
//console.log(matrix);
//console.log(range);
_.each( sheet, function(val,key) {
if(key[0] === '!') {} else {
var pos = convPos(key);
matrix[pos.y-1][pos.x-1] = val.v;
}
});
ret[sheet_name] = matrix;
});
return ret;
}
function matrix2table(matrix) { // ひとつのmatrixの1行目をヘッダとみなしてテーブルに。
var cols = matrix[0];
return _.map( _.range(1, matrix.length), function(x) {
var row = {};
_.each(cols, function(el,it,list) {
row[el] = matrix[x][it];
});
return row;
});
}
function xlsx2tables(xlsx_path) {
var ret = {};
_.each(
xlsx2matrixs(xlsx_path),
function(val,key,list){
ret[key] = matrix2table(val)
}
);
return ret;
}
console.log(
JSON.stringify(
xlsx2tables(file)
)
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment