2016-07-06 4 views
8

В одной книге (от кого-то еще), что мне нужно проанализировать, что они используют формулу для построения списка строк: 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 i сам не систематически преобразовывает эти значения в даты. Например, если мы стоим только для копирования 04-09-01 в другую ячейку. Excel действительно поднимает предупреждение и предлагает преобразовать его в дату, но пользователи также могли игнорировать это предупреждение и сохранить 04-09-01 как это:

enter image description here

Так что мой вопрос, есть ли способ или обходной путь, чтобы отключить это автоматическое преобразование в JavaScript API, чтобы мы могли точно копировать значения?

Edit 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-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; }) 
     }); 
} 
+0

Вы можете также попробовать 'CoercionType .Text' показан здесь https://msdn.microsoft.com/en-us/magazine/jj891051.aspx – Slai

ответ

0

Вы можете скопировать формат номера после того, как, так что, возможно, что-то вроде:

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; 
     }) 
    }); 
} 
+0

ОК, это работает ... кажется, что мы могли бы также упростить это для '.then (function() {r1.numberFormat =" @ "; r1.values ​​= r0.values; r1.numberFormat = r0.numberFormat;}) '. Таким образом, основная идея заключается в том, что «задайте формат номера диапазона в текст (« @ »). Прежде чем применять значения, значения должны оставаться такими же, как и', а затем мы применяем действительный номерFormat ... – SoftTimur

+0

Кажется, что вы изменили ваш код. Вам нужно вставить в середине 'r0.load ([" values ​​"," numberFormat "]);' и 'return ctx.sync(). Then (' etc ... – SoftTimur

+0

ok .. примеры, которые я видел в Интернете казалось, что он может работать без них, и я тестировал его только в настольной версии Excel, которая не использует ничего подобного. – Slai

4

Вы должны быть в состоянии сделать один из двух вещей:

1) Если вы установите формат число диапазона в тексте («@»), прежде чем применять значения, значения должны остаться как есть.

2) Вы также можете добавить апостроф (') к началу текста, чтобы заставить Excel рассматривать его как обычный текст, независимо от того, как обычно обрабатывает его внутренний движок.

UPDATE

Там на самом деле две вещи, на карту здесь. Отображается текст в сравнении с базовым значением.

Чтобы получить текст, откройте свойство range.text (2D-массив). Это будет текст, отображаемый в пользовательском интерфейсе. Чтобы получить основное значение, доступ к свойству range.values ​​(также 2D-массив)

При копировании значения из одного места в другое, или хранить их, а затем восстановление, убедитесь, что для хранения как range.numberFormat и range.values , И затем верните их обратно, с .numberFormat first.

UPDATE 2

Смотрите скриншот ниже. Код работает так, как ожидалось.

enter image description here

~ Майкл Златковский, разработчик на офис расширяемости платформы, MSFT

+0

Как я могу «задать формат номера диапазона для текста (« @ »)' API JavaScript? – SoftTimur

+0

Проблема в том, что это конкретный пример, но в целом я не знаю, где эти двусмысленные значения и должны применяться (по API JavaScript) общее решение для всех значений, которые я хочу скопировать ... – SoftTimur

+0

Are вам нужно копировать значения из одного диапазона в другой или просто читать значения? –

Смежные вопросы