2015-02-02 5 views
1

Я пытаюсь преобразовать файл excel в json, используя этот api: конвертировать-json узел api.Преобразование файла excel в json в nodejs

Я могу сделать это на своей локальной машине, но не на моем сервере. Только csv-to-json работает локально и на сервере. Вот мой код: https://gist.github.com/debasreedash/33efd4473ba8b344a5ac

Сбой сервера при попытке проанализировать файл excel сразу после первого console.log. Вот как это выглядит: http://imgur.com/lzUy8sc

Я думал, что это была проблема с отсутствием драйверов excel на сервере, но после его загрузки и установки он тоже не работал. Кто-нибудь сталкивался с этой проблемой? Если вам нужна дополнительная информация, тогда дайте мне знать.

+0

Убедитесь, что файл Excel не открытые любым другим программным обеспечением (особенно Excel!). –

+0

Если ваш список кодов верен, а 'console.log (« Переход к преобразованию ... »);' ничего не печатает, тогда сбой, вероятно, произойдет в другом месте. Попробуйте прокомментировать весь блок try-catch и убедитесь, что появился второй журнал. – SheetJS

ответ

7

Используйте этот метод для легкого undertsanding и синтаксического анализа:

npm install --save excel' 



var xls = require('excel'); 

xls('Sheet.xlsx', function(err, data) { 
    if(err) throw err; 
    // data is an array of arrays 
}); 

Как говорится, данные, которые он возвращает массив массивов. Мы хотим, чтобы это был JSON, чтобы мы могли делать все, что захотим.

Это функция, которая преобразует массив массивов в JSON:

function convertToJSON(array) { 
    var first = array[0].join() 
    var headers = first.split(','); 

    var jsonData = []; 
    for (var i = 1, length = array.length; i < length; i++) 
    { 

    var myRow = array[i].join(); 
    var row = myRow.split(','); 

    var data = {}; 
    for (var x = 0; x < row.length; x++) 
    { 
     data[headers[x]] = row[x]; 
    } 
    jsonData.push(data); 

    } 
    return jsonData; 
}; 

Тогда:

xlsx('tasks.xlsx', function(err,data) { 
    if(err) throw err; 
    //console.log(jsonDataArray(data)); 
    console.log(JSON.stringify(convertToJSON(data))); 
    //console.log(data); 
}); 
+0

Следует отметить, что модуль [excel] (https://www.npmjs.com/package/excel), который вы используете, поддерживает только файлы .xlsx'. Для более старой поддержки [parse-xl] (https://www.npmjs.com/package/parse-xl) работает достаточно хорошо. – ZaLiTHkA

+0

Это не работает, если какое-то значение внутри столбца уже содержит запятую (,). Это также разделяет и добавляет значение в следующий столбец. Не могли бы вы устранить эту проблему в своем коде выше? – ani0710

1

фокусировкой на первой половине первой линии вопрос: как конвертировать Excel к json.

Предположим: таблица Excel представляет собой квадрат данных, где первая строка является объектным ключом, а оставшиеся строки - значениями объекта, а желаемый json - это список объектов.

Усовершенствования в предыдущем ответе: удаление ненужных разделов и объединений (необязательно и может привести к недействительным преобразованиям, если ключи или значения содержат запятые), разрешить пунктирные строки в ключах подразумевать вложенные объекты, coffeescript, записывать файл.

Пунктирная нотация: Ключевая строка (0), содержащая firstName, lastName, address.street, address.city, address.state, address.zip, будет продукт, строка, документ с именами и фамилиями и встроенный документ с именем адрес, с адресом.

функция правопреемником по VISION от How to set object property (of object property of..) given its string name in JavaScript?

Во-первых, загрузите модуль первенствовать

npm install excel --save-dev 

Не элегантный, просто get'r'done код

fs = require 'fs' 
excel = require 'excel' 

FILES = [ 
    {src: 'input.xlsx', dst: 'output.json'} 
    ] 

# Assign values to dotted property names - set values on sub-objects 
assign = (obj, key, value) -> 
    # Because we recurse, a key may be a dotted string or a previously split 
    # dotted string. 
    key = key.split '.' unless typeof key is 'object' 

    if key.length > 1 
    e = key.shift() 
    obj[e] = if Object.prototype.toString.call(obj[e]) is "[object Object]" then obj[e] else {} 
    assign obj[e], key, value 
    else 
    obj[key[0]] = value 

# The excel module reads sheet 0 from specified xlsx file 
process = (src, dst) -> 
    excel src, (err, data) -> 
    throw err if err 

    keys = data[0] 
    rows = data[1..] 

    result = [] 
    for row in rows 
     item = {} 
     assign item, keys[index], value for value, index in row 
     result.push item 

    fs.writeFile dst, JSON.stringify(result, null, 2), (err) -> 
     if err 
     console.error("Error writing file #{dst}", err) 
     else 
     console.log "Updated #{dst}" 

process file.src, file.dst for file in FILES 
Смежные вопросы