Конвертировать по-разному Excel в JSON - PullRequest
0 голосов
/ 10 января 2019

Будет несколько файлов Excel, которые имеют одинаковые поля, но могут быть выровнены по-разному. Например, в первом файле Excel столбец «price» может быть в первой последовательности, а во 2-м файле - в 3-й последовательности.

Так что, если бы я попросил пользователя ввести последовательности под именем полей (чтобы я знал порядок полей), могу ли я преобразовать эти поля только в тот порядок, который я хочу, в JSON с Javascript или Nodejs? Если да, то как?

Пример:

Это номер клиента. Данные 1: хранятся в этой ориентации https://imgur.com/yIgOF8w

Это номер клиента. Данные 2: хранятся в этой ориентации. 1 дополнительные данные, которые я не буду использовать и которые будут отличаться от первых. https://imgur.com/lY96c7J

И я хочу разобрать это именно так, как у клиента нет. 1 хранится Но есть так много вариантов, которые я получу. Итак, как я объяснил выше, если бы я должен был получить номера столбцов определенных полей, я мог бы получить его в точном формате с первым клиентом и преобразовать в JSON следующим образом.

1 Ответ

0 голосов
/ 10 января 2019

Для этой цели вы можете использовать модуль 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' } ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...