Экспортированная формула Excel из alasql не работает

На моей 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 или в API alasql?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
232
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для:

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

Проверяем типы данных для alasql ничего нет например. xlfunction так что string ваш лучший выбор для столбца c.

Таким образом, проблема должна заключаться в самом alasql, который использует библиотеку xlsx для создания книги Excel. Смотрите здесь в функции 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++;
}

Если значение представляет собой строку и начинается с =, то скажите XLSX выводить так, как Excel знает, что это формула (и отрезать =). В противном случае просто сделайте то, что уже делает alasql. Кстати, это непроверенный, плохо реализованный хак, но ИМХО ответ на ваш вопрос.

Если вы взломаете это в файле alasql.fs.js в node_modules, ваш исходный код будет работать так, как вы ожидаете.

Я взял на себя смелость поднять вопрос в проекте alasql по этому поводу.

Привет, @robin. Я попробовал это, обновив alasql.js, после обновления кеша и после загрузки формулы excel, которая показывает, как она выглядит, мне нужно нажать Enter, чтобы получить результат

Jigar Parekh 29.12.2020 12:08

@JigarParekh - мне пришлось внести изменения в alasql.fs.js. Сначала я попробовал alasql.js, и это не сработало для меня. Кэш не трогал.

Robin Mackenzie 29.12.2020 12:22

Другие вопросы по теме