【问题标题】:alasql exported excel formula not workingalasql导出的excel公式不起作用
【发布时间】:2020-12-22 16:34:12
【问题描述】:

在我的 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。但是当我打开 C1 单元格的 excel 内容是 =A1+B1 如果我按 Enter 键,它将评估该值。我想评估所有单元格的这个值。能否请您指导我是否需要在 excel 或 alasql API 中更改某些内容?

【问题讨论】:

    标签: javascript jquery excel excel-formula alasql


    【解决方案1】:

    为:

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

    检查 the data types 的 alasql 没有任何内容,例如xlfunction 所以stringc 列的最佳选择。

    因此,问题一定出在 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 关于这个。

    【讨论】:

    • 嗨@robin我尝试通过在alasql.js中更新,刷新缓存后下载excel公式显示为,我需要按Enter键得到结果
    • @JigarParekh - 我必须在 alasql.fs.js 中进行更改。我首先尝试了alasql.js,但这对我不起作用。没有触及缓存。
    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2016-04-07
    相关资源
    最近更新 更多