V
V
vaskadogana2017-10-20 16:58:33
JavaScript
vaskadogana, 2017-10-20 16:58:33

Who faced the generation of xlsx file with styles? Why does it come out without styles?

I found this example https://github.com/nithin-baby/js-xlsx-style/blob/...
copy-pasted, but it produces a file without styles (
Can someone tell me

import * as XLSX from 'xlsx';
import FileSaver	 from 'file-saver'

export default  function generateXLSX(json){
save()

}


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';
      
      if(C == 0){
        cell.s={
          font:{
            bold:true
          }
        }
      }
      if(R == 0){
        cell.s={
          fill:{
            fgColor:{ rgb: "FFFFAA00" }
          }
        }
      }
      
      ws[cell_ref] = cell;
    }
  }
  if(range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  return ws;
}
 

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

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;
}

function save(){
  /* original data */
  var data = 
  var ws_name = "SheetJS";
   
  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'});

  FileSaver.saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), "sample.xlsx")
}

ps by the way if you just need an xlsx file - zipcelx is a great solution

Answer the question

In order to leave comments, you need to log in

2 answer(s)
V
vaskadogana, 2017-10-23
@vaskadogana

It was necessary to use the xlsx-style library instead of xlsx
However, there is a bug in it, you need to fix the following
xlsx-style/dist/cpexcel.js file.

(function(root, factory){ "use strict"; if(typeof cptable === "undefined") { if(typeof require !== "undefined"){
 var cpt = require('cpt' + 'able');   <<-- 
на var cpt = cptable;

well, the webpack settings slightly corrected the full list of my bugs, if anyone needs it

D
Danil Mishin, 2017-11-01
@Dangear

To generate an xlsx file with styles, I used excel4node
You can merge cells and adjust their height / width and change the font and set the background of the cell

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question