So wenden Sie benutzerdefinierte Logik auf nicht zusammengeführte Regionen an

Contents
[ ]

Es gibt Situationen, in denen das vollständige Entfernen nicht zusammengeführter Bereiche aus dem Dokument während Mail Merge nicht erwünscht ist oder dazu führt, dass das Dokument unvollständig aussieht. Dies kann auftreten, wenn das Fehlen von Eingabedaten dem Benutzer in Form einer Nachricht angezeigt werden soll, anstatt den Bereich vollständig zu entfernen.

Es gibt auch Zeiten, in denen das Entfernen der nicht verwendeten Region allein nicht ausreicht, z. B. wenn der Region ein Titel vorangestellt ist oder die Region in einer Tabelle enthalten ist. Wenn dieser Bereich nicht verwendet wird, bleiben Titel und Tabelle nach dem Entfernen des Bereichs erhalten, was im Dokument fehl am Platz aussieht.

Dieser Artikel bietet eine Lösung, um manuell zu definieren, wie nicht verwendete Bereiche im Dokument behandelt werden. Der Basiscode für diese Funktionalität wird mitgeliefert und kann problemlos in einem anderen Projekt wiederverwendet werden.

Die auf jede Region anzuwendende Logik wird in einer Klasse definiert, die die Schnittstelle IFieldMergingCallback implementiert. Auf die gleiche Weise kann ein Mail Merge -Handler eingerichtet werden, um zu steuern, wie jedes Feld zusammengeführt wird. Dieser Handler kann so eingerichtet werden, dass er Aktionen für jedes Feld in einer nicht verwendeten Region oder für die Region als Ganzes ausführt. In diesem Handler können Sie den Code festlegen, um den Text einer Region zu ändern, Knoten oder leere Zeilen und Zellen zu entfernen usw.

In diesem Beispiel verwenden wir das unten angezeigte Dokument. Es enthält verschachtelte Bereiche und einen Bereich in einer Tabelle.

apply-custom-logic-to-unmerged-regions-aspose-words-java

Als schnelle Demonstration können wir eine Beispieldatenbank für das Beispieldokument mit aktiviertem Flag MailMergeCleanupOptions.REMOVE_UNUSED_REGIONS ausführen. Diese Eigenschaft entfernt nicht zusammengeführte Bereiche während eines mail merge automatisch aus dem Dokument.

Die Datenquelle enthält zwei Datensätze für die Region StoreDetails, enthält jedoch absichtlich Daten für die untergeordneten Regionen ContactDetails für einen der Datensätze. Darüber hinaus enthält die Region Suppliers auch keine Datenzeilen. Dadurch verbleiben nicht verwendete Bereiche im Dokument. Das Ergebnis nach dem Zusammenführen des Dokuments mit dieser Datenquelle ist unten aufgeführt.

merged-regions-aspose-words-java

Wie auf dem Bild zu sehen ist, können Sie sehen, dass die Region ContactDetails für den zweiten Datensatz und die Regionen Suppliers von der Mail Merge -Engine automatisch entfernt wurden, da sie keine Daten enthalten. Es gibt jedoch einige Probleme, die dieses Ausgabedokument unvollständig erscheinen lassen:

  • Die Region ContactDetails hinterlässt noch einen Absatz mit dem Text “Kontaktdaten”.
  • Im gleichen Fall gibt es keinen Hinweis darauf, dass keine Telefonnummern vorhanden sind, nur ein Leerzeichen, das zu Verwirrung führen könnte.
  • Die Tabelle und der Titel, die sich auf die Region Suppliers beziehen, bleiben auch nach dem Entfernen der Region in der Tabelle erhalten.

Die in diesem Artikel bereitgestellte Technik zeigt, wie benutzerdefinierte Logik auf jede nicht zusammengeführte Region angewendet wird, um diese Probleme zu vermeiden.

Lösung

Um Logik manuell auf jeden nicht verwendeten Bereich im Dokument anzuwenden, nutzen wir Funktionen, die bereits in Aspose.Words verfügbar sind.

Die Mail Merge -Engine bietet eine Eigenschaft zum Entfernen nicht verwendeter Bereiche durch das Flag MailMergeCleanupOptions.RemoveUnusedRegions. Dies kann deaktiviert werden, so dass solche Regionen während einer mail merge unberührt bleiben. Dies ermöglicht es uns, die nicht zusammengeführten Bereiche im Dokument zu belassen und sie stattdessen manuell selbst zu bearbeiten.

Wir können dann die Eigenschaft MailMerge.FieldMergingCallback nutzen, um während Mail Merge unsere eigene benutzerdefinierte Logik auf diese nicht zusammengeführten Regionen anzuwenden, indem wir eine Handlerklasse verwenden, die die Schnittstelle IFieldMergingCallback implementiert.

Dieser Code innerhalb der Handlerklasse ist die einzige Klasse, die Sie ändern müssen, um die Logik zu steuern, die auf nicht zusammengeführte Regionen angewendet wird. Der andere Code in diesem Beispiel kann ohne Änderung in jedem Projekt wiederverwendet werden.

Dieses Beispielprojekt demonstriert diese Technik. Es umfasst die folgenden Schritte:

  1. Führen Sie Mail Merge für das Dokument unter Verwendung Ihrer Datenquelle aus. Das Flag MailMergeCleanupOptions.RemoveUnusedRegions ist vorerst deaktiviert, wir möchten, dass die Regionen erhalten bleiben, damit wir sie manuell verarbeiten können. Alle Regionen ohne Daten werden im Dokument nicht zusammengeführt.
  2. Rufen Sie die ExecuteCustomLogicOnEmptyRegions-Methode auf. Diese Methode wird in diesem Beispiel bereitgestellt. Es führt Aktionen aus, mit denen der angegebene Handler für jede nicht zusammengeführte Region aufgerufen werden kann. Diese Methode ist wiederverwendbar und kann unverändert in jedes Projekt kopiert werden, das sie benötigt (zusammen mit allen abhängigen Methoden).Diese Methode führt die folgenden Schritte aus:
    1. Setzt den vom Benutzer angegebenen Handler auf die Eigenschaft MailMerge.FieldMergingCallback.
    2. Ruft die CreateDataSourceFromDocumentRegions -Methode auf, die die Document - und ArrayList -enthaltenden Regionsnamen des Benutzers akzeptiert. Diese Methode erstellt eine Dummy-Datenquelle, die Tabellen für jeden nicht zusammengeführten Bereich im Dokument enthält.
    3. Führt Mail Merge für das Dokument unter Verwendung der Dummy-Datenquelle aus. Wenn Mail Merge mit dieser Datenquelle ausgeführt wird, kann der benutzerdefinierte Handler für jede Unmerge-Region aufgerufen und die benutzerdefinierte Logik angewendet werden

Codes

Die Implementierung für die ExecuteCustomLogicOnEmptyRegions -Methode finden Sie unten. Diese Methode akzeptiert mehrere Parameter:

  1. Das Document -Objekt, das nicht zusammengeführte Bereiche enthält, die vom übergebenen Handler behandelt werden sollen.
  2. Die Handlerklasse, die die Logik definiert, die auf nicht zusammengeführte Regionen angewendet werden soll. Dieser Handler muss die implementieren IFieldMergingCallback Schnittstelle.
  3. Durch die Verwendung der entsprechenden Überladung kann die Methode auch einen dritten Parameter akzeptieren - eine Liste von Regionsnamen als Zeichenfolgen. Wenn dies angegeben ist, werden nur Regionsnamen, die in dem in der Liste angegebenen Dokument verbleiben, manuell verarbeitet. Andere gefundene Regionen werden vom Handler nicht aufgerufen und automatisch entfernt. Wenn die Überladung mit nur zwei Parametern angegeben ist, wird jeder verbleibende Bereich im Dokument von der manuell zu handhabenden Methode eingeschlossen.

Beispiel

Zeigt, wie benutzerdefinierte Logik für nicht verwendete Bereiche mit dem angegebenen Handler ausgeführt wird.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
/**
* Applies logic defined in the passed handler class to all unused regions
* in the document. This allows to manually control how unused regions are
* handled in the document.
*
* @param doc The document containing unused regions.
* @param handler The handler which implements the IFieldMergingCallback
* interface and defines the logic to be applied to each unmerged
* region.
*/
public static void executeCustomLogicOnEmptyRegions(Document doc, IFieldMergingCallback handler) throws Exception {
executeCustomLogicOnEmptyRegions(doc, handler, null); // Pass null to handle all regions found in the document.
}
/**
* Applies logic defined in the passed handler class to specific unused
* regions in the document as defined in regionsList. This allows to
* manually control how unused regions are handled in the document.
*
* @param doc The document containing unused regions.
* @param handler The handler which implements the IFieldMergingCallback
* interface and defines the logic to be applied to each unmerged
* region.
* @param regionsList A list of strings corresponding to the region names that are
* to be handled by the supplied handler class. Other regions
* encountered will not be handled and are removed automatically.
*/
public static void executeCustomLogicOnEmptyRegions(Document doc, IFieldMergingCallback handler, ArrayList regionsList) throws Exception {
// Certain regions can be skipped from applying logic to by not adding the table name inside the CreateEmptyDataSource method.
// Enable this cleanup option so any regions which are not handled by the user's logic are removed automatically.
doc.getMailMerge().setCleanupOptions(MailMergeCleanupOptions.REMOVE_UNUSED_REGIONS);
// Set the user's handler which is called for each unmerged region.
doc.getMailMerge().setFieldMergingCallback(handler);
// Execute mail merge using the dummy dataset. The dummy data source contains the table names of
// each unmerged region in the document (excluding ones that the user may have specified to be skipped). This will allow the handler
// to be called for each field in the unmerged regions.
doc.getMailMerge().executeWithRegions(createDataSourceFromDocumentRegions(doc, regionsList));
}
/**
* A helper method that creates an empty Java disconnected ResultSet with
* the specified columns.
*/
private static ResultSet createCachedRowSet(String[] columnNames) throws Exception {
RowSetMetaDataImpl metaData = new RowSetMetaDataImpl();
metaData.setColumnCount(columnNames.length);
for (int i = 0; i < columnNames.length; i++) {
metaData.setColumnName(i + 1, columnNames[i]);
metaData.setColumnType(i + 1, java.sql.Types.VARCHAR);
}
CachedRowSet rowSet = RowSetProvider.newFactory().createCachedRowSet();
;
rowSet.setMetaData(metaData);
return rowSet;
}
/**
* A helper method that adds a new row with the specified values to a
* disconnected ResultSet.
*/
private static void addRow(ResultSet resultSet, String[] values) throws Exception {
resultSet.moveToInsertRow();
for (int i = 0; i < values.length; i++)
resultSet.updateString(i + 1, values[i]);
resultSet.insertRow();
// This "dance" is needed to add rows to the end of the result set properly.
// If I do something else then rows are either added at the front or the result
// set throws an exception about a deleted row during mail merge.
resultSet.moveToCurrentRow();
resultSet.last();
}

Beispiel

Definiert die Methode, mit der nicht zusammengeführte Regionen manuell behandelt werden.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
/**
* Returns a DataSet object containing a DataTable for the unmerged regions
* in the specified document. If regionsList is null all regions found
* within the document are included. If an ArrayList instance is present the
* only the regions specified in the list that are found in the document are
* added.
*/
private static DataSet createDataSourceFromDocumentRegions(Document doc, ArrayList regionsList) throws Exception {
final String TABLE_START_MARKER = "TableStart:";
DataSet dataSet = new DataSet();
String tableName = null;
for (String fieldName : doc.getMailMerge().getFieldNames()) {
if (fieldName.contains(TABLE_START_MARKER)) {
tableName = fieldName.substring(TABLE_START_MARKER.length());
} else if (tableName != null) {
// Only add the table as a new DataTable if it doesn't already exists in the DataSet.
if (dataSet.getTables().get(tableName) == null) {
ResultSet resultSet = createCachedRowSet(new String[]{fieldName});
// We only need to add the first field for the handler to be called for the fields in the region.
if (regionsList == null || regionsList.contains(tableName)) {
addRow(resultSet, new String[]{"FirstField"});
}
dataSet.getTables().add(new DataTable(resultSet, tableName));
}
tableName = null;
}
}
return dataSet;
}

Bei dieser Methode werden alle nicht zusammengeführten Bereiche im Dokument gefunden. Dies wird mit der MailMerge.GetFieldNames -Methode erreicht. Diese Methode gibt alle Seriendruckfelder im Dokument zurück, einschließlich der Start- und Endmarkierungen des Bereichs (dargestellt durch Seriendruckfelder mit dem Präfix TableStart oder TableEnd).

Wenn ein TableStart -Seriendruckfeld gefunden wird, wird dieses als neue DataTable zu DataSet hinzugefügt. Da eine Region mehr als einmal vorkommen kann (z. B. weil es sich um eine verschachtelte Region handelt, in der die übergeordnete Region mit mehreren Datensätzen zusammengeführt wurde), wird die Tabelle nur erstellt und hinzugefügt, wenn sie nicht bereits in DataSet vorhanden ist.

Wenn ein geeigneter Regionsanfang gefunden und der Datenbank hinzugefügt wurde, wird das nächste Feld (das dem ersten Feld in der Region entspricht) zu DataTable hinzugefügt. Für jedes Feld in der Region, das zusammengeführt und an den Handler übergeben werden soll, muss nur das erste Feld hinzugefügt werden.

Wir setzen auch den Feldwert des ersten Felds auf “FirstField”, um die Anwendung von Logik auf das erste oder andere Felder in der Region zu vereinfachen. Wenn Sie dies einschließen, bedeutet dies, dass es nicht erforderlich ist, den Namen des ersten Felds fest zu codieren oder zusätzlichen Code zu implementieren, um zu überprüfen, ob das aktuelle Feld das erste im Handlercode ist.

Der folgende Code zeigt, wie dieses System funktioniert. Das am Anfang dieses Artikels gezeigte Dokument wird mit derselben Datenquelle erneut zusammengeführt, aber diesmal werden die nicht verwendeten Bereiche von benutzerdefiniertem Code verarbeitet.

Beispiel

Zeigt, wie nicht zusammengeführte Regionen nach Mail Merge mit benutzerdefiniertem Code behandelt werden.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Open the document.
Document doc = new Document(dataDir + "TestFile.doc");
// Create a data source which has some data missing.
// This will result in some regions that are merged and some that remain after executing mail merge.
DataSet data = getDataSource();
// Make sure that we have not set the removal of any unused regions as we will handle them manually.
// We achieve this by removing the RemoveUnusedRegions flag from the cleanup options by using the AND and NOT bitwise operators.
doc.getMailMerge().setCleanupOptions(doc.getMailMerge().getCleanupOptions() & ~MailMergeCleanupOptions.REMOVE_UNUSED_REGIONS);
// Execute mail merge. Some regions will be merged with data, others left unmerged.
doc.getMailMerge().executeWithRegions(data);
// The regions which contained data now would of been merged. Any regions which had no data and were
// not merged will still remain in the document.
Document mergedDoc = doc.deepClone(); //ExSkip
// Apply logic to each unused region left in the document using the logic set out in the handler.
// The handler class must implement the IFieldMergingCallback interface.
executeCustomLogicOnEmptyRegions(doc, new EmptyRegionsHandler());
// Save the output document to disk.
doc.save(dataDir + "TestFile.CustomLogicEmptyRegions1 Out.doc");

Der Code führt verschiedene Operationen basierend auf dem Namen der Region aus, die mit der Eigenschaft FieldMergingArgs.TableName abgerufen wurde. Beachten Sie, dass Sie abhängig von Ihrem Dokument und Ihren Regionen den Handler so codieren können, dass die Logik abhängig von jeder Region oder jedem Code ausgeführt wird, der für jede nicht zusammengeführte Region im Dokument oder eine Kombination aus beiden gilt.

Die Logik für die Region ContactDetails beinhaltet das Ändern des Textes jedes Felds in der Region ContactDetails mit einer entsprechenden Meldung, die besagt, dass keine Daten vorhanden sind. Die Namen der einzelnen Felder werden innerhalb des Handlers mithilfe der Eigenschaft FieldMergingArgs.FieldName abgeglichen.

Ein ähnlicher Prozess wird auf die Region Suppliers angewendet, wobei zusätzlicher Code hinzugefügt wird, um die Tabelle zu behandeln, die die Region enthält. Der Code prüft, ob die Region in einer Tabelle enthalten ist (da sie möglicherweise bereits entfernt wurde). Wenn dies der Fall ist, werden die gesamte Tabelle sowie der vorangehende Absatz aus dem Dokument entfernt, sofern sie mit einem Überschriftenstil formatiert ist, z. B. “Heading 1”.

Beispiel

Zeigt, wie benutzerdefinierte Logik in einem Handler definiert wird, der IFieldMergingCallback implementiert und für nicht zusammengeführte Bereiche im Dokument ausgeführt wird.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public static class EmptyRegionsHandler implements IFieldMergingCallback {
/**
* Called for each field belonging to an unmerged region in the
* document.
*/
public void fieldMerging(FieldMergingArgs args) throws Exception {
// Change the text of each field of the ContactDetails region individually.
if ("ContactDetails".equals(args.getTableName())) {
// Set the text of the field based off the field name.
if ("Name".equals(args.getFieldName()))
args.setText("(No details found)");
else if ("Number".equals(args.getFieldName()))
args.setText("(N/A)");
}
// Remove the entire table of the Suppliers region. Also check if the previous paragraph
// before the table is a heading paragraph and if so remove that too.
if ("Suppliers".equals(args.getTableName())) {
Table table = (Table) args.getField().getStart().getAncestor(NodeType.TABLE);
// Check if the table has been removed from the document already.
if (table.getParentNode() != null) {
// Try to find the paragraph which precedes the table before the table is removed from the document.
if (table.getPreviousSibling() != null && table.getPreviousSibling().getNodeType() == NodeType.PARAGRAPH) {
Paragraph previousPara = (Paragraph) table.getPreviousSibling();
if (isHeadingParagraph(previousPara))
previousPara.remove();
}
table.remove();
}
}
}
/**
* Returns true if the paragraph uses any Heading style e.g Heading 1 to
* Heading 9
*/
private boolean isHeadingParagraph(Paragraph para) throws Exception {
return (para.getParagraphFormat().getStyleIdentifier() >= StyleIdentifier.HEADING_1 && para.getParagraphFormat().getStyleIdentifier() <= StyleIdentifier.HEADING_9);
}
public void imageFieldMerging(ImageFieldMergingArgs args) throws Exception {
// Do Nothing
}
}

Das Ergebnis des obigen Codes ist unten gezeigt. Die nicht zusammengeführten Felder im ersten Bereich werden durch informativen Text ersetzt, und das Entfernen der Tabelle und der Überschrift lässt das Dokument vollständig aussehen.

apply-custom-logic-to-unmerged-regions-aspose-words-java-2

Der Code, der die übergeordnete Tabelle entfernt, könnte auch für jede nicht verwendete Region anstatt nur für eine bestimmte Region ausgeführt werden, indem die Prüfung auf den Tabellennamen entfernt wird. Wenn in diesem Fall ein Bereich innerhalb einer Tabelle nicht mit Daten zusammengeführt wurde, werden sowohl der Bereich als auch die Containertabelle automatisch entfernt.

Wir können verschiedenen Code in den Handler einfügen, um zu steuern, wie nicht zusammengeführte Regionen behandelt werden. Wenn Sie stattdessen den folgenden Code im Handler verwenden, wird der Text im ersten Absatz der Region in eine hilfreiche Nachricht geändert, während alle nachfolgenden Absätze in der Region entfernt werden. Diese anderen Absätze werden entfernt, da sie nach dem Zusammenführen unserer Nachricht in der Region verbleiben würden.

Der Ersetzungstext wird in das erste Feld eingefügt, indem der angegebene Text in die Eigenschaft FieldMergingArgs.Text gesetzt wird. Der Text aus dieser Eigenschaft wird von der Mail Merge-Engine in das Feld eingefügt.

Der Code wendet dies nur für das erste Feld in der Region an, indem die Eigenschaft FieldMergingArgs.FieldValue überprüft wird. Der Feldwert des ersten Feldes in der Region ist mit “FirstField” gekennzeichnet. Dies erleichtert die Implementierung dieser Art von Logik in vielen Regionen, da kein zusätzlicher Code erforderlich ist.

Beispiel

Zeigt, wie Sie einen nicht verwendeten Bereich durch eine Nachricht ersetzen und zusätzliche Absätze entfernen.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Store the parent paragraph of the current field for easy access.
Paragraph parentParagraph = args.getField().getStart().getParentParagraph();
// Define the logic to be used when the ContactDetails region is encountered.
// The region is removed and replaced with a single line of text stating that there are no records.
if ("ContactDetails".equals(args.getTableName())) {
// Called for the first field encountered in a region. This can be used to execute logic on the first field
// in the region without needing to hard code the field name. Often the base logic is applied to the first field and
// different logic for other fields. The rest of the fields in the region will have a null FieldValue.
if ("FirstField".equals(args.getFieldValue())) {
FindReplaceOptions opts = new FindReplaceOptions();
opts.setMatchCase(false);
opts.setFindWholeWordsOnly(false);
// Remove the "Name:" tag from the start of the paragraph
parentParagraph.getRange().replace("Name:", "", opts);
// Set the text of the first field to display a message stating that there are no records.
args.setText("No records to display");
} else {
// We have already inserted our message in the paragraph belonging to the first field. The other paragraphs in the region
// will still remain so we want to remove these. A check is added to ensure that the paragraph has not already been removed.
// which may happen if more than one field is included in a paragraph.
if (parentParagraph.getParentNode() != null)
parentParagraph.remove();
}
}

Das resultierende Dokument, nachdem der obige Code ausgeführt wurde, ist unten gezeigt. Der nicht verwendete Bereich wird durch eine Meldung ersetzt, die besagt, dass keine anzuzeigenden Datensätze vorhanden sind.

apply-custom-logic-to-unmerged-regions-aspose-words-java-3

Als weiteres Beispiel können wir den folgenden Code anstelle des Codes einfügen, der ursprünglich die SuppliersRegion behandelt hat. Dadurch wird eine Meldung in der Tabelle angezeigt und die Zellen werden zusammengeführt, anstatt die Tabelle aus dem Dokument zu entfernen. Da sich der Bereich in einer Tabelle mit mehreren Zellen befindet, sieht es schöner aus, wenn die Zellen der Tabelle zusammengeführt und die Nachricht zentriert werden.

Beispiel

Zeigt, wie alle übergeordneten Zellen eines nicht verwendeten Bereichs zusammengeführt und eine Meldung in der Tabelle angezeigt werden.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Replace the unused region in the table with a "no records" message and merge all cells into one.
if ("Suppliers".equals(args.getTableName())) {
if ("FirstField".equals(args.getFieldValue())) {
// We will use the first paragraph to display our message. Make it centered within the table. The other fields in other cells
// within the table will be merged and won't be displayed so we don't need to do anything else with them.
parentParagraph.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
args.setText("No records to display");
}
// Merge the cells of the table together.
Cell cell = (Cell) parentParagraph.getAncestor(NodeType.CELL);
if (cell != null) {
if (cell.isFirstCell())
cell.getCellFormat().setHorizontalMerge(CellMerge.FIRST); // If this cell is the first cell in the table then the merge is started using "CellMerge.First".
else
cell.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS); // Otherwise the merge is continued using "CellMerge.Previous".
}
}

Das resultierende Dokument, nachdem der obige Code ausgeführt wurde, ist unten gezeigt.

apply-custom-logic-to-unmerged-regions-aspose-words-java-4

Schließlich können wir die ExecuteCustomLogicOnEmptyRegions -Methode aufrufen und die Tabellennamen angeben, die in unserer Handler-Methode behandelt werden sollen, während andere angegeben werden, die automatisch entfernt werden sollen.

Beispiel

Zeigt, wie nur die ContactDetails-Region angegeben wird, die von der Handlerklasse verarbeitet werden soll.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
ArrayList<String> regions = new ArrayList<String>();
regions.add("ContactDetails");
executeCustomLogicOnEmptyRegions(doc, new EmptyRegionsHandler(), regions);

Durch Aufrufen dieser Überladung mit dem angegebenen ArrayList wird die Datenquelle erstellt, die nur Datenzeilen für die angegebenen Regionen enthält. Andere Regionen als die ContactDetails-Region werden nicht behandelt und stattdessen automatisch von der Mail Merge-Engine entfernt. Das Ergebnis des obigen Aufrufs unter Verwendung des Codes in unserem ursprünglichen Handler ist unten gezeigt.

apply-custom-logic-to-unmerged-regions-aspose-words-java-5