2016-11-14 19 views
0

저는 javascript/angularJS 필드의 초보자입니다. 제발 저와 함께주세요 .xls/.xlsx 파일을 .zip 파일로 변환 할 방법이 필요합니다. jsZip 라이브러리를 사용합니다. 나는 .xls 파일을 생성하기 위해 alasql을 사용하고있다. 모든 xls 파일의 zip 파일을 만들 수있는 가능한 해결책을 찾아 보았지만 어떤 데모도 보지 못했습니다. (.txt 및 .doc 파일은 정상적으로 생성되지만 jsZip을 사용하면 .xls 파일이 열리지 않습니다.) 어떤 도움을 주시면 감사하겠습니다 !!.xls/xlsx 파일을 .zip 파일로 압축 jsZip

내가 필요한 것은 동적으로 생성 할 수있는 XLS 파일이며, 같은 파일은 압축

EDIT로 압축 할 수 : - 여기 (하지만 성공)

내가 노력 코드의 일부입니다
var newExcelData = {'Name':'abc'}; 
     //var res = alasql("SELECT * INTO XLSX('Summary.xlsx',{headers:true}) FROM ? ", [newExcelData]); 

     var zip = new JSZip(); 

     zip.file(alasql("SELECT * INTO XLSX('Summary.xlsx',{headers:true}) FROM ? ", [newExcelData])); 
     zip.generateAsync({ type: "blob" }) 
     .then(function (content) { 
      saveAs(content, "example.zip"); 
     }); 

추신 : - .xls 파일을 생성하는 경우 작동하도록 할 수 있습니다.

코드 아래를 참조하십시오 : -

var newExcelData = {'Name':'abc', 'Age':'12'}; 

      var zip = new JSZip(); 

      zip.file("test.xls", [newExcelData]); 
      zip.generateAsync({ type: "blob" }) 
      .then(function (content) { 
       saveAs(content, "example.zip"); 
      }); 

그러나 엑셀 시트가 생성되지만, 개방에 시트가 비어 엑셀

. 도와주세요 !!

안녕하세요, 여기에 업데이 트입니다 : - https://github.com/SheetJS/js-xlsx - - 내가 JS-XLSX 라이브러리를 사용하기 위해 노력했습니다

XLS 파일을 생성하고 다음을 압축. ..

function Create_Zip() { 

     function datenum(v, date1904) { 
      if (date1904) v += 1462; 
      var epoch = Date.parse(v); 
      return (epoch - new Date(Date.UTC(1899, 11, 30)))/(24 * 60 * 60 * 1000); 
     } 

     function sheet_from_array_of_arrays(data, opts) { 
      var ws = {}; 
      var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } }; 
      for (var R = 0; R != data.length; ++R) { 
       for (var 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; 
        var cell = { v: data[R][C] }; 
        if (cell.v === null) continue; 
        var 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'; 

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


     var data = [[1, 2, 3], [true, false, null, "sheetjs"], ["foo", "bar", new Date("2014-02-19T14:30Z"), "0.3"], ["baz", null, "qux"]]; 
     var ws_name = "SheetJS"; 

     function Workbook() { 
      if (!(this instanceof Workbook)) return new Workbook(); 
      this.SheetNames = []; 
      this.Sheets = {}; 
     } 

     var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); 

     /* add worksheet to workbook */ 
     wb.SheetNames.push(ws_name); 
     wb.Sheets[ws_name] = ws; 
     var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'binary' }); 

     function s2ab(s) { 
      var buf = new ArrayBuffer(s.length); 
      var view = new Uint8Array(buf); 
      for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; 
      return buf; 
     } 

     var jsonse = JSON.stringify([s2ab(wbout)]); 
     var testblob = new Blob([jsonse], { type: "application/json" }); 
     console.log(testblob); 


     var zip = new JSZip(); 

     zip.file("trial.xls", testblob); 

     var downloadFile = zip.generateAsync({ type: "blob" }); 
     saveAs(downloadFile, 'test.zip'); 

}

를 아래의 코드를 참조하지만, 여기에 문제는이 오류가 계속한다는 것입니다하시기 바랍니다 : trial.xls '의 데이터가'지원되지 않는 형식입니다! ' . 콘솔 :(내가이 일을 할 수있는 방법이 지금 내 순발력 끝에 해요 :(

+0

그냥이 참고로, XSLX 파일을 ZIP 파일이 이미 있습니다 그러나, wbout이 지원됩니다 바이너리 문자열입니다. 그들을 다시 압축하여 작게 만들려고한다면, 그것이 효과가 없다면 놀라지 마십시오. – Tomalak

+0

[Minimal, Complete, Verifiable example] (https://stackoverflow.com/help/mcve)을 만들 수 있습니까? ".xls 파일이 열리지 않습니다."어딘가에서 데이터가 손상 될 수 있지만 코드가 필요합니다. –

+0

안녕하세요 @ David 나는 위에서 시도한 접근법의 수정 된 코드 사본을 추가했습니다. (나는 xlsx 생성을 위해 alasql 라이브러리를 사용하고있다.) –

답변

1

되지 않음 대답 (아래 참조)하지만, 무슨 일이 일어나고 있는지에 대한 설명은?

파일을 추가하려면 JSZip에 Blob, Uint8Array 등과 같은 바이너리 컨텐트가 필요합니다. zip.file("test.xls", [newExcelData]); 행은 작동하지 않습니다. [newExcelData]은 바이너리 컨텐트가 아니고 js 객체의 배열입니다.

필요한 항목 그림은 입니다.은 xlsx 파일의 내용을 가져 오는 방법입니다. SELECT * INTO XLSX('Summary.xlsx')은 다운로드를 실행하고 1을 반환합니다. 너를 원해. 내 편을 검색했지만 alasql을 사용하여 검색하는 방법을 찾을 수 없습니다.

한 번/솔루션을 찾으면 JSZip 부분이 올바르게 보입니다. 당신은 물방울 입력을 지원하지 않습니다 (JS-XLSX에 필요한) JSZip v2가 사용

: JS-XLSX에 스위치 다음

편집.

zip.file("trial.xls", wbout, {binary: true}); 

그런 다음, zip.generateAsync 교체 (JSZip v3에서 추가) :

var downloadFile = zip.generate type: "blob" }); 
saveAs(downloadFile, 'test.zip'); 
+0

안녕하세요, 다른 모든 js 라이브러리를 대신 사용할 수있는 alasql 파일을 생성하는 데 사용할 수 있습니까? 그러면 jsZip과의 통합이 쉬워 질 것입니까? –

+0

안녕하세요 @ David, 나는 js-xlsx 라이브러리 - github.com/SheetJS/js-xlsx - xls 생성 및 압축을 사용하려고했습니다. 그러나 콘솔 오류가 발생합니다. 이것이 내가 따라야 만하는 접근인가? 위의 코드가 작동하도록하는 방법은 무엇입니까? (P.S : 데이터를 BLOB 객체로 변환하려고 시도했지만 콘솔에서 오류가 발생했습니다.) –

+0

js-xlsx로 답변을 업데이트했습니다. –