alasql yang diekspor formula excel tidak berfungsi

Dec 23 2020

Di halaman html saya, saya menggunakan kode di bawah ini untuk membuat dan mengunduh file excel. Saya membuat file dinamis ini dengan banyak formullas.

let db = new alasql.Database('TEMPDB');
db.exec('create table tempexcel(A string,B string, c string)');
db.exec('insert into tempexcel("5","6","=A1+B1")');
db.exec('select * INTO XLSX("tempex.xlsx",{headers:false})  from tempexcel');

Kode ini berfungsi dengan baik untuk menghasilkan excel. Tetapi ketika saya membuka konten excel untuk sel C1 adalah = A1 + B1 Jika saya menekan enter di atasnya, itu akan mengevaluasi nilainya. Saya ingin mengevaluasi nilai ini untuk semua sel. bisakah Anda memandu apakah saya perlu mengubah sesuatu di excel atau di alasql API?

Jawaban

1 RobinMackenzie Dec 23 2020 at 20:12

Untuk:

db.exec('create table tempexcel(A string,B string, c string)');

Memeriksa tipe data untuk alasql tidak ada apa-apa misalnya xlfunctionbegitu stringjuga taruhan terbaik Anda untuk kolom c.

Jadi, masalahnya pasti ada dalam alasql itu sendiri yang memanfaatkan pustaka bernama xlsx untuk melakukan pembuatan buku kerja Excel. Lihat di sini di fungsi preparedSheet :

for (var j = 0; j < dataLength; j++) {
    columns.forEach(function(col, idx) {
        var cell = {v: data[j][col.columnid]};
        if (typeof data[j][col.columnid] == 'number') {
            cell.t = 'n';
        } else if (typeof data[j][col.columnid] == 'string') {
            cell.t = 's';
        } else if (typeof data[j][col.columnid] == 'boolean') {
            cell.t = 'b';
        } else if (typeof data[j][col.columnid] == 'object') {
            if (data[j][col.columnid] instanceof Date) {
                cell.t = 'd';
            }
        }
        cells[alasql.utils.xlsnc(col0 + idx) + '' + i] = cell;
    });
    i++;
}

Tidak ada yang perlu diperiksa apakah sel harus ditandai sebagai rumus dan hanya mempertimbangkan angka, string, boolean, dan tanggal (cukup konsisten dengan dokumentasi tipe data).

Di pustaka XLSX, langsung menandai sel sebagai rumus . Jadi kita bisa menerapkannya ke kode alasql mis

for (var j = 0; j < dataLength; j++) {
    columns.forEach(function (col, idx) {
        var isFormula = false; 
        var d = data[j][col.columnid];
        var cell;
        if (typeof d == 'string') {
            isFormula = d.substr(0, 1) == '=';
        }
        if (!isFormula) {
            cell = {v: data[j][col.columnid]};
            if (typeof data[j][col.columnid] == 'number') {
                cell.t = 'n';
            } else if (typeof data[j][col.columnid] == 'string') {
                cell.t = 's';
            } else if (typeof data[j][col.columnid] == 'boolean') {
                cell.t = 'b';
            } else if (typeof data[j][col.columnid] == 'object') {
                if (data[j][col.columnid] instanceof Date) {
                    cell.t = 'd';
                }
            }   
        } else {
            cell = {f: d.substr(1, d.length - 1)};
        }           
        cells[alasql.utils.xlsnc(col0 + idx) + '' + i] = cell;
    });
    i++;
}

Jika nilainya adalah string, dan dimulai dengan, =beri tahu XLSX untuk mengeluarkan dengan cara yang diketahui Excel sebagai rumus (dan potong =). Jika tidak, lakukan saja apa yang telah dilakukan alasql. Ngomong-ngomong, itu adalah peretasan yang belum teruji dan diimplementasikan dengan buruk - tetapi IMHO jawaban atas pertanyaan Anda.

Jika Anda alasql.fs.jsmeretasnya ke dalam file di node_modules maka kode asli Anda akan berfungsi seperti yang Anda harapkan.

Saya mengambil kebebasan untuk mengangkat masalah dalam proyek alasql tentang ini.