2016-11-14 10 views
0

Я новичок в области javascript/angularJS, поэтому, пожалуйста, несите меня. Мне нужен способ конвертировать файлы .xls/.xlsx в .zip-файлы используя библиотеку jsZip. Я использую alasql для генерации файла .xls. Я просмотрел все возможные решения для создания zip-файла из всех xls-файлов, но не нашел ни одной демонстрации. (.txt и .doc файлы генерируются просто отлично, но файлы .xls не открываются, если используется jsZip). Любая помощь будет оценена!Сжатие файлов .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"); 
     }); 

PS: - Я могу заставить его работать в случае генерации файла .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"); 
      }); 

Но хотя первенствует лист генерируется на открытии Excel лист является пустым. Пожалуйста, помогите !!

Привет, вот обновление: -

Я пытался использовать JS-XLSX библиотеки - https://github.com/SheetJS/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

Просто FYI, XSLX файлы ZIP файлы уже. Если вы пытаетесь сделать их меньше, заново их заново, не удивляйтесь, если это не сработает. – Tomalak

+0

Не могли бы вы создать [Минимальный, полный и проверенный пример] (https://stackoverflow.com/help/mcve)? msgstr "файлы .xls не открываются" может быть повреждение данных где-то, но нам нужен код, который поможет вам. –

+0

привет @David Я добавил модифицированную копию кода, подход, который я пробовал выше. (Я использую библиотеку alasql для генерации xlsx). –

ответ

1

Не ответ (смотри ниже), но объяснение того, что происходит:

чтобы добавить файл, JSZip нуждается в бинарное содержимое (как Blob, Uint8Array и т.д.) линия zip.file("test.xls", [newExcelData]); не может работать, например:. [newExcelData] не бинарное содержимое, но массив JS объекта

Что вам нужно. вычисляет как, чтобы получить содержимое файла xlsx. SELECT * INTO XLSX('Summary.xlsx') вызовет загрузку и возврат 1, это не то, что y ou хотите. Я искал на своей стороне, но не могу найти способ сделать это с помощью alasql.

После того, как вы найдете решение, часть JSZip выглядит правильно.

Edit, после вашего перехода на JS-XLSX:

Вы используете JSZip v2 (необходимую JS-XLSX), который не поддерживает Blob входов. Однако wbout двоичная строка, которая поддерживается:

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

Затем замените zip.generateAsync (добавлено в JSZip v3):

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

привет, есть ли другая js-библиотека, которую я могу использовать вместо alasql для генерации файла excel? Это упростит интеграцию с jsZip? –

+0

Привет @David, я попытался использовать библиотеку js-xlsx - github.com/SheetJS/js-xlsx - для генерации и сжатия xls. Но я получаю ошибки консоли. Это подход, которым я должен следовать? Любой способ сделать вышеуказанный код работать? (P.S: Я даже попытался преобразовать данные в объект blob, но превысил ошибку на консоли.) –

+0

Я обновил свой ответ с помощью js-xlsx. –

 Смежные вопросы

  • Нет связанных вопросов^_^