как установить формулу для данных ячейки для (экспорт в .xlsx) SheetJS js-xlsx: https://github.com/SheetJS/js-xlsx

Ссылаясь на этот пример https://github.com/SheetJS/js-xlsx/blob/master/tests/write.js , у него нет реализации для формулы ячейки в электронной таблице xlsx. Я пытался использовать cell.f = "=SUM(A1+B1)" для ячейки C1 и cell.v как значение суммы, равное 3. Но мне это не удалось. В экспортированном файле при открытии в MS Excel ячейка содержала только данные и при выборе не отображала никакой формулы, которую я назначил в поле f (x).

Может ли кто-нибудь опубликовать мне пример, который на самом деле использует функции/свойство '.f' и 'cellFormula'

Будет очень полезно. Мне просто нужен рабочий пример со статическими значениями.


person neeraj    schedule 08.04.2015    source источник


Ответы (2)


Объект ячейки имеет свойство f, которое представляет собой формулу, которую вы хотите использовать. Здесь вы можете увидеть все варианты: https://github.com/SheetJS/js-xlsx#cell-object.

А вот пример использования формулы:

var xlsx = require('xlsx');

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

var exportBook = new Workbook();

var worksheet = {};

var cell = {f: 'A2+A3'};

var cellRef = xlsx.utils.encode_cell({r:0, c:0});

var range = {s:{r: 0, c: 0},
            e: {r: 10, c: 10}};



worksheet[cellRef] = cell;
worksheet['!ref'] = xlsx.utils.encode_range(range);

exportBook.SheetNames.push('test');
exportBook.Sheets.test = worksheet;


xlsx.writeFile(exportBook, 'formula sample.xlsx');

Здесь A1 должна иметь формулу A2+A3.

Надеюсь, поможет :)

person jgabrielfaria    schedule 03.10.2015

Вот мое решение

function download() {
    TheResourceService.get({ xId: $stateParams.xId }, function(result) {
        var sheetName = 'first_sheet';
        var wopts = { bookType: 'xlsx', bookSST: true, type: 'binary' };
        var fileName = "the_excel_file.xlsx";

        var columns = ['id', 'name', 'point'];
        var data = [
            [1, 'Kyle', 20],
            [2, 'Allen', 32],
            [3, 'Chris', 18],
            [4, 'Tim', 11]
        ];

        var wb = XLSX.utils.book_new();
        var ws = uigrid_to_sheet(data, columns);

        ws['!ref'] = XLSX.utils.encode_range({
            s: { c: 0, r: 0 },
            e: { c: 3, r: 1 + data.length + 1 }
        });
        ws['C6'] = { f: 'SUM(C2:C5)' };
        ws['B6'] = { v: 'Total' };

        XLSX.utils.book_append_sheet(wb, ws, sheetName);
        var wbout = XLSX.write(wb, wopts);
        saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), fileName);
    })

}


function uigrid_to_sheet(data, columns) {
    var o = [],
        oo = [],
        i = 0,
        j = 0;

    /* column headers */
    for (j = 0; j < columns.length; ++j) oo.push((columns[j]));
    o.push(oo);

    /* table data */
    for (i = 0; i < data.length; ++i) {
        oo = [];
        for (j = 0; j < data[i].length; ++j) oo.push((data[i][j]));
        o.push(oo);
    }
    /* aoa_to_sheet converts an array of arrays into a worksheet object */
    return XLSX.utils.aoa_to_sheet(o);
}

function s2ab(s) {
    if (typeof ArrayBuffer !== 'undefined') {
        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;
    } else {
        var buf = new Array(s.length);
        for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
        return buf;
    }
}
person Mirza    schedule 03.08.2017