L'exemple de cet article décrit comment exporter Excel à l'aide de JavaScript. Partagez-le avec tout le monde pour votre référence. La méthode de mise en œuvre spécifique est la suivante :
Comment exporter des pages WEB vers des documents EXCEL | ||||
En-tête de colonne 1 | En-tête de colonne 2 | En-tête de colonne 3 | En-tête de colonne 4 | En-tête de colonne 5 |
aaa | bbb | ccc | ddd | eee |
AAA | BBB | CCC | DDD | EEE |
FFF | GGG | HHH | III | JJJ |
下面是处理excel 进程关闭问题
在这个例子中,在本地文件操作时并不会出现异常。——最多只是有一些内存垃圾而已。然而, L'URL de strSaveLocation est indiquée ci-dessous.于是如果反复点击"重写"按钮,就会出现异常。
——注意,这是在SPS中操作共享文件时的一个实例的简化代码。因此,它并非"学术的"无聊讨论,而且工程中的实际问题。
解决这个问题的方法很复杂。它涉及到两个问题:
① 本地凭证的释放
② Objet ActiveX实例的释放
下面我们先从JavaScript中对象的«失效»问题说起。简单的说:
① 一个对象在其生存的上下文环境之外,即会失效。
② 一个全局的对象在没有被执用(引用)的情况下,即会失效。
例如:
fonction testObject2() {
var _obj2 = nouvel Objet();
Retourner _obj2;
>
// Exemple 1
testObject();
// Exemple 2
testObject2()
// Exemple 3
var obj3 = testObject2();
obj3 = nul;
// Exemple 4
var obj4 = testObject2();
var arr = [obj4];
obj3 = nul;
arr = [];
Dans ces quatre exemples :
- "Exemple 1" construit _obj1 dans la fonction testObject(), mais lorsque la fonction se termine, elle a quitté le contexte de la fonction, donc _obj1 n'est pas valide
;
- Dans "Exemple 2", un objet _obj2 est également construit dans testObject2() et transmis, donc l'objet a un contexte "en dehors de la fonction" (et un cycle de vie). Cependant, puisque la valeur de retour de la fonction n'est pas utilisée par). autres variables " Hold", donc _obj2 est également immédiatement invalide
;
- Dans "Exemple 3", _obj2 construit par testObject2() est détenu par la variable externe obj3. A ce moment, jusqu'à ce que la ligne de code "obj3=null" prenne effet, _obj2 deviendra invalide car la relation de référence disparaît.
- Pour la même raison que l'exemple 3, _obj2 dans "Exemple 4" deviendra invalide après la ligne de code "arr=[]".
Cependant, "l'invalidation" d'un objet n'attend pas qu'il soit "libéré". Dans l'environnement d'exécution JavaScript, il n'existe aucun moyen d'indiquer à l'utilisateur exactement quand un objet sera publié. Cela repose sur le mécanisme de recyclage de la mémoire de JavaScript. ——Cette stratégie est similaire au mécanisme de recyclage dans .NET.
Dans l'exemple de code d'opération Excel précédent, le propriétaire de l'objet, c'est-à-dire le processus de "EXCEL.EXE" ne peut se produire qu'après la "libération de l'instance d'objet ActiveX". Les verrous de fichiers et les informations d'identification d'autorisation du système d'exploitation sont liés au processus. Ainsi, si l'objet est simplement « invalidé » plutôt que « libéré », il y aura des problèmes pour les autres processus gérant le fichier et faisant référence aux informations d'identification d'autorisation du système d'exploitation.
——Certaines personnes disent qu'il s'agit d'un BUG dans le mécanisme JavaScript ou COM. En fait non, cela est dû à une relation complexe entre le système d'exploitation, IE et JavaScript, plutôt qu'à un problème indépendant.
Microsoft a dévoilé une stratégie pour résoudre ce problème : appeler activement le processus de recyclage de la mémoire.
Un processus CollectGarbage() (généralement appelé processus GC) est fourni dans (Microsoft) JScript. Le processus GC est utilisé pour nettoyer les « exceptions d'objets non valides » dans l'IE actuel, c'est-à-dire pour appeler le processus CollectGarbage(). processus de destructeur d’objet.
Le code pour appeler le processus GC dans l'exemple ci-dessus est :
excel.Quit();
excel = nul;
setTimeout(CollectGarbage, 1);
>
La première ligne de code appelle la méthode excel.Quit() pour provoquer l'arrêt et la sortie du processus Excel. À ce stade, étant donné que l'environnement JavaScript contient une instance d'objet Excel, le processus Excel ne se termine pas réellement.
La deuxième ligne de code rend Excel null pour effacer la référence de l'objet, "invalidant" ainsi l'objet. Cependant, comme l'objet est toujours dans le contexte de la fonction, si le processus GC est appelé directement, l'objet ne sera toujours pas nettoyé.
La troisième ligne de code utilise setTimeout() pour appeler la fonction CollectGarbage, et l'intervalle de temps est défini sur « 1 », ce qui ne provoque le processus GC qu'après l'exécution de la fonction writeXLS(). De cette façon, l'objet Excel remplit les deux conditions de « peut être nettoyé par GC » : pas de référence et sortie du contexte.
L'utilisation du processus GC est très efficace dans l'environnement JS utilisant ActiveX Object. Certains objets ActiveX potentiels incluent XML, VML, OWC (Office Web Componet), Flash et même VBArray dans JS.
De ce point de vue, puisque l'architecture ajax adopte XMLHTTP et doit répondre à la fonctionnalité « pas de changement de page », l'appel actif du processus GC au moment approprié se traduira par une expérience d'interface utilisateur plus efficace.
En fait, même si le processus GC est utilisé, le problème Excel mentionné ci-dessus ne sera toujours pas complètement résolu. Parce qu'IE met également en cache les informations d'identification d'autorisation. La seule façon de mettre à jour les informations d'identification d'autorisation de la page est de "passer à une nouvelle page", donc en fait dans le projet SPS mentionné précédemment, la méthode que j'ai utilisée n'était pas GC, mais le code suivant :
excel.Quit();
excel = nul;
// Le code suivant est utilisé pour résoudre un BUG dans IE en appelant Excel, la méthode fournie dans MSDN :
// setTimeout(CollectGarbage, 1);
// Puisque le statut de confiance de la page Web ne peut pas être effacé (ou synchronisé), des méthodes telles que SaveAs() seront utilisées dans
// Il sera invalide la prochaine fois qu'il sera appelé.
location.reload();
>
Enfin, une note supplémentaire sur GC : lorsque le formulaire IE est réduit, IE l'appellera activement une fois
Fonction CollectGarbage(). Cela permet d'améliorer considérablement l'utilisation de la mémoire une fois la fenêtre IE réduite.
J'espère que cet article sera utile à la programmation Web de chacun basée sur JavaScript.