V tomto článku vám ukážu, jak provést hromadnou korespondenci MS Word pomocí C# nebo VB.NET bez MS Word nebo Office Interop. Aspose.Words for .NET je na funkce bohaté a výkonné rozhraní Word API, které poskytuje všechny základní i rozšířené funkce hromadné korespondence MS Word. Umožňuje generovat dopisy, obálky, zprávy, faktury a další typy dokumentů v rámci Windows Forms, webových aplikací ASP.NET nebo jakékoli aplikace .NET/.NET Core.

Tento článek, který pokrývá hlavní funkce našeho .NET Mail Merge API, se skládá z následujících částí:

Co je hromadná korespondence?

Mail Merge je způsob automatického generování zpráv, dopisů, obálek, faktur a dalších typů dokumentů. Hromadná korespondence v MS Word vám umožňuje vytvořit šablonu dokumentu obsahující slučovací pole a poté tato pole naplnit pomocí záznamů ve zdroji dat. Abyste porozuměli hromadné korespondenci, předpokládejme, že musíte poslat dopis deseti různým lidem a aktualizovat pouze pole se jménem a adresou. V takovém případě jednoduše vytvořte šablonu dopisu a poté dynamicky generujte písmena vyplněním slučovacích polí jména a adresy pomocí zdroje dat.

Zdroje dat pro hromadnou korespondenci

Data pro hromadnou korespondenci lze načíst z libovolného zdroje dat, jako je XML, JSON nebo databáze. Pokud jde o Aspose.Words for .NET, můžete použít jakýkoli zdroj dat, který ADO.NET podporuje. Data lze načíst do DataSet, DataTable, DataView nebo do pole hodnot.

Příprava šablony pro hromadnou korespondenci

Šablona hromadné korespondence je dokument, který obsahuje slučovací pole. Tato pole jsou poté vyplněna daty ve zdroji dat při spuštění hromadné korespondence. Šablonový dokument nemusí být ve formátu šablony a může to být dokument DOC/DOCX. Takto můžete připravit šablonu pro hromadnou korespondenci.

  • Otevřete dokument nebo vytvořte nový v MS Word.
  • Umístěte kurzor na místo, kam chcete přidat slučovací pole.
  • Z nabídky Vložit vyberte možnost Pole.
  • Ze seznamu Názvy polí vyberte MergeField.
  • Do pole Název pole zadejte název slučovacího pole a stiskněte OK.
  • Uložte dokument.

Následuje snímek obrazovky dokumentu ukázka šablony.

Šablona hromadné korespondence

.NET Mail Merge API – instalace

Aspose.Words for .NET lze stáhnout nebo nainstalovat pomocí následujících způsobů:

Proveďte hromadnou korespondenci v dokumentu Word pomocí C#

Jakmile budete mít šablonu připravenou, můžete spustit hromadnou korespondenci a vygenerovat dokumenty. Následují kroky k provedení hromadné korespondence na výše uvedené šabloně.

Následující ukázka kódu ukazuje, jak provést hromadnou korespondenci MS Word pomocí pole hodnot v C#.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
// Cesta k adresáři dokumentů.
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
// Otevřete existující dokument.
Document doc = new Document(dataDir + "MailMerge.ExecuteArray.doc");

// Ořízněte koncové a úvodní prázdné hodnoty hromadné korespondence
doc.MailMerge.TrimWhitespaces = false;

// Vyplňte pole v dokumentu uživatelskými údaji.
doc.MailMerge.Execute(
    new string[] { "FullName", "Company", "Address", "Address2", "City" },
    new object[] { "James Bond", "MI5 Headquarters", "Milbank", "", "London" });

dataDir = dataDir + "MailMerge.ExecuteArray_out.doc";
// Odešlete dokument ve formátu Word do klientského prohlížeče s možností uložení na disk nebo otevření v aktuálním prohlížeči.
doc.Save(dataDir);

Dokument aplikace Word po hromadné korespondenci

Proveďte hromadnou korespondenci v C#

Proveďte hromadnou korespondenci pomocí zdroje dat XML v C#

Soubory XML se široce používají k uchovávání a importu/exportu dat. Aspose.Words for .NET také podporuje XML jako zdroj dat pro hromadnou korespondenci. Stačí načíst XML do objektu DataSet a spustit hromadnou korespondenci. Následuje ukázkový soubor XML, který budeme používat.

<customers>
<customer Name="John Ben Jan" ID="1" Domain="History" City="Boston"/>
<customer Name="Lisa Lane" ID="2" Domain="Chemistry" City="LA"/>
<customer Name="Dagomir Zits" ID="3" Domain="Heraldry" City="Milwaukee"/>
<customer Name="Sara Careira Santy" ID="4" Domain="IT" City="Miami"/>
</customers>

Následující ukázka kódu načte data ze zdroje dat XML a spustí hromadnou korespondenci pomocí jazyka C#.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
// Cesta k adresáři dokumentů.
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 

// Vytvořte datovou sadu a přečtěte si XML.
DataSet customersDs = new DataSet();
customersDs.ReadXml(dataDir + "Customers.xml");

string fileName = "TestFile XML.doc";
// Otevřete dokument šablony.
Document doc = new Document(dataDir + fileName);

// Spusťte hromadnou korespondenci a naplňte šablonu daty z XML pomocí DataTable.
doc.MailMerge.Execute(customersDs.Tables["Customer"]);

dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
// Uložte výstupní dokument.
doc.Save(dataDir);

Níže je hromadná korespondence šablona, která bude naplněna daty XML.

Šablona hromadné korespondence pro XML

Následuje stránka 1 výsledného dokumentu aplikace Word, který získáme po provedení hromadné korespondence.

Proveďte hromadnou korespondenci s XML v C#

Vlastní formátování slučovacích polí

Aspose.Words for .NET vám dává větší kontrolu nad hromadnou korespondencí během provádění. Vlastnost MailMerge.FieldMergingCallback vám umožňuje přizpůsobit hromadnou korespondenci, když je zjištěno jakékoli slučovací pole. MailMerge.FieldMergingCallback přijímá třídu implementující metody IFieldMergingCallback.FieldMerging a IFieldMergingCallback.ImageFieldMerging.

Následující ukázka kódu ukazuje, jak přizpůsobit operaci hromadné korespondence a použít formátování na buňky v této šabloně.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
// Cesta k adresáři dokumentů.
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
Document doc = new Document(dataDir + "MailMerge.AlternatingRows.doc");

// Přidejte obslužnou rutinu pro událost MergeField.
doc.MailMerge.FieldMergingCallback = new HandleMergeFieldAlternatingRows();

// Proveďte hromadnou korespondenci s oblastmi.
DataTable dataTable = GetSuppliersDataTable();
doc.MailMerge.ExecuteWithRegions(dataTable);
dataDir = dataDir + "MailMerge.AlternatingRows_out.doc";
doc.Save(dataDir);

Následuje implementace třídy HandleMergeFieldAlternatingRows.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
private class HandleMergeFieldAlternatingRows : IFieldMergingCallback
{
    ///<summary>
    /// Volá se pro každé slučovací pole nalezené v dokumentu.
    /// Můžeme buď vrátit některá data do modulu hromadné korespondence, nebo něco udělat
    /// Jinak s dokumentem. V tomto případě upravíme formátování buněk.
    ///</summary>
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
    {
        if (mBuilder == null)
            mBuilder = new DocumentBuilder(e.Document);

        // Tímto způsobem chytíme začátek nové řady.
        if (e.FieldName.Equals("CompanyName"))
        {
            // Vyberte barvu podle toho, zda je číslo řádku sudé nebo liché.
            Color rowColor;
            if (IsOdd(mRowIdx))
                rowColor = Color.FromArgb(213, 227, 235);
            else
                rowColor = Color.FromArgb(242, 242, 242);

            // V tuto chvíli neexistuje způsob, jak nastavit vlastnosti buňky pro celý řádek,
            // Musíme tedy iterovat přes všechny buňky v řádku.
           for (int colIdx = 0; colIdx < 4; colIdx++)
            {
                mBuilder.MoveToCell(0, mRowIdx, colIdx, 0);
                mBuilder.CellFormat.Shading.BackgroundPatternColor = rowColor;
            }

            mRowIdx++;
        }
    }

    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
    {
        // Nedělat nic.
    }

    private DocumentBuilder mBuilder;
    private int mRowIdx;
}     
///<summary>
/// Vrátí true, pokud je hodnota lichá; false, pokud je hodnota sudá.
///</summary>
private static bool IsOdd(int value)
{
    // Kód je trochu složitý, ale jinak automatický převod do VB nefunguje.
    return ((value / 2) * 2).Equals(value);
}      
///<summary>
/// Vytvořte DataTable a naplňte ji daty.
/// V reálném životě by tato DataTable měla být vyplněna z databáze.
///</summary>
private static DataTable GetSuppliersDataTable()
{
    DataTable dataTable = new DataTable("Suppliers");
    dataTable.Columns.Add("CompanyName");
    dataTable.Columns.Add("ContactName");
   for (int i = 0; i < 10; i++)
    {
        DataRow datarow = dataTable.NewRow();
        dataTable.Rows.Add(datarow);
        datarow[0] = "Company " + i.ToString();
        datarow[1] = "Contact " + i.ToString();
    }
    return dataTable;
}

Hromadná korespondence s regiony pomocí C#

Může nastat případ, kdy potřebujete naplnit a zopakovat určitou oblast v dokumentu aplikace Word. V takovém případě můžete použít Hromadnou korespondenci s regiony. Chcete-li vytvořit oblast, musíte určit začátek a konec oblasti a poté Mail Megre tuto oblast zopakuje pro každý záznam ve zdroji dat. Například následující šablona obsahuje dvě oblasti, Orders a OrderDetails se slučovacími poli «TableStart:Orders», «TableEnd:Orders» a «TableStart:OrderDetails», «TableEnd:OrderDetails» v tomto pořadí.

Hromadná korespondence s regiony

Následuje ukázka kódu, která provádí Mail Megre v oblastech pro výše zmíněnou šablonu.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
// Cesta k adresáři dokumentů.
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting();
string fileName = "MailMerge.ExecuteWithRegions.doc";
Document doc = new Document(dataDir + fileName);
 
// Použijte DataTable jako zdroj dat.
int orderId = 10444;
DataTable orderTable = GetTestOrder(orderId);
doc.MailMerge.ExecuteWithRegions(orderTable);
 
// Namísto použití DataTable můžete vytvořit DataView pro vlastní řazení nebo filtr a poté hromadnou korespondenci.
DataView orderDetailsView = new DataView(GetTestOrderDetails(orderId));
orderDetailsView.Sort = "ExtendedPrice DESC";
 
// Proveďte operaci hromadné korespondence.
doc.MailMerge.ExecuteWithRegions(orderDetailsView);
 
// Uložte sloučený dokument.
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
doc.Save(dataDir);

Níže jsou uvedeny způsoby čtení dat z databáze.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
private static DataTable GetTestOrder(int orderId)
{
    DataTable table = ExecuteDataTable(string.Format(
        "SELECT * FROM AsposeWordOrders WHERE OrderId = {0}", orderId));
    table.TableName = "Orders";
    return table;
}
private static DataTable GetTestOrderDetails(int orderId)
{
    DataTable table = ExecuteDataTable(string.Format(
        "SELECT * FROM AsposeWordOrderDetails WHERE OrderId = {0} ORDER BY ProductID", orderId));
    table.TableName = "OrderDetails";
    return table;
}
///<summary>
/// Utility funkce, která vytváří spojení, příkaz, 
/// Provede příkaz a vrátí výsledek v DataTable.
///</summary>
private static DataTable ExecuteDataTable(string commandText)
{
    // Otevřete připojení k databázi.
    string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
        RunExamples.GetDataDir_Database() + "Northwind.mdb";
    OleDbConnection conn = new OleDbConnection(connString);
    conn.Open();

    // Vytvořte a spusťte příkaz.
    OleDbCommand cmd = new OleDbCommand(commandText, conn);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    DataTable table = new DataTable();
    da.Fill(table);

    // Zavřete databázi.
    conn.Close();

    return table;
}

Vnořené oblasti hromadné korespondence

Nejčastěji data, která máme ve zdroji dat, přicházejí ve formě vztahů. Například tabulka “Objednávka” bude mít vztah jedna k mnoha s “Podrobnosti objednávky”, která bude uchovávat záznamy o položkách v objednávce. K řešení takových vztahů rodiče a potomka se používá vnořená hromadná korespondence. Následuje ukázka šablona faktury, která dobře vyhovuje tomuto scénáři.

Šablona hromadné korespondence s regiony

Následuje ukázkový zdroj dat XML, který použijeme pro vnořenou hromadnou korespondenci.

<?xml version="1.0" encoding="utf-8"?>
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="OrdersSchema.xsd">
  <Order>
    <Number>23</Number>
    <Address>Nelson Street</Address>
    <Suburb>Howick</Suburb>
    <City>Auckland</City>
    <Phonenumber>543 1234</Phonenumber>
    <Date>03/01/2010</Date>
    <Total>14.00</Total>
    <Item>
      <Name>BBQ Chicken Pizza</Name>
      <Price>6.00</Price>
      <Quantity>1</Quantity>
      <ItemTotal>6.00</ItemTotal>
    </Item>
    <Item>
      <Name>1.5 Litre Coke</Name>
      <Price>4.00</Price>
      <Quantity>2</Quantity>
      <ItemTotal>8.00</ItemTotal>
    </Item>
  </Order>
  <Order>
    <Number>10</Number>
    <Address>Parkville Avenue</Address>
    <Suburb>Pakuranga</Suburb>
    <City>Auckland</City>
    <Phonenumber>548 7342</Phonenumber>
    <Date>05/03/2010</Date>
    <Total>6.00</Total>
    <Item>
      <Name>Hawaiian Pizza</Name>
      <Price>4.00</Price>
      <Quantity>1</Quantity>
      <ItemTotal>4.00</ItemTotal>
    </Item>
    <Item>
      <Name>Fries</Name>
      <Price>1.00</Price>
      <Quantity>2</Quantity>
      <ItemTotal>2.00</ItemTotal>
    </Item>
  </Order>
</Orders>

Zatímco OrderSchema.xsd pro tento XML je:

<?xml version="1.0" encoding ="utf-8"?>
<xs:schema id="OrdersSchema"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Orders">
 <xs:complexType>
 <xs:sequence>
  <xs:element name="Order">
  <xs:complexType>
  <xs:sequence>
  <xs:element name="Number"/>
  <xs:element name="Address"/>
  <xs:element name="Suburb"/>
  <xs:element name="City"/>
  <xs:element name="Phonenumber">
  <xs:element name="Date"/>
  <xs:element name="Total"/>
  <xs:element name="Item">
   <xs:complexType>
   <xs:sequence>
   <xs:element name="Name"/>
   <xs:element name="Price"/>
   <xs:element name="Quantity"/>
   <xs:element name="ItemTotal"/>
   </xs:sequence>
  </xs:complexType>
  </xs:element>
  </xs:sequence>
  </xs:complexType>
 </xs:element>
 </xs:sequence>
 </xs:complexType>
 </xs:element>
</xs:schema>

Následující ukázka kódu se používá ke spuštění vnořené hromadné korespondence pomocí jazyka C#.

// Úplné příklady a datové soubory najdete na https://github.com/aspose-words/Aspose.Words-for-.NET
// Cesta k adresáři dokumentů.
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
	 
// Vytvořte datovou sadu a přečtěte si XML.
DataSet pizzaDs = new DataSet();
	 
// Datatable.TableNames a DataSet.Relations jsou definovány implicitně .NET prostřednictvím ReadXml.
pizzaDs.ReadXml(dataDir + "CustomerData.xml");
string fileName = "Invoice Template.doc";

// Otevřete dokument šablony.
Document doc = new Document(dataDir + fileName);
	 
// Ořízněte koncové a úvodní prázdné hodnoty hromadné korespondence.
doc.MailMerge.TrimWhitespaces = false;
	 
// Proveďte vnořenou hromadnou korespondenci s oblastmi.
doc.MailMerge.ExecuteWithRegions(pizzaDs);
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);

// Uložte výstup do souboru.
doc.Save(dataDir);

Debug.Assert(doc.MailMerge.GetFieldNames().Length == 0, "There was a problem with mail merge");
Console.WriteLine("\nMail merge performed with nested data successfully.\nFile saved at " + dataDir);

Dokument aplikace Word po hromadné korespondenci

Níže je první stránka výsledného dokumentu aplikace Word po provedení hromadné korespondence.

Dokument aplikace Word po hromadné korespondenci

Závěr

Aspose.Words for .NET je rozhraní API hromadné korespondence bohaté na funkce, které poskytuje všechny standardní i rozšířené funkce hromadné korespondence pro aplikace .NET. Během několika řádků kódu můžete bezproblémově vytvářet jednoduché nebo složité sestavy z různých typů zdrojů dat. Další informace o rozhraní .NET Mail Merge API si můžete přečíst v dokumentaci. Chcete-li se dozvědět o Aspose.Words for .NET, začněte s příručkami pro vývojáře a GitHub ukázkami kódu.

Vyzkoušejte Aspose.Words for .NET zdarma

Můžete získat bezplatnou dočasnou licenci k vyzkoušení Aspose.Words for .NET bez jakýchkoli omezení. Získejte svou dočasnou licenci nyní.

Viz také