Sof*_*mur 8 ms-office office-js
在一个工作簿(从别人),我需要分析,他们用一个公式来构造字符串列表:04-09-01,04-09-02,04-09-03等,这些都general为格式.在我的部分代码中,我需要将这些值复制到其他地方.但是,因为这些值是相当特殊的,它们会被自动视为Date(而他们显然不是日期用户),并转化为09/04/2001,09/04/2002,09/04/2003等等.因此,这些值完全改变,以及基于这些粘贴值计算导致错误.
这是一个测试代码:
function test () {
Excel.run(function (ctx) {
var r0 = ctx.workbook.worksheets.getItem("Sheet1").getRange("A2:A10");
var r1 = ctx.workbook.worksheets.getItem("Sheet1").getRange("F2:F10");
r0.load(["values"]);
return ctx.sync()
.then(function () { console.log(r0.values.toString()); r1.values = r0.values; })
.then(ctx.sync)
.then(function () { r1.load(["values"]); })
.then(ctx.sync)
.then(function () { console.log(r1.values.toString()); })
});
}
Run Code Online (Sandbox Code Playgroud)
控制台中的结果显示值已完全更改:
在Excel中,它显示:
请注意,Excel本身并不会系统地将这些值转换为日期.例如,如果我们仅值复制04-09-01到另一个单元格.Excel确实会发出警告并建议将其转换为日期,但用户可以忽略此警告并保持04-09-01原样:
所以我的问题是,是否有一种方法或解决方法可以在JavaScript API中禁用此自动转换,以便我们可以忠实地复制值?
编辑1:
我试图用来numberFormat保持范围的初始格式.首先,我将格式A2:A0如下所示General.
然后,我运行以下代码:
function test () {
Excel.run(function (ctx) {
var r0 = ctx.workbook.worksheets.getItem("Sheet1").getRange("A2:A10");
var saveValues, saveNumberFormat;
r0.load(["values", "numberFormat"]);
return ctx.sync().then(function () {
saveNumberFormat = r0.numberFormat;
saveValues = r0.values;
r0.numberFormat = saveNumberFormat;
r0.values = saveValues;
});
});
}
Run Code Online (Sandbox Code Playgroud)
结果结果如下,并具有Date格式.
那么恢复numberFormat并没有帮助吗?
编辑2:我做了一个将范围复制到另一个范例的例子.我想要r1具有完全相同的数字格式和值r0.但结果显示,04-09-01如general在r0生产04/09/2001如Date中r1.所以基本上,问题与前面的例子相同:numberFormat无法忠实地复制或恢复.
function test () {
Excel.run(function (ctx) {
var r0 = ctx.workbook.worksheets.getItem("Sheet1").getRange("A2:A10");
var r1 = ctx.workbook.worksheets.getItem("Sheet1").getRange("K2:K10");
r0.load(["values", "numberFormat"]);
return ctx.sync()
.then(function () { r1.numberFormat = r0.numberFormat; })
.then(ctx.sync)
.then(function () { r1.values = r0.values; })
});
}
Run Code Online (Sandbox Code Playgroud)
你应该可以做两件事之一:
1)如果将范围的数字格式设置为文本("@"),则在应用值之前,值应保持原样.
2)您还可以在文本的开头添加撇号('),以强制Excel将其视为纯文本,而不管内部引擎通常将其视为什么.
UPDATE
实际上有两件事情在这里.显示的文本与基础值相对应.
要获取文本,请访问range.text属性(2D数组).这将是UI中显示的文本.要获取基础值,请访问range.values属性(也是2D数组)
如果要将值从一个位置复制到另一个位置,或者存储它们然后还原,请确保同时存储range.numberFormat和range.values.然后首先使用.numberFormat恢复它们.
更新2
请参见下面的截图.代码按预期工作.
~Michael Zlatkovsky,Office可扩展性平台开发人员,MSFT
您可以在之后复制数字格式,因此可能类似于:
function test () {
Excel.run(function (ctx) {
var ws = ctx.workbook.worksheets.getItem("Sheet1");
var r0 = ws.getRange("A2:A10");
var r1 = ws.getRange("K2:K10");
r0.load(["values", "numberFormat"]);
return ctx.sync().then(function () {
r1.numberFormat = "@";
r1.values = r0.values;
r1.numberFormat = r0.numberFormat;
})
});
}
Run Code Online (Sandbox Code Playgroud)