【实用技能】如何在 .NET C# 中的邮件合并过程中操作表格单元格

TX Text Control 中的邮件合并 类是一个强大的库,旨在通过将数据合并到模板中来自动创建文档。它充当结构化数据(例如来自数据库、JSON 或 XML)和动态文档生成之间的桥梁,对于需要自动化文档工作流程的应用程序来说非常有用。

TX Text Control 最新版试用下载

从本质上讲,MailMerge 类简化了创建专业、数据驱动文档的复杂任务,允许开发人员轻松地将模板中的字段与数据源合并。模板是使用 TX Text Control 文字处理界面设计的,合并字段代表动态内容。

合并区块

合并块是 TX Text Control 的 MailMerge 类中的一个关键概念,它允许在文档中动态生成结构化、可重复的内容。合并块允许开发人员有效地处理模板中的重复数据结构,例如列表、表格或嵌套区域。

从高层次上讲,合并块是模板中定义的部分,对应于数据集合或数据表。在合并过程中,MailMerge 会遍历数据源,动态创建每条记录的内容。这些合并块可以使用 MailMerge 类的现成功能进行有条件的呈现、过滤和排序。

代码级操作

但是 MailMerge 类还允许在合并过程中进行非常详细的代码级操作。这包括处理合并事件、自定义合并过程以及以编程方式控制合并操作的输出。这种级别的控制对于需要对合并过程进行细粒度控制的复杂文档生成场景至关重要。

本文介绍如何使用“字段合并” 事件来操作合并字段位于表格单元格内时由事件返回的表格单元格。在本例中,我们将使用一个非常简单的模板,该模板由两个合并字段和一个用红色突出显示的简单重复块组成。

TX 文本控件中的邮件合并模板

为了合并模板,我们将使用以下简化的 JSON 数据。

[{"invoice-id": "1","invoice-date": "2019-01-01","line-items": [{"product-id": "1","quantity": "1","unit-price": "8"},{"product-id": "2","quantity": "2","unit-price": "200"},{"product-id": "3","quantity": "1","unit-price": "100"},{"product-id": "4","quantity": "1","unit-price": "3"}]}
]

为了合并此模板,将使用以下代码:

textControl1.Load("template.tx", TXTextControl.StreamType.InternalUnicodeFormat);
MailMerge mailMerge = new MailMerge();
mailMerge.TextComponent = textControl1;
string jsonData = File.ReadAllText("data.json");
mailMerge.MergeJsonData(jsonData);

合并后的文档结果如下:

TX 文本控件中的合并文档

FieldMerged 事件

现在让我们附加 FieldMerged 事件来操作合并过程。

textControl1.Load("template.tx", TXTextControl.StreamType.InternalUnicodeFormat);
MailMerge mailMerge = new MailMerge();
mailMerge.TextComponent = textControl1;
mailMerge.FieldMerged += MailMerge_FieldMerged;
string jsonData = File.ReadAllText("data.json");
mailMerge.MergeJsonData(jsonData);

每次合并字段时(成功或失败),都会调用此事件。如果字段位于表格单元格内,则返回表格单元格。

在此事件中,我们检查TableCell属性是否不为空。如果不为空,我们将设置单元格的背景颜色。

private void MailMerge_FieldMerged(object sender, MailMerge.FieldMergedEventArgs e)
{if (e.TableCell != null){e.TableCell.CellFormat.BackColor = Color.Red;e.TableCell.CellFormat.BottomBorderWidth = 60;e.TableCell.CellFormat.BottomBorderColor = Color.Blue;}
}

因此,合并过程中所有合并的单元格都会被着色。

TX 文本控件中带有彩色单元格的合并文档

动态单元格颜色

让我们通过添加一些逻辑使这个过程动态化。CellFilterInstructions类用于将一个值与给定值进行比较以返回特定的颜色。

using System;
using System.Drawing;
using System.Linq;
public class CellFilterInstructions
{public double? CompareValue { get; set; } = null;public RelationalOperator? Operator { get; set; } = null;public Color TrueColor { get; set; } = Color.White;public Color FalseColor { get; set; } = Color.White;public enum RelationalOperator{Equals = 0,NotEqual,LessThan,GreaterThan,}// evaluates the instruction and returns the proper colorpublic Color? GetColor(string value){if (Double.TryParse(ParseToNumber(value), out double dValue) == true){switch (Operator){case RelationalOperator.Equals:return (dValue == CompareValue ? TrueColor : FalseColor);case RelationalOperator.NotEqual:return (dValue != CompareValue ? TrueColor : FalseColor);case RelationalOperator.GreaterThan:return (dValue > CompareValue ? TrueColor : FalseColor);case RelationalOperator.LessThan:return (dValue < CompareValue ? TrueColor : FalseColor);default:return null;}}elsereturn null;}private string ParseToNumber(string text){var numericChars = "0123456789,.".ToCharArray();return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());}
}

以下代码创建了一条新规则,如果值大于 10,则返回绿色,如果值小于 10,则返回红色。此规则被序列化并存储在表单元格的Name属性中。

textControl1.Load("template.tx", TXTextControl.StreamType.InternalUnicodeFormat);
CellFilterInstructions cellFilterInstructions = new CellFilterInstructions() {CompareValue = 10,Operator = CellFilterInstructions.RelationalOperator.GreaterThan,TrueColor = Color.Green,FalseColor = Color.Red
};
textControl1.Tables[1].Cells[2,2].Name =JsonConvert.SerializeObject(cellFilterInstructions);
MailMerge mailMerge = new MailMerge();
mailMerge.TextComponent = textControl1;
mailMerge.FieldMerged += MailMerge_FieldMerged;
string jsonData = File.ReadAllText("data.json");
mailMerge.MergeJsonData(jsonData);

在FieldMerged事件中,此规则被放弃并评估。然后,返回的颜色将应用于表格单元格的表格单元格格式。

private void MailMerge_FieldMerged(object sender, MailMerge.FieldMergedEventArgs e)
{// custom field handlingif (e.TableCell == null)return;if (e.TableCell.Name != ""){CellFilterInstructions instructions =(CellFilterInstructions)JsonConvert.DeserializeObject(e.TableCell.Name,typeof(CellFilterInstructions));// retrieve the colorColor? color = instructions.GetColor(e.MailMergeFieldAdapter.ApplicationField.Text);// apply the colorif (color != null)e.TableCell.CellFormat.BackColor = (Color)color;}
}

以下屏幕截图显示了此合并过程的结果:

TX 文本控件中带有条件单元格颜色的合并文档

结论

TX Text Control 中的 MailMerge 类为自动化文档生成过程提供了强大而灵活的解决方案。使用合并块和代码级操作,开发人员可以轻松创建动态、数据驱动的文档。FieldMerged 事件对合并过程提供了细粒度的控制,允许开发人员根据特定条件自定义输出。这种级别的控制对于需要精确处理数据和内容的复杂文档生成场景至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有源模拟滤波器的快速设计

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 几乎所有电子电路中都能看到有源模拟滤波器的身影。音频系统使用滤波器进行频带限制和平衡。通信系统设计使用滤波…

如何使用Python库连接Redis

1、redis-py 库封装一个 Redis 工具类可以帮助我们简化 Redis 的操作并提高代码的复用性和可维护性。 安装redis pip install redisimport redis import logginglogging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__)class RedisUtils:def __init__(s…

【代码随想录day57】【C++复健】 53. 寻宝(prim算法);53. 寻宝(kruskal算法)

53. 寻宝&#xff08;prim算法&#xff09; 好像在研究生的算法课上学过prim算法和kruskal算法&#xff0c;不过当时只是了解了一下大致的概念和流程&#xff0c;并没有涉及到如何去写代码的部分&#xff0c;今天也算是学习了一下这两个算法的代码应该如何去实现&#xff0c;还…

使用OpenTK展示3D点云图像(C#)

最近在研究3D显示&#xff0c;找到一款在winform上展示3D点云的控件&#xff0c;并且实现了点线面的展示&#xff0c;及光照渲染纹理贴图等功能&#xff0c;如下面几张图所展示。 一些基础知识可以在LearnOpenTK - OpenTK 这个网站上学习到。 我这边使用的是openTK3.3.3版本&a…

MetaGPT源码 (Memory 类)

目录 MetaGPT源码&#xff1a;Memory 类例子 MetaGPT源码&#xff1a;Memory 类 这段代码定义了一个名为 Memory 的类&#xff0c;用于存储和管理消息(Message)对象。Memory 提供了多种操作消息的功能&#xff0c;包括添加单条或批量消息、按角色或内容筛选消息、删除最新消息…

pythonOpenCV篇:0基础带你python入门之常用函数

① 二值化函数 功能&#xff1a;将图像转换为二值图像&#xff08;黑白图像&#xff09;&#xff0c;将像素值分为两种类别&#xff1a;前景&#xff08;白&#xff09;和背景&#xff08;黑&#xff09;。函数&#xff1a;cv2.threshold()参数&#xff1a; src&#xff1a;输…

小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)

当我还是初学者的时候&#xff0c;我经常思考有没有比慢慢求每一位数字然后考虑正序&#xff0c;逆序输出要快的办法...长期琢磨&#xff0c;必有所获&#xff01; 我刚学数据结构的时候还没意识到栈&#xff0c;队列还能这样用&#xff0c;虽然说有点杀鸡用牛刀的感觉&#x…

详细解析RNNoise:基于深度学习的语音噪声抑制技术

引言 在语音通信、语音识别以及音频处理领域&#xff0c;噪声抑制是一个至关重要的任务。环境噪声&#xff0c;如风声、交通声和人群声&#xff0c;通常会影响语音的清晰度和质量&#xff0c;特别是在远程通信和在线会议中。为了提高语音质量&#xff0c;许多噪声抑制技术应运…

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四&#xff1a;为什么要顺应技术的生命周期&#xff1f; 简介&#xff1a;包含模块一 架构师的六大生存法则-法则四&#xff1a;为什么要顺应技术的生命周期&#xff1f;&法则四&#xff1a;架构设计中怎么判断和利用技术趋势&#xff1f; 2024-08-29 17:30:07 你好&am…

跟李笑来学美式俚语(Most Common American Idioms): Part 66

Most Common American Idioms: Part 66 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…

【Sentinel Go】新手指南、流量控制、熔断降级和并发隔离控制

随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开…

代码随想录第43天

300.最长递增子序列 # Dynamic programming. class Solution:def lengthOfLIS(self, nums: List[int]) -> int:if not nums: return 0dp [1] * len(nums)for i in range(len(nums)):for j in range(i):if nums[j] < nums[i]: # 如果要求非严格递增&#xff0c;将此行 …

Anaconda Conda Pip 的区别与联系

在Python生态中,Anaconda、Conda和Pip是三个非常重要的工具,它们在包管理和环境管理方面发挥着关键作用。 Anaconda Anaconda是一个为科学计算而设计的Python发行版,它集成了Conda、Python以及大量的数据科学相关库,如NumPy、Pandas等。Anaconda的主要优势在于它提供了一个…

Y3编辑器官方文档1:编辑器简介及菜单栏详解(文件、编辑、窗口、细节、调试)

文章目录 一、新建项目二、 编辑器主界面2.1 游戏场景2.2 导航栏/菜单栏2.3 功能栏三、菜单栏详细介绍3.1 文件3.1.1 版本管理3.1.2 项目管理(多关卡)3.1.2.1 多关卡功能说明3.1.2.2 关卡切换与关卡存档3.2 编辑3.2.1 通用设置3.2.2 键位设置3.3 窗口(日志)3.4 细节3.4.1 语言…

OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数&#xff0c;用于将点从齐次坐标&#xff08;homogeneous coordinates&#xff09;…

前端视角下的Go语法学习:创建 Go 项目

今日话题 使用 GoLand 创建 Go 项目 作者&#xff1a; 时间&#xff1a;2024年6月20日 17时16分14秒 主线任务 一、GoLand 创建项目 1、点击 “new Project” 按钮 2、已经有下载过两个 Golang SDK 版本&#xff0c;选择版本创建即可~ 3、如果没有下载过Golang SDK&#…

vue3使用keep-alive做缓存

暂未整理&#xff0c;等待更新 文章目录 一、注意项1.不生效原因 二、使用步骤1.引入库2.读入数据 总结 一、注意项 1.不生效原因 vue3无beforeRouteEnter&#xff0c;但可以写。<script lang"jsx">需要一致:include"[‘experienceMaintenance’, ‘rea…

Android13应用在后台录音无声音

最近在做项目&#xff0c;对讲应用放在后台&#xff0c;录音无声音&#xff0c;最后解决。 一 现象 对讲应用运行在后台&#xff0c;录音无效查看日志&#xff0c;AudioRecorder录音回调全是0&#xff1b;状态栏无通知&#xff0c;无申请通知权限。 二解决 看了现象应该能够…

数据结构6.3--交换排序

目录 交换排序基本思想 1.冒泡排序 2.快速排序 2.1hoare版本 2.2挖坑法 2.3前后指针版本 交换排序基本思想 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾…

Unity 制作一个视频播放器(打包后,可在外部编辑并放置新的视频)

效果展示&#xff1a; 在这里&#xff0c;我把视频名称&#xff08;Json&#xff09;和对应的视频资源都放在了StreamingAssets文件夹下&#xff0c;以便于打包后&#xff0c;客户还可以自己在外部增加、删除、修改对应的视频资料。 如有需要&#xff0c;请联细抠抠。