如何从nodejs终端下载excel文件

时间:2017-04-22 17:34:47

标签: node.js mocha

我是nodejs的新手。需要你的帮助。从nodejs终端,我想下载一个excel文件并将其转换为csv(比如mocha online.js)。注意:我不想通过浏览器这样做。

下面是我正在下载并转换为csv的脚本。没有错误也没有预期的结果:

online.js

if (typeof require !== 'undefined') XLSX = require('xlsx');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

/* set up XMLHttpRequest */
var url = "http://oss.sheetjs.com/js-xlsx/test_files/formula_stress_test_ajax.xlsx";
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "arraybuffer";
describe('suite', function () {
    it('case', function () {
    var arraybuffer = xhr.response;

    /* convert data to binary string */
    var data = new Uint8Array(arraybuffer);
    var arr = new Array();
    for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
    var bstr = arr.join("");

    /* Call XLSX */
    var sheetName = 'Database';
    var workbook = XLSX.read(bstr, { type: "binary" });
    var worksheet = workbook.Sheets[sheetName];
    var csv = XLSX.utils.sheet_to_csv(worksheet);
    console.log(csv);
    xhr.send();  
    //.... perform validations here using the csv data 
    });
})}

3 个答案:

答案 0 :(得分:0)

我实际上在3个月前遇到了同样的问题:这就是我做的!

我没有找到任何完全符合我想要的nodeJS模块,所以我用in2csv(一个python shell程序)来转换数据; t选项是使用制表作为分隔符

1)步骤1:使用in2csv将xlsx文件转换为csv 此代码获取当前目录中的所有xlsx文件,将它们转换为csv文件并将它们放在另一个目录中

var shelljs = require('shelljs/global')
var dir = pwd().stdout.split('/')
dir = dir[dir.length - 1].replace(/\s/g, '\\ ')
mkdir('../'+ dir + 'CSV')
ls('*.xlsx').forEach(function(file) {
// below are the two lines you need
    let string = 'in2csv -t ' + file.replace(/\s/g, '\\ ') + ' > ../'+ dir + 'CSV/' + file.replace('xlsx','csv').replace(/\s/g, '\\ ')
    exec(string, {silent:true}, function(code, stdout, stderr){
        console.log('new file : ' + file.replace('xlsx','csv'))
        if(stderr){
            console.log(string)
            console.log('Program stderr:', stderr)
        }
    })
});

步骤2:在nodejs程序中加载数据:

我的剧本很长,但主要的两行是:

const args = fileContent.split('\n')[0].split(',')
const content = fileContent.split('\n').slice(1).map(e => e.split(','))

答案 1 :(得分:0)

我尝试使用此代码,似乎它正常工作,唯一的事情是我花了15分钟试图理解为什么我的开放式办公室不会打开文件,我最终明白他们发送了一个zip文件。 ..这里是完整的代码,http get函数的文档在这里http.get

您可以使用request模块,但它不是原生的,但请求更容易。

享受!

const url = 'http://oss.sheetjs.com/js-xlsx/test_files/formula_stress_test_ajax.xlsx'
const http = require('http')
const fs = require('fs')

http.get(url, (res) => {
    debugger
    const {
        statusCode
    } = res;
    const contentType = res.headers['content-type'];
    console.log(`The type of the file is : ${contentType}`)
    let error;
    if (statusCode !== 200) {
        error = new Error(`Request Failed.\n` +
            `Status Code: ${statusCode}`);
    }
    if (error) {
        console.error(error.message);
        // consume response data to free up memory
        res.resume();
        return;
    }
    res.setEncoding('binary');
    let rawData = '';
    res.on('data', (chunk) => {
        rawData += chunk;
    });
    res.on('end', () => {
        try {
            const parsedData = xlsxToCSVFunction(rawData);
            // And / Or just put it in a file
            fs.writeFileSync('fileName.zip', rawData, 'binary')
                // console.log(parsedData);
        } catch (e) {
            console.error(e.message);
        }
    });
}).on('error', (e) => {
    console.error(`Got error: ${e.message}`);
});


function xlsxToCSVFunction(rawData) {
    return rawData //you should return the csv file here whatever your tools are
}

答案 2 :(得分:0)

为了像我这样的求职者的利益...... here is a solution using mocha, request and xlsx

var request = require('request');
var XLSX = require('xlsx');
describe('suite', function () {
    it('case', function (done) {
        var url = "http://oss.sheetjs.com/js-xlsx/test_files/formula_stress_test_ajax.xlsx";
        var options = {
          url: url,
          headers: {
              'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
          },
          encoding: null
        };     
        request.get(options, function (err, res, body){
          var arraybuffer = body;
          /* convert data to binary string */
          var data = arraybuffer;            
          //var data = new Uint8Array(arraybuffer);                
          var arr = new Array();
          for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
          var bstr = arr.join("");
          /* Call XLSX */
          var sheetName = 'Database';
          var workbook = XLSX.read(bstr, { type: "binary" });
          var worksheet = workbook.Sheets[sheetName];
          var csv = XLSX.utils.sheet_to_csv(worksheet);
          console.log(csv);
          done();
        });
    });
});