代码之家  ›  专栏  ›  技术社区  ›  DeveloperKurt

将不同对齐的Excel转换为JSON

  •  0
  • DeveloperKurt  · 技术社区  · 7 年前

    将有多个Excel文件具有相同的字段,但它们的对齐方式可能不同。例如,在第一个Excel文件中,“价格”列可能位于第一个序列,但在第二个文件中,“价格”列可能位于第三个序列。

    因此,如果我要求用户输入字段名下的序列(这样我就知道字段的顺序),我可以只转换那些字段,按照我想用javascript或nodejs进行JSON的顺序吗? 如果是这样,怎么办?

    例子:

    这是客户1的数据: 存储在此方向 https://imgur.com/yIgOF8w

    这是2号客户的数据: 按此方向存储。1个额外的数据,我不会使用,与第一个不同。 https://imgur.com/lY96c7J

    我想按照客户机1存储的方式来解析它。但我要买的品种太多了。因此,正如我上面所解释的,如果我要得到某些字段的列号,我可以用第一个客户机以准确的格式得到它,然后像这样转换成JSON。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Terry Lennox    7 年前

    为此,您可以使用ExcelJS模块,它有很多好的特性。

    我已经更新了,允许将列顺序传递给readvalues函数。

    例如:

    var excel = require('exceljs');
    var wb = new excel.Workbook();
    var path = require('path');
    var client1Path = path.resolve(__dirname, 'client1_data.xlsx');
    var client2Path = path.resolve(__dirname, 'client2_data.xlsx');
    
    function readValues(filePath, columnNumbers) {
        let columnNames = Object.entries(columnNumbers).reduce((a, [key,value]) => {
            a[value] = key;
            return a;
        }, []);
    
        return wb.xlsx.readFile(filePath).then( () => {
            var worksheet = wb.getWorksheet("Sheet1");
            var values = [];
            worksheet.eachRow((row) => {
                let obj = row.values.reduce((o, v, index) => {
                    if (columnNames[index]) o[columnNames[index]] = v;
                    return o;
                }, {});
                values.push(obj);
            });
            return values;
        });
    }
    
    async function testReadData() {
        try {
            let client1Data = await readValues(client1Path, { price: 1, name: 2, country: 3});
            console.log('testReadData: Client 1 data: ', client1Data);
            let client2Data = await readValues(client2Path, { price: 2, name: 1, country: 4});
            console.log('testReadData: Client 2 data: ', client2Data);
        } catch (error) {
            console.error('testReadData: Error occurred: ', error);
        }
    }
    
    testReadData();
    

    我使用的数据与您的示例中的数据相同(现已更正)。

    例如

    客户端1数据:

    $50 Jack    USA
    $30 Harold  USA
    

    客户端2数据:

    Jack    $50 Florida USA
    Harold  $30 California  USA
    

    输出如下:

    testreaddata:客户端1数据:

    [ { price: '$50', name: 'Jack', country: 'USA' },
    { price: '$30', name: 'Harold', country: 'USA' } ]
    

    testreaddata:客户端2数据:

    [ { name: 'Jack', price: '$50', country: 'USA' },
    { name: 'Harold', price: '$30', country: 'USA' } ]