为:
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 关于这个。