Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel催化剂开源第29波-在Winform上使用富文本编辑器控件

Excel催化剂开源第29波-在Winform上使用富文本编辑器控件

作者头像
Excel催化剂
发布于 2021-08-19 07:07:16
发布于 2021-08-19 07:07:16
1.2K00
代码可运行
举报
文章被收录于专栏:Excel催化剂Excel催化剂
运行总次数:0
代码可运行

富文本编辑器,一般都是BS架构专利一般,好像百度有一个开源的比较出名,但无奈这些都只能用在JS上,在BS网页端开发上使用。像Winform开发的VSTO,只能羡慕的份。和一般Winform上用的RichText控件,别人BS的富文本编辑器就强大得多。

笔者找寻过程中,也总算找到一款很不错的开源控件,将它的dll编译后,还真能用了。

在Excel催化剂的批量邮件功能中, 为了得到最好的体验,不止是不用依赖OUTLOOK的组件来发邮件(好像VBA的方案只能用outlook组件,用户电脑没安装outlook就不能用),同时为了让用户可以在邮件正文编辑区的使用体验和outlookup或网页端的发邮件体验一样,用了一个第3方的富文本编辑器,不是RichText控件,所以对网页的支持特别友好,随便复杂网页上的内容,粘贴过来,渲染得非常出色。

邮件群发功能

这个第3方富文本编辑器控件,不单单可以在里面作一些格式的配置,还可以有打开html文件,直接从网页其他地方复杂内容直接粘贴和插入本地图片,有了这些能力,在发送邮件正文时,使用体验就非常棒,可以发送出去的邮件正文,不是纯文本的形式,毫无格式,同时可以发送本地图片,特别是有些时候,正文内容需要说明一切重要内容,无需点开附件查看,或者正文中有邮件签名时,签名位置有图片也是常有的事情,特别是放个二维码之类的。

同样地水平有限,具体技术细节也不懂,只是能用起来的程度。只需引用以下的dll即可。 有兴趣的可以看作者的github代码https://github.com/yahch/kwig

富文本控件dll

此控件是自定义控件,可以通过设计器拖拉出来。

群发邮件核心代码,用这个富文本控件,拿到其渲染后的html文件,发邮件当然有C#自己的轮子,也很好用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string htmlBodyContent = this.kEditor1.Html;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        private async Task BatchSendingEmail()
        {
            SmtpClient client = GetSmtpClient();
            //string[] lisColNames = { "邮件标题", "收件人邮箱", "抄送邮箱", "密件抄送邮箱", "优先级", "附件路径" };
            int ColIndexOfsubject = this.SendInfoListObject.ListColumns["邮件标题"].Index;
            int ColIndexOfTo = this.SendInfoListObject.ListColumns["收件人邮箱"].Index;
            int ColIndexOfCC = this.SendInfoListObject.ListColumns["抄送邮箱"].Index;
            int ColIndexOfBCC = this.SendInfoListObject.ListColumns["密件抄送邮箱"].Index;
            int ColIndexOfPriority = this.SendInfoListObject.ListColumns["优先级"].Index;
            int ColIndexOfAttachments = this.SendInfoListObject.ListColumns["附件路径"].Index;
            int ColIndexOfAttachmentsSize = this.SendInfoListObject.ListColumns["附件最大限制(M)"].Index;

            int ColIndexOfStatus = this.SendInfoListObject.ListColumns["发送状态"].Index;
            string htmlBodyContent = this.kEditor1.Html;

            foreach (Excel.ListRow row in this.SendInfoListObject.ListRows)
            {
                if (isCancelSending == false)
                {
                    try
                    {
                        string subject = row.Range[ColIndexOfsubject].Value2 != null ? row.Range[ColIndexOfsubject].Value2.ToString() : string.Empty;
                        string to = row.Range[ColIndexOfTo].Value2 != null ? row.Range[ColIndexOfTo].Value2.ToString() : string.Empty;
                        string cc = row.Range[ColIndexOfCC].Value2 != null ? row.Range[ColIndexOfCC].Value2.ToString() : string.Empty;
                        string bcc = row.Range[ColIndexOfBCC].Value2 != null ? row.Range[ColIndexOfBCC].Value2.ToString() : string.Empty;

                        string priority = row.Range[ColIndexOfPriority].Value2 != null ? row.Range[ColIndexOfPriority].Value2.ToString() : "正常";
                        MailPriority mailPriority = priority == "高" ? MailPriority.High : priority == "低" ? MailPriority.Low : MailPriority.Normal;

                        string attachments = row.Range[ColIndexOfAttachments].Value2 != null ? row.Range[ColIndexOfAttachments].Value2.ToString() : string.Empty;
                        int attachmentsSize = int.Parse(row.Range[ColIndexOfAttachmentsSize].Value2 != null ? row.Range[ColIndexOfAttachmentsSize].Value2.ToString() : "0");

                        long totalLength = 0;
                        foreach (var filePath in attachments.Split(new char[] { ';', ';' }, StringSplitOptions.RemoveEmptyEntries))
                        {
                            FileInfo fileInfo = new FileInfo(filePath);
                            totalLength = totalLength + fileInfo.Length;
                        }
                        if (totalLength / 1024.0 / 1024.0 > attachmentsSize)
                        {
                            row.Range[ColIndexOfStatus].Value2 = "发送失败,附件大小超出最大限制";
                            continue;
                        }

                        if (!string.IsNullOrEmpty(subject) && !string.IsNullOrEmpty(to))
                        {
                            MailMessage mailMessage = GetMailMessage(row, subject, to, cc, bcc, mailPriority, attachments, htmlBodyContent);

                            try
                            {
                                await client.SendTaskAsync(mailMessage);
                                row.Range[ColIndexOfStatus].Value2 = "发送完成";
                            }
                            catch (Exception ex)
                            {
                                row.Range[ColIndexOfStatus].Value2 = "发送失败,原因为" + ex.Message;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        row.Range[ColIndexOfStatus].Value2 = "发送失败,原因为" + ex.Message;
                    }
                    finally
                    {
                        await Task.Factory.StartNew(() => Thread.Sleep(int.Parse(Properties.Settings.Default.BatchMailSendStopSecond) * 1000));
                    }

                }

            }
            //this.Close();
            this.Invoke(new Action(() => this.Close()));

        }

此控件,需要重写的方法,具体原理自己去看作者示例文档解释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public void OnEditorErrorOccured(Exception ex)
        {
            //throw new NotImplementedException();
        }

        public void OnEditorLoadComplete()
        {
            //throw new NotImplementedException();
        }

        public void OnInsertImageClicked()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "图片|*.jpg;*.png;*.gif";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string n = "<img src=\"file://" + ofd.FileName + "\" />";
                kEditor1.InsertNode(n);
                //把图片放到字典中,供之后清洗时取出来
                dicImageInfo.Add("t" + (dicImageInfo.Count + 1), "file://" + ofd.FileName);
            }


        }

        public void OnOpenButtonClicked()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "*.html|*.html";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string text = System.IO.File.ReadAllText(ofd.FileName);
                kEditor1.InsertNode(text);
            }
        }

        public void OnSaveButtonClicked()
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "*.html|*.html";
            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                System.IO.File.WriteAllText(sfd.FileName, kEditor1.Html);
            }
        }

结语

接连的这几篇文章,大家都可以感受到,对于一个业务导向的业余开发者来说,如果找到好的轮子,也可以实现很多复杂场景,用户体验也可以做得很好。所以VSTO和VBA开发,真的有一个本质的区别,VBA大不了最多用下系统的API函数,OFFICE的对象模型,但在VSTO的世界里,只要用心找,可以尽性地用尽一切世界上优秀的代码轮子。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c#建立一本文本编辑器
首先,打开你的开发工具Microsoft visual studio 2005。文件——》新建项目——》项目类型选择visualc#,模板选择windows 应用程序,到此我们已经创建好一个window窗体了!
codeniu
2022/02/25
8720
C# WinForm 界面控件
1.首先插入新的子窗体form1,并设置IsMdiContainer = True 属性。
王 瑞
2022/12/28
3.5K0
C# WinForm 界面控件
ASP.NET 实现发送邮件 + 多个收件人 + 多个附件
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/42011431
DannyHoo
2018/09/13
2.4K0
ASP.NET 实现发送邮件 + 多个收件人 + 多个附件
富文本编辑器开发简介
富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器。
江米小枣
2020/06/15
5K0
【HarmonyOS】富文本编辑器RichEditor详解
在信息化高速发展的今天,普通的文本容器,已经不能够承载用户丰富的表达欲。富文本展示已经是移动开发中,必备要解决的问题,在鸿蒙中,通过在系统层提供RichEditor控件,来解决富文本展示的问题。
GeorgeGcs
2025/07/07
2420
【HarmonyOS】富文本编辑器RichEditor详解
Android富文本编辑器
Android富文本编辑器,一款支持撤销、加粗、斜体、下划线、有序无序列表、对齐、改文字大小、改文字颜色、插入图片、插入视频等功能,并且可设置cookie,自定义素材操作菜单的的编辑器。
全栈程序员站长
2022/06/27
2.9K0
Android富文本编辑器
Quill 富文本编辑器简介
Quill 是一个免费的,开源的 WYSIWYG (What You See Is What You Get)编辑器,专为现代网络而打造。凭借其模块化架构和富有表现力的 API,你可完全自定义以满足任何需求。
阿宝哥
2019/11/06
4.1K0
Vue富文本编辑器_前端富文本编辑器插件
博客(coder的自我修养)原文链接:http://www.imcoder.fun/archives/1591583350241
全栈程序员站长
2022/11/07
3.8K0
Vue富文本编辑器_前端富文本编辑器插件
Excel催化剂开源第45波-按原图大小导出图片
使用Excel催化剂的插入图片的方式,图片已经存储在PictureBox容器内,想导出时,只需在PictureBox容器上取出其Image属性,即可拿到图片,再简单的一个保存为文件的方法即可完成。
Excel催化剂
2021/08/19
1.2K0
Django 2.1.7 使用富文本编辑器 tinymce
Django 2.1.7 Admin - 注册模型、自定义显示列表字段 Django 2.1.7 上传图片 - Admin后台管理 https://django-tinymce.readthedocs.io/en/latest/
Devops海洋的渔夫
2019/07/15
1.9K0
Django 2.1.7 使用富文本编辑器 tinymce
summernote富文本编辑器基本使用
Summernote 是一个简单灵活的所见即所得的 HTML 在线编辑器,基于 jQuery 和 Bootstrap 构建,支持快捷键操作,提供大量可定制的选项。
别团等shy哥发育
2023/02/25
3.1K0
summernote富文本编辑器基本使用
Excel催化剂开源第8波-VSTO开发之异步调用方法
在VSTO开发过程中,因其和普通的Winform开发有点差别,具体细节笔者也说不清楚,大概是VSTO的插件是寄生在Excel中,不属于独立的进程之类的,其异步方法调用时,未能如Winform那样直接用await async异步方法就结束,仍需要再作简单的处理。
Excel催化剂
2021/08/19
7270
Django后台和前台使用summernote富文本编辑器
简单介绍一下怎么在django的管理后台和用户使用网页中使用django-summernote富文本编辑器,其他富文本编辑器类似。
小末快跑
2019/07/03
2.7K0
Excel催化剂开源第9波-VSTO开发图片插入功能,图片带事件
图片插入功能,这个是Excel插件的一大刚需,但目前在VBA接口里开发,如果用Shapes.AddPicture方法插入的图片,没法对其添加事件,且图片插入后需等比例调整纵横比例特别麻烦,特别是对于插入的多个图片非统一的纵横尺寸比时。
Excel催化剂
2021/08/19
1.6K0
46. Django 2.1.7 使用富文本编辑器 tinymce
借助富文本编辑器,网站的编辑人员能够像使用offfice一样编写出漂亮的、所见即所得的页面。此处以tinymce为例,其它富文本编辑器的使用也是类似的。
Devops海洋的渔夫
2022/01/17
1.2K0
46. Django 2.1.7 使用富文本编辑器 tinymce
vue 富文本编辑框_基于vue的富文本编辑器
npm i wangeditor –save 插件官网地址:https://www.wangeditor.com/
全栈程序员站长
2022/11/08
1.4K0
WEB项目中使用UEditor(富文本编辑器)
Ueditor富文本编辑器是在很多项目里经常用到的框架,是百度开发团队开发的一款很好用的富文本编辑器
SmileNicky
2019/01/17
2.1K0
iOS小技能:富文本编辑器
使用[_webView loadHTMLString:html baseURL:baseURL]; 进行代码加载
公众号iOS逆向
2022/08/22
2.4K0
iOS小技能:富文本编辑器
vue富文本编辑器tinymce_vue移动端富文本编辑器
前言:vue中很多项目都需要用到富文本编辑器,在使用了ueditor和tinymce后,发现并不理想。所以果断使用vue-quill-editor来实现。
全栈程序员站长
2022/11/04
4K0
富文本编辑器的一键排版功能
在做CMS系统的时候,用户常常会从word粘贴一些东西到编辑器中,早起的富文本编辑器也都提供了去除word格式的功能(尽管有时候比较难用),甚至有时候用户要求打开一个本地的word文件的时候系统能够直接把word文件转换为网站上可以直接浏览的内容,他们不关心你中间用了什么技术,也有人专门对此做了一些前端控件的开发,然后按用户进行授权,似乎销售成绩还不错。 网络上有很多自称为“一键排版”的小工具,只是他们只是工具,不是类库或者API,开发者不能直接使用,来分析其中一个是如何实现的,首先下载并安装,安装后在系统
用户1183026
2018/01/19
2.7K0
富文本编辑器的一键排版功能
推荐阅读
相关推荐
c#建立一本文本编辑器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档