将对齐方式不同的Excel转换为json

时间:2019-01-10 09:50:39

标签: javascript node.js json excel csv

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

因此,如果我要让用户在字段名称下输入序列(这样我就知道字段的顺序),我是否只能按照要使用Javascript或Node.js进行JSON转换的顺序来转换这些字段? 如果可以,怎么办?

示例:

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

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

我想完全按照客户端编号解析它。 1个已存储。但是我有很多品种。因此,如上所述,如果要获取某些字段的列号,可以使用第一个客户端以确切的格式获取它,然后像这样转换为JSON。

1 个答案:

答案 0 :(得分:1)

您可以为此目的使用模块excel js,它具有很多不错的功能。

我已进行了更新,可以将列顺序传递给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' } ]