2016-10-05 5 views
1

Я использую Node.js и js-xlsx для генерации новых файлов Excel. Когда создается новый файл, я хочу, чтобы он был сохранен на локальном диске.Node.js - сохранить xlsx на диск

Этот код используется для создания и загрузки нового файла Excel, как его можно сохранить на диск?

FileManagement.generateExcelFile("xlsx-filtered-list", "error-sheet", finalResult, res); 

generateExcelFile(fileName, sheetName, data, res) { 
    const workSheet = sheet_from_array_of_arrays(data); 
    const workBook = new Workbook(); 

    workBook.SheetNames.push(sheetName); 
    workBook.Sheets[sheetName] = workSheet; 

    const workBookOptions = { bookType:'xlsx', bookSST:false, type:'binary' }; 
    const workBookFile = xlsx.write(workBook, workBookOptions); 

    res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
    res.setHeader('Content-Disposition', 'attachment; filename='+fileName); 
    res.end(workBookFile, 'binary'); 

    // Functions work Excel generation (don't touch) 
    function Workbook() { 
     if(!(this instanceof Workbook)) return new Workbook(); 
     this.SheetNames = []; 
     this.Sheets = {}; 
    } 

    function sheet_from_array_of_arrays(data) { 
     const workSheet = {}; 
     const range = {s: {c:10000000, r:10000000}, e: {c:0, r:0 }}; 
     for(let R = 0; R != data.length; ++R) { 
      for(let C = 0; C != data[R].length; ++C) { 
       if(range.s.r > R) range.s.r = R; 
       if(range.s.c > C) range.s.c = C; 
       if(range.e.r < R) range.e.r = R; 
       if(range.e.c < C) range.e.c = C; 
       const cell = {v: data[R][C] }; 
       if(cell.v == null) continue; 
       const cell_ref = xlsx.utils.encode_cell({c:C,r:R}); 

       if(typeof cell.v === 'number') cell.t = 'n'; 
       else if(typeof cell.v === 'boolean') cell.t = 'b'; 
       else if(cell.v instanceof Date) { 
        cell.t = 'n'; cell.z = xlsx.SSF._table[14]; 
        cell.v = datenum(cell.v); 
       } 
       else cell.t = 's'; 

       workSheet[cell_ref] = cell; 
      } 
     } 
     if(range.s.c < 10000000) workSheet['!ref'] = xlsx.utils.encode_range(range); 

     return workSheet; 
    } 
} 
+0

константные фс = требуется ('фс'); fs.writeFileSync ('./ public/uploaded-files/hello.xlsx', FileManagement.generateExcelFile ("error-list.xlsx", "error-sheet", filtersData [1], res)); Этот код записывает файл на диск, но он не может использоваться из-за ошибки расширения формата файла. – Nenson

ответ

1

Вот решение:

/* output format determined by filename */ 
XLSX.writeFile(workbook, 'out.xlsx'); 
/* at this point, out.xlsx is a file that you can distribute */ 
0

Вы также можете использовать следующий метод:

var FileSaver = require('file-saver') 

/* add worksheet to workbook */ 
wb.SheetNames[0] = 'Testing'; 
wb.Sheets['Testing'] = ws; //worksheet handle 

var wopts = { bookType:'xlsx', bookSST:false, type:'binary'}; 
var wbout = XLSX.write(wb,wopts); 

/* the saveAs call downloads a file on the local machine */ 
FileSaver.saveAs(new Blob([s2ab(wbout)],{type: ""}), "test.xlsx")