我正在为一个可Map的电子表格导出功能创建一些客户端函数。 我使用jQuery来管理列的排序顺序,但每列的排序方式都类似于Excel电子表格,即a b c d e......x y z aa ab ac ad等 我怎样才能把一个数字生成为一个字母?我应该定义一个固定的值数组吗?还是有一个动态的方法来生成它?
function getColumnDescription(i) {
const m = i % 26;
const c = String.fromCharCode(65 + m);
const r = i - m;
return r > 0
? `${getColumnDescription((r - 1) / 26)}${c}`
: `Column ${c}`
}
function getSpreadSheetCellNumber(row, column) {
let result = '';
// Get spreadsheet column letter
let n = column;
while (n >= 0) {
result = String.fromCharCode(n % 26 + 65) + result;
n = Math.floor(n / 26) - 1;
}
// Get spreadsheet row number
result += `${row + 1}`;
return result;
};
8条答案
按热度按时间uz75evzq1#
我觉得你在找这样的东西
k2fxgqgv2#
这是一个非常简单的方法:
p5fdfcr13#
用法:
ruarlubt4#
如果您将数据放在二维数组中,例如
您可以将行/列Map到电子表格单元格编号,如下所示(基于上面的代码示例):
例如,数据[0][0]中的“天”值将进入电子表格单元格A1。
这也适用于超过26列的情况:
jutyujz05#
假设
numbers
中包含列的编号,可以使用如下代码,因此在这段代码之后,您将获得列的字符串名称:14ifxucb6#
简单递归解:
ncgqoxb07#
下面是一个依赖于
.toString(26)
的替代方法,它使用到base-26的转换,然后转换字符,使它们在a..z
范围内:∮ ∮关于神奇的数字∮
神奇值“ooooooooop 0”的推导如下:
Number.MAX_SAFE_INTEGER
附近达到最大值(更大的整数会出现舍入误差),因此不需要比所选的更长的“o”序列。我们可以看到Number.MAX_SAFE_INTEGER.toString(26)
有12位,因此可以确保精度达到11位(基数为26),这意味着我们需要9个“o”。更通用
上面的幻数可以通过代码推导出来,我们可以通过提供目标字母表使它更通用,目标字母表的长度也直接决定了基数(即字符串中的字符数)。
下面是与上面生成的相同的输出,但使用了更通用的函数:
这现在可以容易地适用于使用更简化的目标字母表(例如没有字母“l”和“o”),给出基数24而不是26:
nxowjjhe8#
这涵盖了从1到1000的范围。超过这一点我还没有检查。
我可能错了,但是我检查了这个答案中的其他函数,它们似乎在26处失效,应该是Z,记住字母表中有26个字母,而不是25个。