繁体   English   中英

将不同对齐的Excel转换为JSON

[英]Convert differently aligned excel to json

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

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

例:

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

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

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

您可以为此目的使用模块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' } ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM