2017-09-13 4 views
0

J'ai une table qui contient des éléments. Je veux définir les noms des éléments dans le document Word, mais chacun dans une nouvelle ligne.XWPFDocument remplacer paragraphe dans une boucle

Je crée le vide ci-dessous:

Lorsque mon texte contient « P01 » Je remplace le texte par le nom, ajoutez une nouvelle ligne et définir un autre texte « P01 ».

public void findAndRemplaceString(XWPFDocument doc, String champs) throws IOException { 
    for (XWPFParagraph p : doc.getParagraphs()) { 
     java.util.List<XWPFRun> runs = p.getRuns(); 
     if (runs != null) { 
      for (XWPFRun r : runs) { 
       String text = r.getText(0); 
       if (text != null && text.contains("P01")) { 
        text = text.replace("P01", champs); 
        System.out.println("text replaced"); 
        r.setText(text, 0); 
        //add new line 
        r.addBreak(); 
        //new "P01" added 
        r.setText("P01"); 
       } 
      } 
     } 
    } 
}  

Afin que le prochain nom d'élément soit remplacé dans le paragraphe ci-dessous.

@FXML 
void endButton(ActionEvent event) { 
    String file = "model"; 
    for (Person item : table.getItems()) { 
     //get the name of item 
     String a = item.getName(); 
     // get the index of item 
     int ind0 = table.getItems().indexOf(item); 
     int ind1 = table.getItems().indexOf(item) + 1; 
     try { 
      XWPFDocument doc = new XWPFDocument(new FileInputStream(new File(file + ind0 + ".docx"))); 
      findAndRemplaceString(doc, a); 
      FileOutputStream fileOutputStream = new FileOutputStream(new File(file + ind1 + ".docx")); 
      doc.write(fileOutputStream); 
      fileOutputStream.close(); 
      doc.close(); 
     } catch (Exception e) { 
      System.out.println("erreur " + e); 
     } 
    } 
} 

Le problème est:

REMPLACER seul le premier nom de l'article et non les autres. Il ne lit pas le nouveau "P01" que j'ai défini.

+1

le 'chaîne text = r.getText (0),' obtient explicitement que la première partie du texte de la course, mais après 'r.setText (texte , 0); r.addBreak(); r.setText ("P01"); 'il y a deux parties de texte. Une très bonne réponse n'est pas possible car vous ne fournissez pas un [Exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) mais vous pouvez essayer 'String text = r.text();' au lieu. –

Répondre

0

J'ai trouvé la réponse, ce n'est pas le meilleur mais ça marche.

J'ai changé le type de String [] au lieu de cordes, de sorte que je peux le faire de cette façon:

public void findAndRemplaceString(XWPFDocument doc,String champs[]){  
    for (XWPFParagraph p : doc.getParagraphs()) {  
     java.util.List<XWPFRun> runs = p.getRuns(); 
     if (runs != null) {    
      for (XWPFRun r : runs) {    
       String text = r.getText(0);    
       if (text != null && text.contains("P01")) { 
        for (int i=0;i<champs.length;i++){ 
         text = text.replace("P01",""); 
         r.setText(text,0); //Replace the old text 
         r.setText(champs[i]);//add the new text 
         r.addBreak();  //new line 
        } 
       } 
      } 
     } 
    } 
} 

Et quand je clique sur le bouton, le findAndReplaceString vide est appelé une seule fois au lieu de boucle, donc je mets tous les noms d'éléments dans une liste comme ça:

@FXML void endButton(ActionEvent event) { 
List<String> list = new ArrayList<String>();   
for (Person item : table.getItems()) {  
    String a = item.getName(); 
    list.add(a); 
}  
String[] simpleArray = new String[list.size()]; 
list.toArray(simpleArray); 
try{ 
    XWPFDocument doc = new XWPFDocument(new FileInputStream(new File("input.docx")));    
    findAndRemplaceString(doc,simpleArray); 
    FileOutputStream fileOutputStream = new FileOutputStream(new File("output.docx")); 
    doc.write(fileOutputStream); 
    fileOutputStream.close(); 
    doc.close();      
}catch (Exception e) { 
    System.out.println("erreur " + e); 
    } 
}