2017-03-03 4 views
1

J'essaie d'utiliser javascript pour envoyer des données à une liste Excel, ajouter les données à la liste, enregistrer et fermer la liste. Je sais en utilisant ActiveX je suis limité à IE mais c'est ok.Enregistrer et quitter l'objet ActiveX

Le problème auquel je fais face est que ni la méthode de quitter ni la méthode de sauvegarde ne fonctionnent. Le processus reste ouvert et les données ne sont pas enregistrées, sauf si je l'enregistre manuellement.

Heres le code:

function getNumber() { 

    var Excel = new ActiveXObject("Excel.Application"); 

    var test = Excel.Workbooks.Open("pathToFile"); 

    var LastRow = test.ActiveSheet.Range("A1").CurrentRegion.Rows.Count; 

    alert(LastRow); 
    var combine = "A" + (LastRow); 

    alert(combine); 

    var getCell = test.ActiveSheet.Range(combine).Value; 

    var delimiter = '_'; 
    var start = 3; 
    var tokens = getCell.split(delimiter).slice(start); 
    var result = parseInt(tokens.join(delimiter)); 
    var newNumber = result + 1; 

    whichCompany(); 

    var newRow = "A" + (LastRow + 1); 

    var id = "D_" + selectedName + "_2017_"+ newNumber.toString(); 
    test.ActiveSheet.Range(newRow).Value = id; 
    alert(id); 

    newRow = "B" + (LastRow + 1); 

    var m_names = new Array("Jan", "Feb", "Mar", 
    "Apr", "May", "Jun", "Jul", "Aug", "Sep", 
    "Oct", "Nov", "Dec"); 

    var d = new Date(); 
    var curr_date = d.getDate(); 
    var curr_month = d.getMonth(); 
    var curr_year = d.getFullYear(); 
    var dateNow = curr_date + m_names[curr_month] + curr_year; 

    test.ActiveSheet.Range(newRow).value = dateNow; 

    newRow = "C" + (LastRow + 1); 
    test.ActiveSheet.Range(newRow).Value = document.getElementById("fName").value + " " + document.getElementById("lName").value; 

    newRow = "D" + (LastRow + 1); 
    internalOrExternal(); 
    test.ActiveSheet.Range(newRow).Value = intOrExt; 

    newRow = "E" + (LastRow + 1); 
    test.ActiveSheet.Range(newRow).Value = document.getElementById("case").value; 

    newRow = "F" + (LastRow + 1); 
    test.ActiveSheet.Range(newRow).Value = document.getElementById("produkt").value; 

    Excel.Quit(); 

} 

Répondre

0

Ok donc pour tous ceux qui s'intéressent à la solution. L'erreur que j'ai faite était que je n'ai pas complètement rempli le formulaire ainsi le code saute les parties de cette ligne de code sur: newRow = "B" + (LastRow + 1);

La méthode quit() ne sera jamais appelée. En commentant tout le code que je n'ai pas vraiment utilisé lors des tests, le code fonctionne sans aucun problème. En tant qu'information supplémentaire si quelqu'un rencontre un problème similaire, en utilisant la méthode saveAs(), vous pouvez enregistrer le fichier sous le même nom de fichier afin que saveas() puisse fonctionner comme une simple sauvegarde.

Veuillez voir le code ci-dessous qui a fonctionné pour moi (le code que je n'ai pas utilisé pour le cas de test est commenté: c'est le code qui a été ignoré auparavant avec les deux méthodes save() et quit()):

function getNumber() { 

    var Excel = new ActiveXObject("Excel.Application"); 

    var test = Excel.Workbooks.Open("pathToFile"); 

    var LastRow = test.ActiveSheet.Range("A1").CurrentRegion.Rows.Count; 

    alert(LastRow); 
    var combine = "A" + (LastRow); 

    alert(combine); 


    var getCell = test.ActiveSheet.Range(combine).Value; 


    var delimiter = '_'; 
    var start = 3; 
    var tokens = getCell.split(delimiter).slice(start); 
    var result = parseInt(tokens.join(delimiter)); 
    var newNumber = result + 1; 

    whichCompany(); 

    var newRow = "A" + (LastRow + 1); 

    var id = "D_" + selectedName + "_2017_"+ newNumber.toString(); 
    test.ActiveSheet.Range(newRow).Value = id; 
    alert(id); 

    <!-- newRow = "B" + (LastRow + 1); --> 

    <!-- var m_names = new Array("Jan", "Feb", "Mar", --> 
    <!-- "Apr", "May", "Jun", "Jul", "Aug", "Sep", --> 
    <!-- "Oct", "Nov", "Dec"); --> 

    <!-- var d = new Date(); --> 
    <!-- var curr_date = d.getDate(); --> 
    <!-- var curr_month = d.getMonth(); --> 
    <!-- var curr_year = d.getFullYear(); --> 
    <!-- var dateNow = curr_date + m_names[curr_month] + curr_year; --> 

    <!-- test.ActiveSheet.Range(newRow).value = dateNow; --> 

    <!-- newRow = "C" + (LastRow + 1); --> 
    <!-- test.ActiveSheet.Range(newRow).Value = document.getElementById("fName").value + " " + document.getElementById("lName").value; --> 

    <!-- newRow = "D" + (LastRow + 1); --> 
    <!-- internalOrExternal(); --> 
    <!-- test.ActiveSheet.Range(newRow).Value = intOrExt; --> 

    <!-- newRow = "E" + (LastRow + 1); --> 
    <!-- test.ActiveSheet.Range(newRow).Value = document.getElementById("case").value; --> 

    <!-- newRow = "F" + (LastRow + 1); --> 
    <!-- test.ActiveSheet.Range(newRow).Value = document.getElementById("produkt").value; --> 

    test.SaveAs("pathToFile"); 
    Excel.Application.Quit(); 
} 

@Shilly: Merci pour le lien vers la documentation, il a aidé à me faire sur le chemin de la solution.

0

La documentation MSDN https://msdn.microsoft.com/en-us/library/6958xykx(v=vs.100).aspx état que la méthode fait partie de l'espace de noms d'application, donc essayez d'utiliser Excel.Application.Quit(); à la place. Il a également la syntaxe Excel.saveAs. Bien que je comprenne que c'est un script pour IE seulement, notez que IE Edge ne le supportera pas non plus, donc ce n'est pas du tout à l'épreuve du temps. Si vous avez accès à des outils côté serveur, il existe un tas de bibliothèques Excel que vous pouvez utiliser avec des appels ajax. Personnellement, nous utilisons le module https://github.com/SheetJS/js-xlsx pour node.js

+0

merci pour cela, malheureusement, cela n'a pas fonctionné. En ce qui concerne ne pas être la preuve du futur. Ceci est juste une solution de contournement jusqu'à ce qu'un système plus sophistiqué sera mis en œuvre. Ce que je ne comprends pas c'est pourquoi les autres méthodes semblent fonctionner parfaitement mais "saveas()" et "quit()" ne fonctionnent pas. Cela pourrait-il être dû à un problème d'autorisation? – Deviator

+0

@Deviator Il pourrait être. Le compte qui exécute ce script doit évidemment avoir des droits d'écriture sur l'emplacement que vous enregistrez. Nous avons rencontré des problèmes similaires lorsque nous ne pouvions pas écrire sur un lecteur partagé car le script s'exécutait dans un service sur IIS sous le compte SYSTEM au lieu d'utiliser un compte administrateur. Terminé en utilisant un script SMB2 pour accéder au lecteur partagé avec les informations d'identification correctes. (du côté serveur) – Shilly