alasql 导出 excel 公式无效

alasql exported excel formula not working

在我的 html 页面上,我使用以下代码创建和下载 excel 文件。 我正在用很多公式创建这个动态文件。

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');

此代码可以正常生成 excel。但是当我打开 excel 时,C1 单元格的内容是 =A1+B1 如果我按下回车键,它会计算值。我想评估所有单元格的这个值。你能指导我是否需要在 excel 或 alasql API 中更改某些内容吗?

对于:

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

正在检查 the data types 是否存在 alasql,例如xlfunction 所以 string 是第 c 列的最佳选择。

所以,问题一定出在 alasql 本身,它利用名为 xlsx 的库来创建 Excel 工作簿。 See here in the prepareSheet function:

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

没有什么可以检查单元格是否应该被标记为公式并且只考虑数字、字符串、布尔值和日期(与数据类型文档合理一致)。

在 XLSX 库中,it's straightforward to flag a cell as a formula。所以我们可以将其应用于 alasql 代码,例如

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

如果该值是一个字符串,并且以 = 开头,则告诉 XLSX 以 Excel 知道它是一个公式的方式输出(并砍掉 =)。否则,只做 alasql 已经在做的事情。顺便说一下,这是一个未经测试、实施不佳的 hack - 但恕我直言,这是您问题的答案。

如果您将其破解到 node_modules 中的 alasql.fs.js 文件中,那么您的原始代码将按您期望的方式工作。

我在alasql项目中冒昧raising an issue这个问题