2016-07-06 14 views
8

In una cartella di lavoro (da qualcun altro) che ho bisogno di analizzare, usano una formula per costruire una lista di stringhe: 04-09-01, 04-09-02, 04-09-03, ecc, che hanno general come formato. In una parte del mio codice, dovrò copiare questi valori in un'altra parte. Tuttavia, poiché questi valori sono piuttosto speciali, vengono automaticamente considerati come Date (mentre chiaramente non sono le date per gli utenti) e trasformati in 09/04/2001, 09/04/2002, 09/04/2003, ecc. Di conseguenza, i valori sono completamente modificati e il calcolo basato su questi valori incollati portano a errori.disattivare la conversione automatica ad oggi

Ecco un codice di prova:

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()); }) 
    }); 
} 

Il risultato nella console mostra i valori sono completamente cambiati:

enter image description here

e in Excel, si vede:

enter image description here

Si noti che Excel i tself NON trasforma sistematicamente questi valori in date. Ad esempio, se valutiamo solo valori, copia 04-09-01 in un'altra cella. Excel solleva un avvertimento e suggerisce di convertirlo in una data, ma gli utenti potrebbe ignorare questo avviso e mantenere 04-09-01 così com'è:

enter image description here

Quindi la mia domanda è: esiste un modo o soluzione per disabilitare questa conversione automatica nell'API JavaScript, così da poter copiare fedelmente i valori?

Edit 1:

ho cercato di usare numberFormat per mantenere i formati iniziali di un intervallo. Per prima cosa, inserisco A2:A0 come segue con General come formato.

enter image description here

Poi, eseguire il seguente codice:

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

Il risultato si è rivelato essere il seguente, e ha Date come formato.

enter image description here

Così il ripristino di numberFormat non aiuta?

Modifica 2: Ho fatto un esempio che copia un intervallo su un altro. Voglio che lo r1 abbia esattamente lo stesso formato numerico e valori come r0. Ma il risultato mostra che 04-09-01 come general in r0 produce 04/09/2001 come Date in r1. Quindi, in pratica, il problema è lo stesso dell'esempio precedente: numberFormat non può essere copiato o ripristinato fedelmente.

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

Si può anche provare il 'CoercionType .Text' mostrato qui https://msdn.microsoft.com/en-us/magazine/jj891051.aspx – Slai

risposta

0

È possibile copiare il formato numerico dopo, quindi forse qualcosa di simile:

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

OK, funziona ... sembra che potremmo anche semplificarlo in '.then (function() {r1.numberFormat =" @ "; r1.values ​​= r0.values; r1.numberFormat = r0.numberFormat;}) '. Quindi l'idea di base è 'impostare il formato numerico dell'intervallo in testo (" @ ") PRIMA di applicare i valori, i valori dovrebbero rimanere così com'è, e quindi applichiamo il numero realeFormato ... – SoftTimur

+0

Sembra che tu abbia modificato il tuo codice. È necessario inserire nel mezzo 'r0.load ([" valori "," numberFormat "]);' e 'return ctx.sync(). Then (' ecc ... – SoftTimur

+0

ok .. gli esempi che ho visto online sembrava che potesse funzionare senza di loro, e lo stavo testando solo nella versione desktop di Excel che non utilizzava nulla del genere. – Slai

4

Si dovrebbe essere in grado di fare una delle due cose:

1) Se si imposta il formato numerico del campo di testo ("@") prima di applicare i valori, i valori dovrebbero rimanere come è.

2) È anche possibile anteporre un apostrofo (') all'inizio del testo per forzare Excel a trattarlo come testo normale indipendentemente da come verrà trattato normalmente dal motore interno.

UPDATE

C'è in realtà due cose in gioco qui. C'è il testo visualizzato rispetto al valore sottostante.

Per ottenere il testo, accedere alla proprietà range.text (array 2D). Questo sarà il testo visualizzato nell'interfaccia utente. Per ottenere il valore sottostante, accedere alla proprietà range.values ​​(anche una matrice 2D)

Se si copiano i valori da un luogo all'altro, o la loro memorizzazione e poi ripristinare, assicurarsi di memorizzare sia il range.numberFormat e range.values . E poi ripristinarli, con .numberFormat primo.

UPDATE 2

vedi screenshot qui sotto. Il codice funziona come previsto.

enter image description here

~ Michael Zlatkovsky, Developer su Office Extensibility Platform, MSFT

+0

Come potrei 'impostare il formato numerico dell'intervallo in testo (" @ ")' dall'API JavaScript? – SoftTimur

+0

Il problema è, questo è un esempio specifico, ma in generale, non so dove sono questi valori ambigui e ho bisogno di applicare (tramite API JavaScript) una soluzione generale a tutti i valori che voglio copiare ... – SoftTimur

+0

Are hai bisogno di copiare valori da un intervallo a un altro, o semplicemente di leggere i valori? –

Problemi correlati