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这个问题
在我的 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这个问题