Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Doublon apache POI


Sujet :

API standards et tierces Java

  1. #1
    Nouveau Candidat au Club
    Doublon apache POI
    Bonjour à tous,

    Voilà cela fait plusieurs jours que j'ai un soucis l'API Apache POI.

    J'arrive à remplacer les "brackets" par des données mais avec ce code je ne supprime pas les "brackets".

    Code Java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public class ExtractWord {
     
    	private XWPFWordExtractor ext;
     
    	public ExtractWord() {}
     
    	public void ExtractTest() throws JsonParseException, JsonMappingException, ClassNotFoundException, SQLException, IOException {
    		//Absence abse = new Absence();
    		DAOUtilisateur usager = new DAOUtilisateur();
    		ArrayList<Utilisateur> listeUtilisateur = usager.GetUtilisateurByAbsence();
     
    		int i = 0;
     
    		for (Utilisateur user : listeUtilisateur) {
    			System.out.println(user.nom);							
     
    			InputStream inp = new FileInputStream("FichierWord.docx");
    			XWPFDocument document = new XWPFDocument(inp);	
    			ext = new XWPFWordExtractor(document);			
    			for (XWPFParagraph p : document.getParagraphs())
    			{
    				List<XWPFRun> runs = p.getRuns();
    				if (runs != null) {				 
    					String text = ext.getText();
    					for (XWPFRun r : runs) {
    						if (text != null && text.contains("{{utilisateur.nom}}")) {
    							text = text.replace("{{utilisateur.nom}}",user.nom);
    						}	
    						if (text != null && text.contains("{{utilisateur.prenom}}")) {
    							text = text.replace("{{utilisateur.prenom}}", user.nom);
    							r.setText(text, 0);
    							i++;
    							System.out.println(ext.getText());							
    						}
    					}
    				}
    			}		
    			document.write(new FileOutputStream("FichierWord"+ i +".docx"));
    		}
    	}
    }



    Excusez moi si je ne suis pas assez clair mais je n'ai pas trop d'expérience dans le métier de développeur. Je suis en stage de fin de formation et je suis seul à travailler comme développeur.

  2. #2
    Membre expérimenté
    Citation Envoyé par maxand01 Voir le message
    Bonjour à tous,

    Voilà cela fait plusieurs jours que j'ai un soucis l'API Apache POI.

    J'arrive à remplacer les "brackets" par des données mais avec ce code je ne supprime pas les "brackets".

    Code Java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
                        String text = ext.getText();
                        for (XWPFRun r : runs) {
                            if (text != null && text.contains("{{utilisateur.nom}}")) {
                                text = text.replace("{{utilisateur.nom}}",user.nom);
                            }    
                            if (text != null && text.contains("{{utilisateur.prenom}}")) {
                                text = text.replace("{{utilisateur.prenom}}", user.nom);
                                r.setText(text, 0);
                                i++;
                                System.out.println(ext.getText());                            
                            }
                        }

    Bonjour,

    Si la modification du texte n'est prise en compte que par le r.setText(), effectivement ça ne marchera pas.
    Dans le premier bloc "if", le contenu de "text" est purgé des textes entre accolades. Le second test ne trouvera pas d'accolades, et le second bloc ne sera jamais exécuté.

  3. #3
    Nouveau Candidat au Club
    Bah en faite en résultat il me remplace bien ce que je veux mais c'est juste qu'il ne m'efface pas ce que normalement je remplace.

    Au départ, j'ai ca :

    L’utilisateur {{utilisateur.nom}} {{utilisateur.prenom}}

    Et en résultat ca :

    L’utilisateur Willis Willis

    {{utilisateur.nom}} {{utilisateur.prenom}}


    Carrey
    L’utilisateur Carrey Carrey

    {{utilisateur.nom}} {{utilisateur.prenom}}

    Donc c'est {{utilisateur.nom}} {{utilisateur.prenom}} que je n'arrive pas à supprimer

  4. #4
    Modérateur

    Un autre souci c'est que Tu as utiliser Nom 2 fois et jamais Prenom, pour le reste, aucunes idées.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau Candidat au Club
    Oui merci j'ai vu, je fais juste des petits test pour intégrer au projet donc c'est "normal"

  6. #6
    Modérateur

    Ça passe à la compile ? Normalement, la fonction replace() attend un char ou CharSequence... là, tu as du String.
    Du coup, il faudrait utiliser replaceAll().
    Ensuite, si je peux me permettre, tu devrais faire simplement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    text = text.replaceAll("{{utilisateur.nom}}", user.nom);
    text = rext.replaceAll("{{utilisateur.prenom}}", user.prenom);
    r.setText(text, 0);

    Pas la peine de tester si elle contient avant, soit il y en a et c'est remplacé, soit il n'y en a pas et ça ne fait rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur

    String implémente CharSequence, bien entendu.

    Et replaceAll(), méthode assez mal nommée, a cela de différent avec replace() tout court qu'elle cherche à reconnaître des regex au lieu d'une chaîne littérale. Quand on ne veut pas faire de regex, replaceAll() est malvenue et replace() le choix logique.

    Concernant ce qui se passe avec ce document, je ne connais rien à POI, tentative tristounette d'Apache de maîtriser ce format misérable bien qu'omniprésent qu'est Microsoft Office. Modifier un document Google Cloud est d'une simplicité déconcertante, mais du Word c'est bien mieux pour la santé de se dire que c'est impossible.

    Toujours est-il qu'en toute logique, récupérer un texte venant du document entier pour ensuite l'insérer dans les runs de ce document, ce n'est pas cohérent. Surtout que ces runs devraient logiquement être vivants. À moins que tu aies des raisons de penser du fait de tutoriels ou exemples extérieurs (qu'il serait de bon ton de citer pour qu'on regarde), je suggère de pas faire ça. Récupère tes textes du même endroit que là où tu vas les insérer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur

    Citation Envoyé par thelvin Voir le message
    String implémente CharSequence, bien entendu.
    Oups... comme quoi, la force de l'habitude fait dire des conneries
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Nouveau Candidat au Club
    Citation Envoyé par thelvin Voir le message
    String implémente CharSequence, bien entendu.

    Et replaceAll(), méthode assez mal nommée, a cela de différent avec replace() tout court qu'elle cherche à reconnaître des regex au lieu d'une chaîne littérale. Quand on ne veut pas faire de regex, replaceAll() est malvenue et replace() le choix logique.

    Concernant ce qui se passe avec ce document, je ne connais rien à POI, tentative tristounette d'Apache de maîtriser ce format misérable bien qu'omniprésent qu'est Microsoft Office. Modifier un document Google Cloud est d'une simplicité déconcertante, mais du Word c'est bien mieux pour la santé de se dire que c'est impossible.

    Toujours est-il qu'en toute logique, récupérer un texte venant du document entier pour ensuite l'insérer dans les runs de ce document, ce n'est pas cohérent. Surtout que ces runs devraient logiquement être vivants. À moins que tu aies des raisons de penser du fait de tutoriels ou exemples extérieurs (qu'il serait de bon ton de citer pour qu'on regarde), je suggère de pas faire ça. Récupère tes textes du même endroit que là où tu vas les insérer.
    Merci de votre réponse.

    Oui je comprends que Word n'est pas super, mais ce n'est pas moi qui décide des choses à faire dans l'application sur laquelle je travaille.

    Je comprends pas trop votre dernier paragraphe. En faite moi je récupère un modèle Word qui sera stocké sur le serveur et je souhaite généré des documents à partir de ce modèle avec des données dans la BDD.

###raw>template_hook.ano_emploi###