Utilisation de champs dans Aspose.Words pour Java

Dans ce didacticiel étape par étape, nous vous expliquerons comment utiliser les champs dans Aspose.Words for Java pour manipuler facilement des documents. Aspose.Words for Java est une API puissante qui vous permet de travailler avec des documents Word par programmation, vous donnant un contrôle total sur leur contenu et leur formatage.

1. Introduction

Aspose.Words for Java est un outil essentiel pour toute personne traitant des documents Word dans des applications Java. Les champs sont des espaces réservés qui peuvent stocker des données dynamiques dans votre document. Ce didacticiel vous montrera comment travailler efficacement avec les champs.

2. Configuration de votre environnement

Avant de commencer, assurez-vous que Aspose.Words pour Java est installé. Vous pouvez le télécharger depuisici. Assurez-vous également que Java et un environnement de développement intégré (IDE) comme Eclipse ou IntelliJ IDEA sont installés sur votre système.

3. Chargement d’un document Word

Dans votre application Java, vous devez charger le document Word avec lequel vous souhaitez travailler. Voici un extrait de code pour vous aider à démarrer :

string dataDir = "Your Document Directory";
string outPath = "Your Output Directory";
Document doc = new Document(dataDir + "Mail merge destinations - Fax.docx");

Remplacer"Your Document Directory" et"Your Output Directory" avec les chemins appropriés.

4. Personnalisation du publipostage

Aspose.Words for Java offre une excellente prise en charge des opérations de publipostage. Vous pouvez personnaliser le processus de publipostage en configurant un gestionnaire d’événements de publipostage. Voici comment procéder :

// Configurez le gestionnaire d'événements de publipostage pour effectuer le travail personnalisé.
doc.getMailMerge().setFieldMergingCallback(new HandleMergeField());

// Supprimez les valeurs de publipostage des espaces de fin et de début.
doc.getMailMerge().setTrimWhitespaces(false);

String[] fieldNames = {
    "RecipientName", "SenderName", "FaxNumber", "PhoneNumber",
    "Subject", "Body", "Urgent", "ForReview", "PleaseComment"
};

Object[] fieldValues = {
    "Josh", "Jenny", "123456789", "", "Hello",
    "<b>HTML Body Test message 1</b>", true, false, true
};

doc.getMailMerge().execute(fieldNames, fieldValues);

5. Sauvegarde du document

Après avoir personnalisé votre document, vous pouvez l’enregistrer à l’aide du code suivant :

doc.save(outPath + "WorkingWithFields.MailMergeFormFields.docx");

Remplacer"Your Output Directory" avec le chemin de sortie souhaité.

Code source complet

string dataDir = "Your Document Directory";
string outPath = "Your Output Directory";
Document doc = new Document(dataDir + "Mail merge destinations - Fax.docx");
// Configurez le gestionnaire d'événements de publipostage pour effectuer le travail personnalisé.
doc.getMailMerge().setFieldMergingCallback(new HandleMergeField());
// Supprimez les valeurs de publipostage des espaces de fin et de début.
doc.getMailMerge().setTrimWhitespaces(false);
String[] fieldNames = {
	"RecipientName", "SenderName", "FaxNumber", "PhoneNumber",
	"Subject", "Body", "Urgent", "ForReview", "PleaseComment"
};
Object[] fieldValues = {
	"Josh", "Jenny", "123456789", "", "Hello",
	"<b>HTML Body Test message 1</b>", true, false, true
};
doc.getMailMerge().execute(fieldNames, fieldValues);
doc.save(outPath + "WorkingWithFields.MailMergeFormFields.docx");

Code source de la classe HandleMergeField

    private static class HandleMergeField implements IFieldMergingCallback
    {
        /// <résumé>
        /// Ce gestionnaire est appelé pour chaque champ de publipostage trouvé dans le document,
        /// pour chaque enregistrement trouvé dans la source de données.
        /// </résumé>
        public void /*IFieldMergingCallback.*/fieldMerging(FieldMergingArgs e) throws Exception
        {
            if (mBuilder == null)
                mBuilder = new DocumentBuilder(e.getDocument());
            // Nous avons décidé que nous souhaitions que toutes les valeurs booléennes soient affichées sous forme de champs de formulaire à cocher.
            if (e.getFieldValue() instanceof /*boolean*/Boolean)
            {
                // Déplacez le "curseur" vers le champ de fusion actuel.
                mBuilder.moveToMergeField(e.getFieldName());
                String checkBoxName = MessageFormat.format("{0}{1}", e.getFieldName(), e.getRecordIndex());
                mBuilder.insertCheckBox(checkBoxName, (Boolean) e.getFieldValue(), 0);
                return;
            }
            switch (e.getFieldName())
            {
                case "Body":
                    mBuilder.moveToMergeField(e.getFieldName());
                    mBuilder.insertHtml((String) e.getFieldValue());
                    break;
                case "Subject":
                {
                    mBuilder.moveToMergeField(e.getFieldName());
                    String textInputName = MessageFormat.format("{0}{1}", e.getFieldName(), e.getRecordIndex());
                    mBuilder.insertTextInput(textInputName, TextFormFieldType.REGULAR, "", (String) e.getFieldValue(), 0);
                    break;
                }
            }
        }
        public void imageFieldMerging(ImageFieldMergingArgs args)
        {
            args.setImageFileName("Image.png");
            args.getImageWidth().setValue(200.0);
            args.setImageHeight(new MergeFieldImageDimension(200.0, MergeFieldImageDimensionUnit.PERCENT));
        }
        private DocumentBuilder mBuilder;
    }
    @Test
    public void mailMergeImageField() throws Exception
    {
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        builder.writeln("{{#foreach example}}");
        builder.writeln("{{Image(126pt;126pt):stempel}}");
        builder.writeln("{{/foreach example}}");
        doc.getMailMerge().setUseNonMergeFields(true);
        doc.getMailMerge().setTrimWhitespaces(true);
        doc.getMailMerge().setUseWholeParagraphAsRegion(false);
        doc.getMailMerge().setCleanupOptions(MailMergeCleanupOptions.REMOVE_EMPTY_TABLE_ROWS
                | MailMergeCleanupOptions.REMOVE_CONTAINING_FIELDS
                | MailMergeCleanupOptions.REMOVE_UNUSED_REGIONS
                | MailMergeCleanupOptions.REMOVE_UNUSED_FIELDS);
        doc.getMailMerge().setFieldMergingCallback(new ImageFieldMergingHandler());
        doc.getMailMerge().executeWithRegions(new DataSourceRoot());
        doc.save("Your Directory Path" + "WorkingWithFields.MailMergeImageField.docx");
    }
    private static class ImageFieldMergingHandler implements IFieldMergingCallback
    {
        public void fieldMerging(FieldMergingArgs args)
        {
            // La mise en œuvre n’est pas requise.
        }
        public void imageFieldMerging(ImageFieldMergingArgs args) throws Exception
        {
            Shape shape = new Shape(args.getDocument(), ShapeType.IMAGE);
            {
                shape.setWidth(126.0); shape.setHeight(126.0); shape.setWrapType(WrapType.SQUARE);
            }
            shape.getImageData().setImage("Your Directory Path" + "Mail merge image.png");
            args.setShape(shape);
        }
    }
    public static class DataSourceRoot implements IMailMergeDataSourceRoot
    {
        public IMailMergeDataSource getDataSource(String s)
        {
            return new DataSource();
        }
        private static class DataSource implements IMailMergeDataSource
        {
            private boolean next = true;
            private String tableName()
            {
                return "example";
            }
            @Override
            public String getTableName() {
                return tableName();
            }
            public boolean moveNext()
            {
                boolean result = next;
                next = false;
                return result;
            }
            public IMailMergeDataSource getChildDataSource(String s)
            {
                return null;
            }
            public boolean getValue(String fieldName, Ref<Object> fieldValue)
            {
                fieldValue.set(null);
                return false;
            }
        }
    }
    @Test
    public void mailMergeAndConditionalField() throws Exception
    {
        Document doc = new Document();
        DocumentBuilder builder = new DocumentBuilder(doc);
        // Insérez un MERGEFIELD imbriqué dans un champ IF.
        // Puisque l'instruction du champ IF est fausse, le résultat du MERGEFIELD interne ne sera pas affiché,
        //et le MERGEFIELD ne recevra aucune donnée lors d'un publipostage.
        FieldIf fieldIf = (FieldIf)builder.insertField(" IF 1 = 2 ");
        builder.moveTo(fieldIf.getSeparator());
        builder.insertField(" MERGEFIELD  FullName ");
        // Nous pouvons toujours compter les MERGEFIELD dans les champs IF à déclaration fausse si nous définissons cet indicateur sur true.
        doc.getMailMerge().setUnconditionalMergeFieldsAndRegions(true);
        DataTable dataTable = new DataTable();
        dataTable.getColumns().add("FullName");
        dataTable.getRows().add("James Bond");
        doc.getMailMerge().execute(dataTable);
        // Le résultat ne sera pas visible dans le document car le champ IF est faux,
        // mais le MERGEFIELD intérieur a effectivement reçu des données.
        doc.save("Your Directory Path" + "WorkingWithFields.MailMergeAndConditionalField.docx");
    }
    @Test
    public void mailMergeImageFromBlob() throws Exception
    {
        Document doc = new Document("Your Directory Path" + "Mail merge destination - Northwind employees.docx");
        doc.getMailMerge().setFieldMergingCallback(new HandleMergeImageFieldFromBlob());
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        String connString = "jdbc:ucanaccess://" + getDatabaseDir() + "Northwind.mdb";
        Connection connection = DriverManager.getConnection(connString, "Admin", "");
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("SELECT * FROM Employees");
        DataTable dataTable = new DataTable(resultSet, "Employees");
        IDataReader dataReader = new DataTableReader(dataTable);
        doc.getMailMerge().executeWithRegions(dataReader, "Employees");
        connection.close();
        doc.save("Your Directory Path" + "WorkingWithFields.MailMergeImageFromBlob.docx");
    }
    public static class HandleMergeImageFieldFromBlob implements IFieldMergingCallback
    {
        public void /*IFieldMergingCallback.*/fieldMerging(FieldMergingArgs args)
        {
            // Ne fais rien.
        }
        /// <résumé>
        /// Ceci est appelé lorsque le moteur de publipostage rencontre le champ de fusion Image:XXX dans le document.
        /// Vous avez la possibilité de renvoyer un objet Image, un nom de fichier ou un flux contenant l'image.
        /// </résumé>
        public void /*IFieldMergingCallback.*/imageFieldMerging(ImageFieldMergingArgs e) throws Exception
        {
            // La valeur du champ est un tableau d'octets, il suffit de le convertir et de créer un flux dessus.
            ByteArrayInputStream imageStream = new ByteArrayInputStream((byte[]) e.getFieldValue());
            // Le moteur de publipostage récupérera désormais l’image du flux.
            e.setImageStream(imageStream);
        }
    }
    @Test
    public void handleMailMergeSwitches() throws Exception
    {
        Document doc = new Document("Your Directory Path" + "Field sample - MERGEFIELD.docx");
        doc.getMailMerge().setFieldMergingCallback(new MailMergeSwitches());
        final String HTML = "<html>\r\n                    <h1>Hello world!</h1>\r\n            </html>";
        doc.getMailMerge().execute(new String[] { "htmlField1" }, new Object[] { HTML });
        doc.save("Your Directory Path" + "WorkingWithFields.HandleMailMergeSwitches.docx");
    }
    public static class MailMergeSwitches implements IFieldMergingCallback
    {
        public void /*IFieldMergingCallback.*/fieldMerging(FieldMergingArgs e) throws Exception
        {
            if (e.getFieldName().startsWith("HTML"))
            {
                if (e.getField().getFieldCode().contains("\\b"))
                {
                    FieldMergeField field = e.getField();
                    DocumentBuilder builder = new DocumentBuilder(e.getDocument());
                    builder.moveToMergeField(e.getDocumentFieldName(), true, false);
                    builder.write(field.getTextBefore());
                    builder.insertHtml(e.getFieldValue().toString());
                    e.setText("");
                }
            }
        }
        public void /*IFieldMergingCallback.*/imageFieldMerging(ImageFieldMergingArgs args)
        {
        }
    }
    @Test
    public void alternatingRows() throws Exception
    {
        Document doc = new Document("Your Directory Path" + "Mail merge destination - Northwind suppliers.docx");
        doc.getMailMerge().setFieldMergingCallback(new HandleMergeFieldAlternatingRows());
        DataTable dataTable = getSuppliersDataTable();
        doc.getMailMerge().executeWithRegions(dataTable);
        doc.save("Your Directory Path" + "WorkingWithFields.AlternatingRows.doc");
    }
    private static class HandleMergeFieldAlternatingRows implements IFieldMergingCallback
    {
        /// <résumé>
        /// Appelé pour chaque champ de fusion rencontré dans le document.
        /// Nous pouvons soit renvoyer certaines données au moteur de publipostage, soit faire autre chose avec le document.
        /// Dans ce cas on modifie le formatage des cellules.
        /// </résumé>
        public void /*IFieldMergingCallback.*/fieldMerging(FieldMergingArgs e)
        {
            if (mBuilder == null)
                mBuilder = new DocumentBuilder(e.getDocument());
            if ("CompanyName".equals(e.getFieldName()))
            {
                // Sélectionnez la couleur selon que le numéro de ligne est pair ou impair.
                Color rowColor = isOdd(mRowIdx) 
                    ? new Color((213), (227), (235)) 
                    : new Color((242), (242), (242));
                //Il n'existe aucun moyen de définir les propriétés des cellules pour toute la ligne pour le moment, nous devons donc parcourir toutes les cellules de la ligne.
                for (int colIdx = 0; colIdx < 4; colIdx++)
                {
                    mBuilder.moveToCell(0, mRowIdx, colIdx, 0);
                    mBuilder.getCellFormat().getShading().setBackgroundPatternColor(rowColor);
                }
                mRowIdx++;
            }
        }
        public void /*IFieldMergingCallback.*/imageFieldMerging(ImageFieldMergingArgs args)
        {
            // Ne fais rien.
        }
        private DocumentBuilder mBuilder;
        private int mRowIdx;
    }
    /// <résumé>
    /// Renvoie vrai si la valeur est impaire ; false si la valeur est paire.
    /// </résumé>
    private static boolean isOdd(int value)
    {
        return (value / 2 * 2) == value;
    }
    /// <résumé>
    /// Créez DataTable et remplissez-le de données.
    /// Dans la vraie vie, ce DataTable doit être rempli à partir d'une base de données.
    /// </résumé>
    private DataTable getSuppliersDataTable()
    {
        DataTable dataTable = new DataTable("Suppliers");
        dataTable.getColumns().add("CompanyName");
        dataTable.getColumns().add("ContactName");
        for (int i = 0; i < 10; i++)
        {
            DataRow datarow = dataTable.newRow();
            dataTable.getRows().add(datarow);
            datarow.set(0, "Company " + i);
            datarow.set(1, "Contact " + i);
        }
        return dataTable;
	}
}

6. Conclusion

Toutes nos félicitations! Vous avez appris à utiliser les champs dans Aspose.Words pour Java pour manipuler dynamiquement des documents Word. Cette API puissante vous donne un contrôle total sur vos documents, ce qui en fait un atout précieux pour les développeurs Java.

7. FAQ

Q1 : Où puis-je télécharger Aspose.Words pour Java ?

Vous pouvez télécharger Aspose.Words pour Java à partir deici.

Q2 : Comment puis-je obtenir une licence temporaire pour Aspose.Words pour Java ?

Vous pouvez obtenir une licence temporaire auprès deici.

Q3 : Où puis-je obtenir de l’aide pour Aspose.Words pour Java ?

Pour obtenir de l’aide, vous pouvez visiter le forum Aspose.Wordsici.

Q4 : Aspose.Words for Java est-il adapté à la gestion du contenu HTML dans les documents Word ?

Oui, Aspose.Words for Java offre une excellente prise en charge pour la gestion du contenu HTML dans les documents Word.

Q5 : Puis-je utiliser Aspose.Words pour Java gratuitement ?

Aspose.Words for Java est un produit commercial, mais vous pouvez explorer ses fonctionnalités avec un essai gratuit disponibleici.

Commencez dès aujourd’hui avec Aspose.Words pour Java et prenez le contrôle de vos documents Word comme jamais auparavant !