Word et Javascript - JCOM - Comment faire ?

Word et Javascript - JCOM - Comment faire ? - HTML/CSS - Programmation

Marsh Posté le 26-09-2006 à 12:23:36    

Bonjour,
 
J'essaie de commander un document word depuis une application qui "travaille" en JavaScript ...
 
Voici ce que j'ai pour le moment :
 

Code :
  1. var jCOM = JavaImporter(Packages.jp.ne.so_net.ga2.no_ji.jcom);
  2.  
  3. function main{
  4. var rm = new jCOM.ReleaseManager();
  5.    try {
  6.        var wrdApp = new jCOM.IDispatch(rm, "Word.Application" );
  7.      
  8.      
  9.  
  10.        
  11.        wrdApp.Documents.Open("c:\\toto.doc" );
  12.      
  13.    
  14.      
  15.        
  16.        var visible = wrdApp.get("Visible" );        
  17.        wrdApp.put("Visible", true);
  18.  
  19.    }
  20.    catch ( e ) {
  21.        Dialogs.MsgBox(e.toString())
  22.    }
  23.    finally
  24.    {
  25.        rm.release();
  26.    }  
  27. }
  28. main();


 
Evidement, cela ne fonctionne pas...
 
edit : si, j'arrive à ouvrir une application word (la rendre visible), mais pas à ouvrir un fichier existant pour y écrire quelque chose...
 
Comment puis-je faire ?
 
Merci d'avance !
 
 :hello:

Message cité 1 fois
Message édité par didier1809 le 26-09-2006 à 12:25:23

---------------
.
Reply

Marsh Posté le 26-09-2006 à 12:23:36   

Reply

Marsh Posté le 26-09-2006 à 13:48:09    

didier1809 a écrit :

Bonjour,
 
J'essaie de commander un document word depuis une application qui "travaille" en JavaScript ...
 
Voici ce que j'ai pour le moment :
 

Code :
  1. var jCOM = JavaImporter(Packages.jp.ne.so_net.ga2.no_ji.jcom);
  2.  
  3. function main{
  4. var rm = new jCOM.ReleaseManager();
  5.    try {
  6.        var wrdApp = new jCOM.IDispatch(rm, "Word.Application" );
  7.      
  8.      
  9.  
  10.        
  11.        wrdApp.Documents.Open("c:\\toto.doc" );
  12.      
  13.    
  14.      
  15.        
  16.        var visible = wrdApp.get("Visible" );        
  17.        wrdApp.put("Visible", true);
  18.  
  19.    }
  20.    catch ( e ) {
  21.        Dialogs.MsgBox(e.toString())
  22.    }
  23.    finally
  24.    {
  25.        rm.release();
  26.    }  
  27. }
  28. main();


 
Evidement, cela ne fonctionne pas...
 
edit : si, j'arrive à ouvrir une application word (la rendre visible), mais pas à ouvrir un fichier existant pour y écrire quelque chose...
 
Comment puis-je faire ?
 
Merci d'avance !
 
 :hello:


 
c'est une blague ou quoi :ouch: Tu voulais dire "une application qui travaille en Java", non?

Reply

Marsh Posté le 26-09-2006 à 14:21:06    

Code :
  1. var w = new ActiveXObject("Word.Application" );
  2. w.Visible = true;
  3. var d = w.Documents.Open("c:\\toto.doc" );
  4. d.Activate();
  5. w.Selection.TypeText("prout" );


 
Ca écrit "prout" au début du document "toto.doc" déjà existant.
 
Je te laisse te débrouiller pour la suite ;)

Reply

Marsh Posté le 26-09-2006 à 14:21:41    

Sinon, si c'est du JavaPasScript, démerde-toi avec ton langage de merde :ange:


Message édité par MagicBuzz le 26-09-2006 à 14:21:53
Reply

Marsh Posté le 27-09-2006 à 08:55:53    

rufo a écrit :

c'est une blague ou quoi :ouch: Tu voulais dire "une application qui travaille en Java", non?


 
En fait, le code de l'appli est en JAva, oui.
 
Mais le language utilisé pour coder à l'interieur (c'est une appli propriètaire, et on peux créer des "rapports", est en JavaScript... ;)
 
Pour répondre à MagicBuzz, faire un new ActiveXObject ne fonctionne pas ;)


---------------
.
Reply

Marsh Posté le 27-09-2006 à 10:39:25    

Ben fait un vrai JS :spamafote:
 
Genre, j'ai écrire une application en C# il y a peut, qui devait entre-autre générer un fichier Excel à partir des données qu'il récupérait d'une base.
 
Etant donné que le truc doit être déployé dans un environnement très hétérogène, impossible d'utiliser les objets COM d'Excel puisque d'une version à l'autre j'aurais dû refaire les liaisons.
 
J'ai donc opté pour le lancement d'un script VBS (ça aurait pu être du JS) qui s'occupe de faire ça.
 
Voici un l'exemple :
 

Code :
  1. Option Explicit
  2. ' Titre : DS2XLS
  3. ' Auteur : MagicBuzz
  4. ' Version : 1.0
  5. ' Date : 10-05-2006
  6. '
  7. ' Script VBS qui génère un document Excel à partir d'un extract "ToXml()" d'un Objet DataSet de .NET
  8. ' Ce script est censé fonctionner sur n'importe quelle version de Windows, et n'importe quelle version d'Excel
  9. ' Bon, rien n'est garanti non plus hein...
  10. ' Constantes
  11. ' Ces GUID génériques ont l'avantage d'être idetiques pour toutes les versions
  12. ' Il faut alors faire confiance à Microsoft pour ne pas changer la structure des objets d'une version à l'autre
  13. Const EXCEL_GUID = "Excel.Application"
  14. Const MSXML_GUID = "MSXML.DOMDocument"
  15. ' Méthodes
  16. Sub Main()
  17.     ' Excel objects
  18.     Dim xls
  19.     Dim wkb
  20.     Dim sht
  21.    
  22.     ' DOM objects
  23.     Dim dom
  24.     Dim declaration
  25.     Dim table
  26.     Dim colonne
  27.     Dim ligne
  28.    
  29.     ' Common variables
  30.     Dim args
  31.     Dim filename
  32.     Dim tabName
  33.     Dim arrColonnes()
  34.    
  35.     ' Compteurs
  36.     Dim i
  37.     Dim j
  38.    
  39.     ' On récupère le nom du fichier XML à traîter
  40.     Set args = WScript.Arguments
  41.    
  42.     If args.Count <> 1 Then
  43.         MsgBox("Nombre d'arguments incorrects : 1 attendu" )
  44.         Exit Sub
  45.     End If
  46.     filename = args(0)
  47.    
  48.     ' Création d'une instance d'Excel
  49.     Set xls = CreateObject(EXCEL_GUID)
  50.     ' On ne l'affiche pas
  51.     'xls.Visible = True
  52.    
  53.     ' Ajout d'un espace de travail (par défaut, Excel s'ouvre vide)
  54.     Set wkb = xls.Workbooks.Add()
  55.    
  56.     ' L'espace de travail contient de base 3 sheets. On en vire deux et on renomme la dernière
  57.     ' En effet, un espace de travail doit au moins toujours contenir une feuille...
  58.     For i = wkb.WorkSheets.Count To 2 Step -1
  59.         wkb.WorkSheets(i).Delete
  60.     Next
  61.     wkb.WorkSheets(1).Name = "tmpSheet"
  62.    
  63.     ' Ouverture du document XML contenant les données du dataset à sauvegarder
  64.     Set dom = CreateObject(MSXML_GUID)
  65.     dom.Load filename
  66.    
  67.     ' Recherche du tag de description des DataTables
  68.     Set declaration = dom.DocumentElement.SelectNodes("xs:schema/xs:element/xs:complexType/xs:choice/xs:element" )
  69.    
  70.     ' C'est parti !
  71.     For Each table In declaration
  72.         tabName = GetAttributeByName(table, "name" )
  73.         Set sht = wkb.WorkSheets.Add()
  74.         sht.Name = tabName
  75.         ReDim arrColonnes(1)
  76.         i = 0
  77.         For Each colonne In table.SelectNodes("xs:complexType/xs:sequence/xs:element" )
  78.             i = i + 1
  79.             ReDim Preserve arrColonnes(i)
  80.             ' En-tête
  81.             arrColonnes(i) = GetAttributeByName(colonne, "name" )
  82.             sht.Cells(1, i).Value = GetAttributeByName(colonne, "name" )
  83.             sht.Cells(1, i).Interior.ColorIndex = 36
  84.             sht.Cells(1, i).Font.Bold = True
  85.             ' Formattage du type de la colonne
  86.             Select Case GetAttributeByName(colonne, "type" )
  87.                 Case "xs:string"
  88.                     sht.Columns(i).NumberFormat = "@"
  89.                 Case "xs:decimal"
  90.                     sht.Columns(i).NumberFormat = "0.00"
  91.                 Case Else
  92.                     ' Ouais, ben désolé, moi je me sert que de string et decimal...
  93.                     sht.Columns(i).Interior.ColorIndex = 3
  94.                     MsgBox("Type inconnu : " & GetAttributeByName(colonne, "type" ))
  95.             End Select
  96.         Next
  97.        
  98.         ' Maintenant, on parcours l'ensemble des éléments correspondant au datatable en cours de lecture
  99.         j = 1
  100.         For Each ligne In dom.DocumentElement.SelectNodes(tabName)
  101.             j = j + 1
  102.             For i = 1 To UBound(arrColonnes)
  103.                 ' On recopie bêtement le contenu du tag portant le nom de la colonne désirée
  104.                 sht.Cells(j, i).Value = ligne.SelectSingleNode(arrColonnes(i)).Text
  105.             Next
  106.         Next
  107.        
  108.         ' Ca c'est pour faire joli (si faire se peut)
  109.         sht.Columns.EntireColumn.AutoFit
  110.     Next
  111.    
  112.     ' Vous vous rappelez de la sheet renommée ? Ben on la zigouille maintenant
  113.     wkb.WorkSheets("tmpSheet" ).Delete
  114.    
  115.     ' On indique qu'on ferme l'espace de travail en enregistrant le document (une popup d'enregistrement apparaît)
  116. '    wkb.Close(true)
  117.    
  118.     ' On quitte Excel
  119. '    xls.Quit
  120.     xls.Visible = True
  121. End Sub
  122. Function GetAttributeByName(node, attributeName)
  123.     ' Impossible d'utiliser les collections nommées en VBS. Du coup on fait avec les moyens du bords...
  124.     Dim tmpRet
  125.     Dim att
  126.     tmpRet = ""
  127.     For Each att in node.attributes
  128.         If att.Name = attributeName Then
  129.             tmpRet = att.Value
  130.             Exit For
  131.         End If
  132.     Next
  133.    
  134.     GetAttributeByName = tmpRet
  135. End Function
  136. ' Démarrage du programme
  137. Call Main()


 
=> Je démarre ce truc depuis mon appli .NET, et j'attends qu'il ait fini. Rien ne t'empêche de faire pareil en Java. Et ce sera toujours plus propre que d'écrire en "JavaScript". En effet, Windows "de base" ne supporte pas JavaScript, et par conséquent pourrait bien ne pas être capable de le faire communiquer correctement avec Word.
En revanche, il connait et sait interpréter directement le VBScript et le JScript. Pour cette raison, tu as tout intérêt à utiliser l'un des deux à la place. (Je te conseille VBS, ses objets sont plus adaptés à la comminucation avec les objets COM que JScript)


Message édité par MagicBuzz le 27-09-2006 à 10:46:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed