这里有两个问题。
第一个问题是您用于FieldInfo 参数的格式不正确。参数应该是一个array-of-arrays。这种数组的 JScript 格式如下所示:
// 2 = xlTextFormat
[[1, 2], [2, 2], [3, 2]]
// or, if you prefer using the Array() function:
Array(Array(1, 2), Array(2, 2), Array(3, 2))
(在我的测试中,我必须指定所有三列。如果您不关心其他列,请将 xlGeneralFormat 的每个数组的第二项设置为 1。)
然而,事情并没有那么简单,因为 Excel 与大多数 COM 对象一样,期望数组是 SAFEARRAY 结构。在 VBScript 中,这不是问题,因为它的数组是使用 SAFEARRAY 实现的,但在 JScript 中,数组本质上是一种特殊类型的对象,不容易转换为 SAFEARRAY(如果需要,您可以在 this article from Eric Lippert's blog 中阅读更多内容)更多细节)。没有将 JScript 数组转换为 SAFEARRAY 的内置方法,但有一些变通方法(例如,请参阅 this SO question)。
第二个问题是您实际上缺少一个参数,OtherChar。尽管文档声明仅当 Other 为 True 时才需要此参数,但您仍然必须提供一些值,因为 JScript 中没有可选参数。在下面的示例中,我扩展了函数调用并使用documentation 中的参数名称标记了每一行以使其清晰:
var app = new ActiveXObject("Excel.Application");
app.Visible = true;
var xls = app.Workbooks.Add();
app.Cells(1, 1).Value = "Olympia, WA, 123";
app.Cells(2, 1).Value = "Salem, OR, 3434";
app.Cells(3, 1).Value = "Boise, ID, 342";
app.Cells(4, 1).Value = "Sacramento, CA, 3";
app.Range("A1").EntireColumn.TextToColumns(
app.Range("B1"), // Destination
1, // DataType
1, // TextQualifier
false, // ConsecutiveDelimiter
false, // Tab
false, // Semicolon
true, // Comma
false, // Space
false, // Other
'', // OtherChar
getSafeArray([
getSafeArray([1, 2]),
getSafeArray([2, 2]),
getSafeArray([3, 2])
]) // FieldInfo
);
// ref: https://*.com/a/5910730
function getSafeArray(jsArr) {
var dict = new ActiveXObject("Scripting.Dictionary");
for (var i = 0; i < jsArr.length; i++)
dict.add(i, jsArr[i]);
return dict.Items();
}