gpt4 book ai didi

ms-office - 禁用自动转换为日期

转载 作者:行者123 更新时间:2023-12-02 22:38:12 25 4
gpt4 key购买 nike

在我需要分析的一本工作簿(来自其他人)中,他们使用公式来构造字符串列表: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()); })
});
}

控制台中的结果显示值已完全更改:

enter image description here

在 Excel 中,它显示:

enter image description here

请注意,Excel 本身不会系统地将这些值转换为日期。例如,如果我们仅复制 04-09-01到另一个单元格。 Excel 确实会发出警告并建议将其转换为日期,但用户很可能忽略此警告并保留 04-09-01就这样:

enter image description here

所以我的问题是,有没有办法或解决方法来禁用 JavaScript API 中的这种自动转换,以便我们可以忠实地复制值?

编辑 1:

我尝试使用numberFormat保持范围的初始格式。首先,我输入A2:A0如下 General作为格式。

enter image description here

然后,我运行以下代码:

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作为格式。

enter image description here

因此恢复 numberFormat没有帮助吗?

编辑2:我做了一个将一个范围复制到另一个范围的示例。我要 r1具有与 r0 完全相同的数字格式和值。但结果显示04-09-01generalr0产生04/09/2001Dater1 。所以基本上,问题与前面的示例相同: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.numberFormatrange.values。然后使用 .numberFormat first 将它们恢复。

更新2

请参阅下面的屏幕截图。代码按预期工作。

enter image description here

~ Microsoft Office 可扩展性平台开发人员 Michael Zlatkovsky

关于ms-office - 禁用自动转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38225078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com