没有找到合适的产品?
联系客服协助选型:023-68661681
提供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@wqylolg.cn
可视化项目时间线对于有效规划和跟踪至关重要。在本篇博文中,您将学习如何使用 C# 在 Excel 中创建甘特图。只需几行代码,即可自动生成动态、美观的甘特图。
本文将为大家介绍DevExpress XAF如何将.NET Aspire集成到Blazor项目中,欢迎下载最新版组件体验!
在线协同文档编辑器ONLYOFFICE现已支持阿里通义千问( Qwen),带来先进的 AI 功能,实现更智能的文档编辑。本指南将向您展示如何将 Qwen 连接到 ONLYOFFICE,并充分利用其功能。
需要从 PDF 文档中删除特定页面?本快速指南将向您展示如何仅用几行代码删除不需要的页面。
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@wqylolg.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢