翻譯|使用教程|編輯:胡濤|2022-04-20 15:44:08.840|閱讀 49 次
概述:本文將向您展示如何使用 Spire.Doc 通過比較兩個 Word 文檔來獲取差異。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
我們已經介紹了如何在 C# 和 VB.NET 中比較兩個 Word 文檔。從 Spire.Doc V8.12.14 開始,它支持在結構列表中獲取兩個 Word 文檔之間的差異。本文將向您展示如何使用 Spire.Doc 通過比較兩個 Word 文檔來獲取差異。
郵件合并通常用于批量打印報表,例如財務報表、工資單或成績單。合并后的文件可以通過電子郵件發送。
在本文中,我將展示一種通過 Spire.Doc 生成郵件合并報告的方法。
此報告包括多張發票,每張發票都從一個新頁面開始。發票標志和供應商信息將顯示在每頁的標題中。
訂單、裝運、客戶、訂單詳情和總價構成一張完整的發票。
下圖為發票外觀:
每張發票的內容詳情如下所示:
本示例中的所有數據均來自 Northwind 數據庫,該數據庫是 Microsoft Access 2003 提供的示例數據庫。
我們將從Orders、Shippers、Customers、Employees、[Order Details]和Products表中導出數據以生成我們的報告。下圖展示了6個表之間的關系。
我們需要完成以下 3 個步驟來生成我們的報告。
每個步驟都包含幾個子步驟,在#2 和#3 中我們需要編寫一些代碼。
模板是可重用的文檔。它呈現了我們報告的模式。我們可以修改它來更改我們的報告,而無需修改任何代碼。
注意:在本節中,所有表均指 DataTable 實例,而不是數據庫中的物理表。
我們可以在 MS Word 或其他程序中創建模板。請看下圖。這是我們需要創建的模板。數據將填寫在紅方。
將郵件合并字段作為占位符插入紅塊。本例中將使用三種類型的郵件合并字段:
GeneralField 是一個通用的 Word 郵件合并字段。這是真實的數據字段,我們的數據將在合并過程中填寫。我們需要在每個紅塊中插入一個 GeneralField 并用相應的數據名稱命名這些字段。插入 GeneralFields 后,我們的模板將如下所示:
TableField 是輔助郵件合并字段,用作多個相關 GeneralField 和其他 TableField 的容器。所以它不是數據占位符,不會填充任何數據。它由兩個特殊的郵件合并字段組成:
TableStart: TableName和 TableEnd: TableName。在合并過程中,同一個 TableField 所包含的相關 GeneralField 的數據將來自同一個數據表。例如,客戶信息塊中的字段將填充數據表Customer中的數據,因此我們需要將它們放入 TableField Customer中。
在第一個CompanyName字段之前插入一個字段名稱為 TableStart:Customer的郵件合并字段,并在字段 Country 之后立即插入另一個字段名稱為TableEnd:Customer的郵件合并字段。然后我們在客戶信息塊中的字段如下所示:
在合并過程中,表Customer的CompanyName列中的數據將填充到字段CompanyName中,將Customer.Address填充到字段Address中,將Customer.City填充到字段City中等等。
訂單信息表中銷售人員列字段數據來自員工表
訂單信息表中Ship Via欄的字段數據來自Shipper表
訂單明細表中的字段數據來自表Detail,除了字段ProductName。字段ProductName的數據來自表Product。Invoice總計信息中InvoiceSubtotal和InvoiceTotal字段的數據來自表Total(虛擬表)
GroupField 也是輔助郵件合并字段。它可以包含多個相關的 GeneralFields 和 TableFields。它由兩個特殊的郵件合并字段組成: GroupStart: GroupName和 GroupEnd: GroupName。在合并過程中,將復制 GroupField 中包含的所有 Word 文檔元素。數據表中的一行有一個副本,該行中的數據將填充到副本中的字段中。
如果該行有子數據表,則子數據表中的數據將填充到相應的TableField中包含的字段中。如果子數據表有多個數據行,對應的TableField也會被復制填充。
我們需要在模板正文的頂部插入一個名為 GroupStart:Order 的郵件合并字段,并在模板正文的底部插入一個名為GroupEnd:Order的郵件合并字段。在此之后,我們的模板如下所示:
您可以在隨附的源包中找到名為 InvoiceTemplate.doc 的完整模板。
Spire.Doc 提供來自 DataSet 的合并數據。因此,我們將使用 DataAdapter 將 NorthWind 數據庫中的數據表填充到 DataSet 中,并將其合并到我們的模板中。與DataSet 的DataRelation 不同,Spire.Doc 擁有表關系功能。所以我們不需要為 DataSet 對象創建 DataRelation 實例。下面的代碼僅顯示加載訂單數據。其他代碼請參見隨附的源包。
[C#]
String connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb"; DataSet dataSet = new DataSet(); using(OleDbConnection conn = new OleDbConnection(connectionString)) { //load December 1997 orders String sql = " SELECT * " + " FROM Orders " + " WHERE ShippedDate Between #12/1/1997# And #12/31/1997# "; using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, conn)) { dataAdapter.Fill(dataSet, "Order"); } }
在本節中,我們需要編寫一些代碼來調用 Spire.Doc 來合并我們的數據表和模板。
創建 Spire.Doc.Document 對象并加載模板。
[C#]
Document document = new Document(); document.LoadFromFile("InvoiceTemplate.doc", FileFormat.Doc);
建立數據表之間的關系。
[C#]
List<DictionaryEntry> list = new List<DictionaryEntry> { new DictionaryEntry("Order", String.Empty), new DictionaryEntry("Shipper", "ShipperID = %Order.ShipVia%"), new DictionaryEntry("Customer", "CustomerID = %Order.CustomerID%"), new DictionaryEntry("Employee", "EmployeeID = %Order.EmployeeID%"), new DictionaryEntry("Detail", "OrderID = %Order.OrderID%"), new DictionaryEntry("Product", "ProductID = %Detail.ProductID%"), new DictionaryEntry("Total", "OrderID = %Order.OrderID%") };
將數據集合并到模板中并將文檔保存到文件中。
[C#]
//clear empty value fields during merge process document.MailMerge.ClearFields = true; //clear empty paragraphs if it has only empty value fields. document.MailMerge.RemoveEmptyParagraphs = true; //merge document.MailMerge.ExecuteWidthNestedRegion(dataSet, list); //set word view type. document.ViewSetup.DocumentViewType = DocumentViewType.PrintLayout; document.SaveToFile("Invoice.doc");
為了在新頁面中開始每張發票,我們在第一段之前插入一個分頁符,以便合并新的訂單行。為此,我們需要處理在字段合并之前觸發的事件 MergeField。
[C#]
//index of row of merged order data int mergedRowIndex = 0; document.MailMerge.MergeField += delegate(object sender, MergeFieldEventArgs e) { if (e.TableName == "Order") { if (e.RowIndex > mergedRowIndex) { mergedRowIndex = e.RowIndex; //insert page break symbol before the paragraph of current field InsertPageBreak(e.CurrentMergeField); } } };
方法 InsertPageBreak 的代碼
[C#]
private static void InsertPageBreak(IMergeField field) { //append a page break symbol Break pageBreak = field.OwnerParagraph.AppendBreak(BreakType.PageBreak); //move to the start of the paragraph field.OwnerParagraph.Items.Insert(0, pageBreak); }
歡迎下載|體驗更多E-iceblue產品
如需獲取更多產品相關信息請咨詢
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn