提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:胡涛|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@cahobeh.cn
本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库。
Spire.Doc for JavaSpire.Doc for Java是Java Word组件,具有生成、读取、转换Word文档等功能
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢