На моей 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?
Для:
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 по этому поводу.
@JigarParekh - мне пришлось внести изменения в alasql.fs.js
. Сначала я попробовал alasql.js
, и это не сработало для меня. Кэш не трогал.
Привет, @robin. Я попробовал это, обновив alasql.js, после обновления кеша и после загрузки формулы excel, которая показывает, как она выглядит, мне нужно нажать Enter, чтобы получить результат