alasqlエクスポートされたExcel式が機能しない

Dec 23 2020

私のhtmlページでは、以下のコードを使用してExcelファイルを作成およびダウンロードしています。私はこの動的ファイルをたくさんの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');

このコードはExcelを生成するために正常に機能しています。しかし、C1セルのExcelコンテンツを開くと、= A1 + B1になります。Enterキーを押すと、値が評価されます。すべてのセルについてこの値を評価したいと思います。ExcelまたはalasqlAPIで何かを変更する必要があるかどうかをガイドしていただけますか?

回答

1 RobinMackenzie Dec 23 2020 at 20:12

にとって:

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

alasqlのデータ型をチェックするxlfunctionことstringは何もありません。たとえば、列に対する最善の策cです。

したがって、問題は、xlsxと呼ばれるライブラリを利用してExcelワークブックを作成するalasql自体にある必要があります。こちらのprepareSheet関数を参照してください。

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ライブラリでは、セルに数式としてフラグを立てるのは簡単です。したがって、それを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++;
}

値が文字列で、で始まる場合は、=Excelが数式であることを認識できる方法で出力するようにXLSXに指示します(そして、を切り落とします=)。それ以外の場合は、alasqlがすでに実行していることを実行してください。ちなみに、これはテストされておらず、実装が不十分なハックですが、私見ではあなたの質問に対する答えです。

それをalasql.fs.jsnode_modulesのファイルにハックすると、元のコードは期待どおりに機能します。

私はこれについてalasqlプロジェクトで問題を提起する自由を取りました。