禁用自动转换为日期
Disable the automatic conversion to Date
在我需要分析的一个工作簿(来自其他人)中,他们使用公式构建字符串列表:04-09-01
、04-09-02
、04-09-03
等,格式为 general
。在我的部分代码中,我需要将这些值复制到其他地方。但是,由于这些值非常特殊,它们会自动被视为 Date
(而对于用户而言,它们显然不是日期)并转换为 09/04/2001
、09/04/2002
、09/04/2003
, etc. 因此,值完全改变,并且根据这些粘贴值计算会导致错误。
这是一个测试代码:
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()); })
});
}
控制台中的结果显示值已完全更改:
并且在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;
});
});
}
结果如下,格式为Date
所以 numberFormat
的恢复没有帮助?
编辑 2: 我做了一个将范围复制到另一个范围的示例。我希望 r1
具有与 r0
完全相同的数字格式和值。但是结果显示 04-09-01
as general
in r0
产生 04/09/2001
as Date
in 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; })
});
}
您应该能够执行以下两项操作之一:
1) 如果在应用值之前将范围的数字格式设置为文本 ("@"),则值应保持原样。
2) 您还可以在文本开头添加一个撇号 ('),以强制 Excel 将其视为纯文本,而不管内部引擎通常将其视为什么。
更新
这里实际上有两件事关系重大。有显示的文本与基础值。
要获取文本,请访问 range.text 属性(二维数组)。这将是 UI 中显示的文本。
要获取基础值,请访问 range.values 属性(也是一个二维数组)
如果您要将值从一个地方复制到另一个地方,或者存储它们然后恢复,请确保同时存储 range.numberFormat
和 range.values
。然后用 .numberFormat first.
恢复它们
更新 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;
})
});
}
在我需要分析的一个工作簿(来自其他人)中,他们使用公式构建字符串列表:04-09-01
、04-09-02
、04-09-03
等,格式为 general
。在我的部分代码中,我需要将这些值复制到其他地方。但是,由于这些值非常特殊,它们会自动被视为 Date
(而对于用户而言,它们显然不是日期)并转换为 09/04/2001
、09/04/2002
、09/04/2003
, etc. 因此,值完全改变,并且根据这些粘贴值计算会导致错误。
这是一个测试代码:
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()); })
});
}
控制台中的结果显示值已完全更改:
并且在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;
});
});
}
结果如下,格式为Date
所以 numberFormat
的恢复没有帮助?
编辑 2: 我做了一个将范围复制到另一个范围的示例。我希望 r1
具有与 r0
完全相同的数字格式和值。但是结果显示 04-09-01
as general
in r0
产生 04/09/2001
as Date
in 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; })
});
}
您应该能够执行以下两项操作之一:
1) 如果在应用值之前将范围的数字格式设置为文本 ("@"),则值应保持原样。
2) 您还可以在文本开头添加一个撇号 ('),以强制 Excel 将其视为纯文本,而不管内部引擎通常将其视为什么。
更新
这里实际上有两件事关系重大。有显示的文本与基础值。
要获取文本,请访问 range.text 属性(二维数组)。这将是 UI 中显示的文本。 要获取基础值,请访问 range.values 属性(也是一个二维数组)
如果您要将值从一个地方复制到另一个地方,或者存储它们然后恢复,请确保同时存储 range.numberFormat
和 range.values
。然后用 .numberFormat first.
更新 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;
})
});
}