В одной книге (от кого-то еще), что мне нужно проанализировать, что они используют формулу для построения списка строк: 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()); })
});
}
В результате в консоли показывает значения полностью изменены:
И в Excel, он показывает:
Обратите внимание, что Excel i сам не систематически преобразовывает эти значения в даты. Например, если мы стоим только для копирования 04-09-01
в другую ячейку. Excel действительно поднимает предупреждение и предлагает преобразовать его в дату, но пользователи также могли игнорировать это предупреждение и сохранить 04-09-01
как это:
Так что мой вопрос, есть ли способ или обходной путь, чтобы отключить это автоматическое преобразование в JavaScript API, чтобы мы могли точно копировать значения?
Edit 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
как 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; })
});
}
Вы можете также попробовать 'CoercionType .Text' показан здесь https://msdn.microsoft.com/en-us/magazine/jj891051.aspx – Slai