JScript使用Excel TextToColumns

我一直在努力使这个小片段工作,但我一直在失败悲惨。 该脚本似乎工作正常,但事情是:我需要第三列(数字的一个)被转换为文本。

看看Excel中的帮助页面,似乎“数组(3,2)”部分将使它成为可能,但即使尝试了很多这个函数的数字和参数的组合,我不能使它的工作。

任何帮助这个问题?

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"),1,1,false,false,false,true,false,false,Array(3, 2)); 

这里有两个问题。

第一个问题是您正在使用FieldInfo参数的格式不正确。 该参数应该是一个数组的数组。 这种数组的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)) 

(在我的testing中,我必须指定所有三列,如果你不关心其他列,请将xlGeneralFormat的每个数组的第二项设置为1)。

但是,并不是那么简单,因为像大多数COM对象那样,Excel需要数组是一个SAFEARRAY结构。 在VBScript中,这不是问题,因为它的数组是使用SAFEARRAYs实现的,但在JScript中,数组本质上是一种特殊types的对象,不易转换为SAFEARRAY(您可以从Eric Lippert的博客如果你想要更多的细节)。 没有将JScript数组转换为SAFEARRAY的内置方法,尽pipe有解决方法(例如,请参阅此SO问题 )。

第二个问题是你实际上缺less一个参数OtherChar 。 即使文档声明只有当OtherTrue时,此参数才是必需的,但仍然需要提供一些值,因为JScript中没有可选参数。 在下面的示例中,我展开了函数调用,并使用文档中的参数名称来标记每行,以便清楚地说明:

 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://stackoverflow.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(); } 

FieldInfo参数需要是一个数组Array,而不是在您调用本地JScript Array构造函数时不需要新build的东西。

所以通过单独修改列来降低复杂性:

 app.Range("A1").EntireColumn.TextToColumns(app.Range("B1"),1,1,false,false,false,true,false,false); app.Range("D1").EntireColumn.NumberFormat = "@"