2016-04-12 25 views
1

Bir excel dosyasını okumak için node.js paketini 'xlsx' kullanıyorum. Dosya sisteminden bir dosya okuma zaman uyumlu olarak çalışır, ancak akış biraz zor. (Dosya uzaktan servis edilir ve sadece bir akış olarak alabiliriz.) Yerel akış dosyaları aynı sorunu üretir, bu nedenle çoğaltılması kolaydır.Düğüm: bir Excel dosyasını akışa almaya ve arabelleği 'xslx' kitaplığına geçirmeye çalışıyor

Örnekleri şu şekilde izledim: https://www.npmjs.com/package/xlsx ancak yaklaşıma bağlı olarak "ulaşılan veri sonu" veya "desteklenmeyen dosya" olsun.

const XLSX = require('xlsx'); 
const fs = require('fs'); 

const stream = fs.createReadStream('sample.xlsx'); 


// This function returns Error: Unsupported file 48 

documentedExample = function(){ 
    var arr = new Array(); 

    stream.on('data', function(arraybuffer){ 
    var data = new Uint8Array(arraybuffer); 
    for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); 
    }); 
    stream.on('end', function(){ 
    var bstr = arr.join(""); 
    var workbook = XLSX.read(bstr, {type:"binary"}); 

    }); 
} 


// This function returns Error: End of data reached (data length = 75589, asked index = 77632). Corrupted zip ? 

alternateExample = function(){ 
    var bufferArray = []; 
    stream.on('data', function(thisChunk){ 
    bufferArray.push(thisChunk); 
    }); 
    stream.on('end', function(){ 
    var excelDataBuffer = bufferArray.join(""); 
    excelDataBuffer = excelDataBuffer.toString(); 
    var workbook = XLSX.read(excelDataBuffer, {type:"binary"}); 
    }); 
} 

Yerel kullanım için bir xlsx ikili ürününü yeniden birleştirmenin doğru yolu ne olurdu?

cevap

0

library onların docs itibaren

okumak için akışlarını desteklemez Akım: (Akış Oku

Not XLS

en yaygın ve ilginç biçimleri, XLSX/M, xlsb, ODS) sonuçta ZIP veya CFB dosya kaplarıdır. Her iki biçim de dizin yapısını dosyanın başına koyar: ZIP dosyaları, Central Directory kayıtlarını mantıksal dosyanın sonuna yerleştirirken, CFB dosyaları FAT yapısını dosyanın herhangi bir yerine yerleştirebilir! Sonuç olarak, bu formatları düzgün bir şekilde ele almak için, bir akış işlevinin, başlamadan önce tüm dosyayı tamponlaması gerekir. Bu, akışla ilgili beklentileri karşılar, dolayısıyla herhangi bir akış okuma API'sı sağlamaz. Gerçekten akış yapmak istiyorsanız, sizin için arabellekleme yapacak olan concat-stream gibi düğüm modülleri vardır.

xlsx pakette akışları yazdığınız için something vardır:

akış yazma fonksiyonları XLSX.stream nesne mevcuttur. Normal yazma işlevleri ile aynı argümanları alırlar ancak okunabilir bir akışa geri dönerler. Sadece düğümde açığa çıkarlar.

XLSX.stream.to_csv, XLSX.utils.sheet_to_csv dosyasının akış sürümüdür.

XLSX.stream.to_html, XLSX.utils.sheet_to_html dosyasının akış sürümüdür.

Ben Pro sürümü o vardır yapmak sormamın desteklemek için yazdığı ve bu cevabı aldık:

zip formatında, XLSX kullanılan, okuma gerçek akışını engeller (eğer sonuna kadar okumak zorunda Tüm alt dosyaların nerede olduğunu öğrenmek için dosyanın https://github.com/thejoshwolfe/yauzl#no-streaming-unzip-api'un aşırıcı dilini kullanmazdım, ancak çekirdek mesaja katılıyorum:

Akış unzip API'sı sunan herhangi bir kütüphane ya dürüst olmayan ya da uyuşmayan (genellikle ikincisi).

Tüm çalışma kitabı nesnesini atlayan olay tabanlı okuma sunuyoruz. Satır nesneleri alırsınız ve bu da bellek basıncını en aza indirir.

Yazma tarafında, SpreadsheetML ve diğer biçimlerin yanı sıra akış tabanlı XLSX yazımı sunuyoruz.Benim durumumda

herşeyi = (

yeniden yazdı zorunda