abracadabraPDF › Forums › PDF – Général › Lier Excel à un champ de PDF – Import de données
- Ce sujet est vide.
- AuteurMessages
- 24 juin 2018 à 13:17 #45881
olala
MembreBonjour à tous,
J’ai créé un formulaire sur Acrobat Pro DC et je souhaiterai lier un champ de mon formulaire à un fichier Excel.
Je vous explique :J’ai un fichier Excel avec 2 colonnes : la 1ère contient le nom de restaurants, la 2nde leur adresse.
Sur mon formulaire, j’ai créé une liste déroulante avec mes choix de restos (pour l’exemple : Resto 1, Resto 2, Resto 3) et je souhaiterai, qu’automatiquement, en fonction du restaurant choisi, il récupère l’adresse via le fichier Excel et l’inscrive dans un autre champ.
Je souhaite absolument passer par Excel car, j’ai simplement donné un exemple ici, mais mon fichier Excel est plus complexe que cela (de nombreuses lignes et un peu plus de colonnes..).
J’ai cherché mais compliqué de trouver quelque chose de clair, d’autant que je ne maîtrise pas du tout Java.
J’ai voulu passer par une importation de données via les propriétés du champ, mais il n’accepte que les fdf..
J’ai églement essayé de passer mon Excel en fichier txt et de le mettre en PJ du pdf pour pouvoir recupérer les données mais là encore je ne maitrise pas vraiment JavaSi vous pouviez m’aider sur le sujet,
Merci
25 juin 2018 à 08:31 #64149Merlin
Maître des clésBonjour et bienvenue.
Connaitre Java ne servirait à rien car les formulaires PDF utilisent JavaScript, voir : https://abracadabrapdf.net/forum/index.php/topic,2160.0.html
:Smiley03:La façon de faire ce que tu cherches à faire a déjà été abordée de nombreuses fois dans le forum, il faut commencer par faire une recherche sur les mots clés : liste, mère, fille
La suite va s’enchainer d’elle-même.
:Smiley15:25 juin 2018 à 13:53 #64150olala
MembreBonjour Merlin,
Merci beaucoup pour ta réponse rapide.
EN cherchant, j’ai effectivement trouvé et réussi à aadapter le script dont j’avais besoin à mon cas et cela marche très bien !Il y a juste une ligne, qui marche, mais que je ne comprends pas bien. Si tu pouvais donner quelques explications sur la syntaxe, ce serait sympa. Je ne pense pas avoir besoin de noter tout le code ici.. :
Code:for (var j = 0 ; j < datarr.length ; j++) { fillarr[j] = [datarr[j][0], j] ;}
this.getField(« Resto »).setItems(fillarr) ;sachant que datarr et fillarr sont définis comme des tableaux. Je comprends la boucle, mais pas ce qui suit :
Code:{ fillarr[j] = [datarr[j][0], j] ;}[font=verdana, arial, helvetica, sans-serif]Le [datarr[j][0],j] n’est pas du tout clair pour moi[/font]
[font=verdana, arial, helvetica, sans-serif]De la même façon, à quoi sert le[/font]Code:this.getField(« Resto »).setItems(fillarr)Merci !
25 juin 2018 à 13:56 #64151olala
MembreEt de la même façon, à quoi servent les valeurs d’exportation définies dans les propriétés de la liste déroulante ? Je ne comprends pas bien..
26 juin 2018 à 06:20 #64152bebarth
Maître des clésbonjour,
Et de la même façon, à quoi servent les valeurs d’exportation définies dans les propriétés de la liste déroulante ? Je ne comprends pas bien..
Lorsque l’on va lire la valeur d’une liste déroulante (.value), on récupère la valeur d’exportation, pas le texte que l’on voit dans la liste. Pour récupérer ce texte on utilise getItemAt (https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/index.html#t=Acro12_MasterBook%2FJS_API_AcroJS%2FField_methods.htm%23TOC_getItemAtbc-12&rhtocid=_6_1_8_31_2_11).
Les valeurs d’exportations ne sont pas obligatoires, ça dépend du formulaire et de ce que tu veux voir ou récupérer.Pour le reste, ce serait plus simple d’indiquer le post où tu as trouver ces lignes pour avoir l’ensemble du script et non juste 2 lignes…
@+
:bonjour:26 juin 2018 à 11:49 #64153olala
MembreBonjour bebarth,
Merci de ta réponse.
Voici le code que j’ai trouvé, réalisé par Merlin il me semble :Code://this.importTextData();var p = this.getDataObject(this.dataObjects[0].name)
var fi = this.getDataObjectContents(p.name)
var fit = util.stringFromStream(fi)
var datarr1 = fit.split(« n »)var datarr = new Array()
for (var i = 0 ; i < datarr1.length ; i++) {datarr[i] = datarr1[i].split("t")}var fillarr = new Array() ;for (var j = 1 ; j < datarr.length ; j++) { fillarr[j] = [datarr[j-1][0], j] ;}
this.getField(« RESTO »).setItems(fillarr) ;function selectme() {
if (!event.willCommit) {
this.getField(« Adresse »).value = datarr[event.changeEx][1] ;
this.getField(« Mail »).value = datarr[event.changeEx][2] ;
}
}Le souci est que je dois rentrer et attribuer manuellement les noms de ma liste déroulante ainsi que leurs valeurs d’exportation (via options dans les propriétés de ma liste déroulante).
Et si mes valeurs d’exportation que je rentre ne correspondent pas au numéro de ligne dans laquelle elle se trouve dans mon fichier excel, tout se mélange.Par ailleurs, est-ce la fonction
Code:this.getField(« RESTO »).setItems(fillarr) ;n’est pas censée remplir automatiquement ma liste déroulante avec mes en-têtes de mon fichier Excel ? (que j’ai tranformé en .txt et mis en PJ du doc).
26 juin 2018 à 11:52 #64154olala
MembreEt est-ce qu’il ne serait pas possible de faire une boucle comme ci-dessous, pour ne pas à avoir à définir de valeur d’exportation ? :
Code:function selectme() {
if (!event.willCommit) {for (var k = 0 ; k < fillarr.length ; k++) {
if (fillarr[k]=this.getfield(« RESTO »).getSelectedItem()) {
this.getField(« Adresse »).value = datarr[k][1] ;
this.getField(« Mail »).value = datarr[k][2] ;
}
}
}
}(Evidemment, j’ai essayé, ca ne marche pas..)
26 juin 2018 à 12:23 #64155bebarth
Maître des clésTu n’as pas le lien au post de Merlin ?
Je ne pense pas qu’il ait écrit ce script comme ça, il doit y avoir soit un fichier joint, soit un énoncé avant !
Dans le script, il va chercher les textes et valeurs d’exportation dans un fichier joint.
Sinon, si c’est Merlin qui a écrit ce script, je pense qu’il sera plus à même de te l’expliquer…
@+
:bonjour:26 juin 2018 à 12:25 #64156Merlin
Maître des clésSi tu pouvais donner quelques explications sur la syntaxe, ce serait sympa.
Effectivement, ça sera plus facile avec du code commenté :
Code:/* importation texte */
this.resetForm();
this.getField(« ListeDeroulante »).clearItems(); // champ liste déroulante
// importer l’unique pièce jointe sans la nommer
var p = this.getDataObject(this.dataObjects[0].name)
// importer le contenu de la pièce jointe
var fi = this.getDataObjectContents(p.name)
var fit = util.stringFromStream(fi)
// séparation des rangées (séparateur saut de ligne)
var datarr1 = fit.split(« n »);
// séparation des colonnes (séparateur point-virgule)
var datarr = new Array();
for (var i = 0 ; i < datarr1.length ; i++) {datarr[i] = datarr1[i].split(";")}
var fillarr = new Array() ;
for (var j = 0 ; j < datarr.length ; j++) { fillarr[j] = [datarr[j][1], j] ;}
// remplissage du champ liste déroulante
this.getField(« ListeDeroulante »).setItems(fillarr); // champ liste déroulanteDe la même façon, à quoi sert le
Code:this.getField(« Resto »).setItems(fillarr)Réponse en dernière ligne ci-dessus.
:Smiley15:26 juin 2018 à 12:27 #64157bebarth
Maître des clés…tu vois !!!
:geek:26 juin 2018 à 13:32 #64158olala
MembreOk merci pour vos réponses à tous les 2 !
Merci beaucoup pour les explications du code Merlin, c’est beaucoup plus clair maintenant.
Mais ca ne marche pas dans mon fichier…1er cas : Dans ma fenêtre de propriétés de ma liste déroulante, voilà ce que je fais pour être sûr :
– Je ne touche à rien dans l’onglet « Options »
– Dans l’onglet « Format », je metsCode:selectme()dans le « Script de touches personnalisé »
– Dans l’onlget « Actions », sélectionner le déclencheur, je laisse « Champ désactivé », dans sélectionner l’action, je mets Executer un script Javascript et je fais Ajouter et je colle mon script2e cas : J’ai également essayer de mettre le script directement dans les scripts du documents, mais cela ne marche pas non plus…
Est-ce que je fais qqchose de mal ?
Dans le 1er cas, quand j’ouvre le fichier et que je veux ouvrir ma liste déroulante, elle est bloquée, rien ne s’affiche
Dans le 2e cas, ma liste déroulante n’affiche que des « undefined »26 juin 2018 à 17:16 #64159Merlin
Maître des clésIl faudrait vraiment que tu donnes le lien du sujet dont tu parles et que tu partages tout ou partie de ton formulaire, parce-que toi tu le connais et tu l’as dans la tête.
Pas nous.
:Smiley15:26 juin 2018 à 17:37 #64160olala
MembreOk ci-joint mon fichier
26 juin 2018 à 21:03 #64161Merlin
Maître des clésCi-joint.
La première colonne alimente la liste déroulante, et la liste déroulante alimente les deux champs textes avec les colonnes 2 et 3.
J’ai ajouté trois espaces en tête de liste dans le fichier TXT pour permettre à l’utilisateur de désélectionner.
:Smiley15:27 juin 2018 à 09:19 #64162bebarth
Maître des clés:extra:
…ici, on pourrait peut être rajouter :Code:this.getField(« RESTO »).deleteItemAt(1);en fin de script afin de ne pas avoir l’intitulé des colonnes dans la liste déroulante.
Merlin,
J’aimerais bien que tu commentes « !event.willCommit » et « event.changeEx ».
Ça m’aiderait à me lancer dans l’événementiel :geek:
Merci.@+
:bonjour: - AuteurMessages
- Vous devez être connecté pour répondre à ce sujet.