Javascript 在SheetJS获取列名数组

Javascript 在SheetJS获取列名数组,javascript,excel,spreadsheet,Javascript,Excel,Spreadsheet,我正在尝试将Excel电子表格(.xlsx)解析为JSON 我正在使用节点包 然而,我无法实现这样一件简单的事情——如何获得与内部存储相同格式的列名 下面是我的代码: function _buildColumnsArray(range) { // range = "A1:CA38" // ... // should return ['A', ..., 'Z', 'AA', ..., 'AZ', 'BA', ..., 'BZ', 'CA'...] } // -------

我正在尝试将Excel电子表格(.xlsx)解析为JSON

我正在使用节点包

然而,我无法实现这样一件简单的事情——如何获得与内部存储相同格式的列名

下面是我的代码:

function _buildColumnsArray(range) {
    // range = "A1:CA38"
    // ...
    // should return ['A', ..., 'Z', 'AA', ..., 'AZ', 'BA', ..., 'BZ', 'CA'...]
}

// --------

var workbook = XLSX.readFile(fileUrl),
    sheets = workbook.Sheets,
    result = {};

result.sheetNames = [];

for (var i = 0; i < workbook.SheetNames.length; i++) {
    var sheet = workbook.Sheets[workbook.SheetNames[i]],
        csvSheet = XLSX.utils.sheet_to_csv(sheet);

    // '!ref' referring to a specific range by docs
    if (sheet["!ref"]) {
        var columns = _buildColumnsArray(sheet["!ref"]),
            rows = _buildRowsArray(columns, csvSheet);

        // build final result
        result[workbook.SheetNames[i]] = {
            columns: columns,
            rows: rows
        };
        result.sheetNames.push(workbook.SheetNames[i]);
    }
}
function\u buildColumnsArray(范围){
//range=“A1:CA38”
// ...
//应返回['A'、…、'Z'、'AA'、…、'AZ'、'BA'、…、'BZ'、'CA'…]
}
// --------
var workbook=XLSX.readFile(fileUrl),
工作表=工作簿。工作表,
结果={};
result.sheetNames=[];
对于(var i=0;i

以下是我目前正在尝试的但并不完全有效的方法:

如果我答对了问题,任务是将Excel列名范围扩展为[“A1:DD38”]这样的范围

该范围定义了从a到DD的列块和从1到38的行块。 我们只需要得到一个列的扩展列表:

A, B, ... Z, AA, AB, ..., AZ, BA, ... BZ, ...
请注意,这行列名实际上用作数字。从“A”开始,转到“Z”。然后“B”成为第一个数字,我们继续在零位中使用“A”到“Z”,依此类推

所以列名实际上代表26进制的数字,其中0=“A”,1=“B”等等

在javascript中,我们有一种方法可以将数字转换为具有任何给定基数的另一个数字系统,请参阅

反向转换可以通过以下方式完成

对于以26为基数的系统,javascript使用从0到9的数字,然后使用从“a”到“p”的小写字母表示其余符号

我们可以通过简单的字符替换从javascript系统切换到excel系统(“A”到“Z”),因为系统具有相同的基础

因此,我们的任务归结为:

  • 将开始/结束列转换为十进制值
  • 从头到尾迭代
  • 将每个数字转换为Excel系统并添加到生成的数组中
更新: 不幸的是,情况并不理想,我们有
A…Z
AA。。。AZ
,而A表示零位。 因此,在数字上,它就像有
0..9
然后
00..09
,只有
10…19
,所以我们需要人工模拟
00…09
的情况

下面是JavaScript中的字母数字转换 这里有一个字母数字转换的不同想法,灵感来自PHP解决方案。这是一个简单的示例,只需执行任务,就可以进行零错误检查

我们需要两个助手函数进行转换。在Unicode表中,字母的字符代码已经按照字母顺序排列,所以我们只需要在转换时添加或删除偏移量

function alphaToNum(alpha) {

  var i = 0,
      num = 0,
      len = alpha.length;

  for (; i < len; i++) {
    num = num * 26 + alpha.charCodeAt(i) - 0x40;
  }

  return num - 1;
}
\u buildColumnsArray
函数的最终版本:

function _buildColumnsArray(range) {

  var i,
      res = [],
      rangeNum = range.split(':').map(function(val) {
        return alphaToNum(val.replace(/[0-9]/g, ''));
      }),
      start = rangeNum[0],
      end = rangeNum[1] + 1;

  for (i = start; i < end ; i++) {
    res.push(numToAlpha(i));
  }

  return res;
}
这里是一个工作示例,我一直在使用Mocha和Chai测试结果(这里的“replay”按钮的行为与预期不同),因此代码量要大一些

函数alphaToNum(alpha){
var i=0,
num=0,
len=α长度;
对于(;i=0;num=parseInt(num/26,10)-1){
alpha=String.fromCharCode(num%26+0x41)+alpha;
}
返回α;
}
函数_buildColumnsArray(范围){
var i,
res=[],
rangeNum=range.split(“:”).map(函数(val){
返回alphaToNum(val.replace(/[0-9]/g');
}),
start=rangeNum[0],
结束=rangeNum[1]+1;
for(i=start;ifunction _buildColumnsArray(range) {

  var i,
      res = [],
      rangeNum = range.split(':').map(function(val) {
        return alphaToNum(val.replace(/[0-9]/g, ''));
      }),
      start = rangeNum[0],
      end = rangeNum[1] + 1;

  for (i = start; i < end ; i++) {
    res.push(numToAlpha(i));
  }

  return res;
}
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ', 'CA']
var colValues =[];

function checkCols(workbook)  //your workbook variable
  {
    var first_sheet_name = workbook.SheetNames[0];
    var worksheet = workbook.Sheets[first_sheet_name];
    var cells = Object.keys(worksheet);
    for (var i = 0; i < Object.keys(cells).length; i++) {
        if( cells[i].indexOf('1') > -1)
        {
            colValues.push(worksheet[cells[i]].v); //Contails all column names
        }
    }
 }
var XLSX = require('xlsx');
var workbook = XLSX.readFile('./test.xlsx');
var sheet_name_list = workbook.SheetNames;
let columnHeaders = [];
for (var sheetIndex = 0; sheetIndex < sheet_name_list.length; sheetIndex++) {
    var worksheet = workbook.Sheets[sheet_name_list[sheetIndex]];
    for (let key in worksheet) {
        let regEx = new RegExp("^\(\\w\)\(1\){1}$");
        if (regEx.test(key) == true) {
            columnHeaders.push(worksheet[key].v);
        }
    }
}
get_header_row(sheet) {
    let headers = [];
    let range = XLSX.utils.decode_range(sheet['!ref']);
    let C, R = range.s.r; /* start in the first row */
    /* walk every column in the range */
    for(C = range.s.c; C <= range.e.c; ++C) {
      let cell = sheet[XLSX.utils.encode_cell({c:C, r:R})] /* find the cell in the first row */

      let hdr = "";
        if(cell && cell.t) hdr = XLSX.utils.format_cell(cell);

        headers.push(hdr);
    }
    return headers;
}