xml地图|网站地图|网站标签 [设为首页] [加入收藏]
文字处理控件TX,文件操作
分类:编程

参考文章:

这几天一直在研究TX Text Control的使用,由于这方面的资料相对比较少,主要靠下载版本的案例代码进行研究,以及官方的一些博客案例进行学习,使用总结了一些心得,特将其总结出来,供大家分享学习。本篇随笔主要介绍TX Text Control V20的相关使用心得。

文件及文件夹操作

1.SuperIO通讯框架介绍,含通信本质

1、TX Text Control控件介绍

TX Text Control是一款功能类似于 MS Word 的文字处理控件,包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理,网站内容发布,电子病历中病案模板创建、病历书写、修改历史、连续打印、病案归档等功能的实现。

这个控件主要的功能就是可以作为Word以及其他文档的编辑器使用,虽然展示WORD内容的控件也有一些,如我们可以利用DevExpress里面的RTF文档编辑器来实现,同样运行的很好,结合Aspose.Word后台的文档处理,我们可以做到类似报表的数据生成,而且可以把生成后的文档进行显示、编辑等操作处理。

TX Text Control虽然作为文档编辑各方面都表现不错,不过其MailMerge邮件合并功能还是经常使用的一个功能,就是把我们的数据和文档模板来一个合并,然后显示最终的文档内容,这种可以用来做一些类似发票、邮件、员工信息等的数据处理和显示,MailMerge邮件合并可以绑定主从表的数据,能够符合大多数的要求。

我本来想用它做一个类似电子病历一样的功能模块,不说在文档里面,我们很难做到一些下拉列表的处理( 官方博客里面有一个简单的案例,不过不好用),一般情况下,如果我们只是做文档展示、数据合并等常规的操作,还是很不错的。

这个控件的功能介绍,可以参考葡萄城里面的网页介绍(),这个控件的相关开发人员使用然后分享经验的文章很少,能在网上搜到的大多数是葡萄城人员对这个控件的Demo代码进行一个简单粘贴说明,没有进一步的深入介绍和应用场景的介绍。虽然葡萄城列举了几个电子病历的公司产品案例,不过这几家公司的电子病历产品是很难下载到,也无从知道真假或者使用情况。

这几天我把这个控件的各种特性做了一些学习,并重新把官网的文档编辑例子进行了全新开发,参考着做了一个完全一样的编辑器版本,也基本上对它的各个属性、方法处理有了一个更加深入的了解。

我们先通过一个软件界面来了解整个软件的一些功能(这个是我仿照官方案例做的一个程序)。

图片 1

这个控件默认安装后,会带有很多Demo案例,具体可以参考目录C:UsersAdministratorDocumentsTX Text Control 20.0.NET for Windows FormsSamples 进行了解。

 

C/S:WinForm可以操作客户端文件 Client Server
B/S:浏览器服务 Brower Server

2.C#跨平台物联网通讯框架ServerSuperIO(SSIO)

2、TX Text Control控件的汉化

这个控件界面默认是英文版本的,控件的相关菜单以及提示都是英文,因此我们需要对资源做一些中文本地化处理才能正确显示。

官方没有提供中文汉化包,只提供一个标准的英文资源,如下所示。

图片 2

我们需要做的就是将它们进行中文翻译,然后重新编译(使用buildres.bat脚本编译)为中文资源dll。

我们先使用VS编辑工具,把这些英文资源记录转换为英文(这是一个比较繁琐的工作,官方网站上有一些旧版本的中文包可供参考,以及最新的V20软件(编辑器软件)下载下来运行参考)。

图片 3

我们逐一进行中文处理,可以使用百度、Google的翻译,以及软件界面的参考哦。

图片 4

以管理员方式运行VS的命令行,然后执行命令进行编译资源即可。

buildres.bat zh-CN

图片 5

编译成功后,在目录里面,会增加两个资源程序集。

txdocumentserver.resources.dll

txtextcontrol.resources.dll

然后我们把它复制到运行目录下,并放在zh-CN的目录里面即可。有了这些中文化的资源程序集,我们就可以利用它进行对控件的内置菜单提示进行中文化了。

中文化操作和其他常规的做法一样,我们在Main函数里面,添加如下代码即可。

Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN");

运行程序,我们使用右键菜单,发现里面的资源都已经正常汉化了,其他相关的内置菜单和界面也都可以看到正常汉化。

图片 6

 

命名空间:using system .IO;

 

3、TX Text Control的使用

有了汉化,只是我们正常使用控件的第一步,我们需要在程序里面整合控件,那么就需要对它进行使用,以及对控件的属性、事件进行处理,才能得到最佳的应用效果。

我们在VS工具栏里面加入对应的控件,可以看到有以下相关的控件对象可供使用,一般情况下我们使用TextControl,然后在其基础上创建其他RulerBar、ButtonBar、StatusBar即可,而如果我们需要合并数据(很常用)就需要加入MailMerge控件对象。

图片 7

添加控件后,我们可以对控件的相关基础的复制、粘贴、剪切等操作可以直接利用控件的API即可实现。

        private void menuEdit_Undo_Click(object sender, EventArgs e)
        {
            _textControl.Undo();
        }

        private void menuEdit_Redo_Click(object sender, EventArgs e)
        {
            _textControl.Redo();
        }

        private void menuEdit_Cut_Click(object sender, EventArgs e)
        {
            _textControl.Cut();
        }

其中查找、替换对话框也是可以通过API进行调出。

        private void menuEdit_Find_Click(object sender, EventArgs e)
        {
            _textControl.Find();
        }

        private void menuEdit_Replace_Click(object sender, EventArgs e)
        {
            _textControl.Replace();
        }

利用这些最基础的API是常规的操作。

而利用插入相关的对象,如图片、文本框等,就需要做一些简单的编码,方便把对象加入到TextControl对象里面。

        private void menuInsert_Image_Click(object sender, EventArgs e)
        {
            TXTextControl.Image imageNew = new TXTextControl.Image();
            _textControl.Images.Add(imageNew, TXTextControl.HorizontalAlignment.Left, -1, TXTextControl.ImageInsertionMode.DisplaceText);
        }
        private void menuInsert_TextFrame_Click(object sender, EventArgs e)
        {
            try
            {
                // Force Exception if standard version:
                _textControl.TextFrames.GetItem();
                Size sizeTextFrame = new Size(2268, 2268);   // 4 x 4 cm

                TXTextControl.TextFrame textFrameNew = new TXTextControl.TextFrame(sizeTextFrame);
                _textControl.TextFrames.Add(textFrameNew, TXTextControl.HorizontalAlignment.Left, -1, TXTextControl.TextFrameInsertionMode.DisplaceCompleteLines);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, ProductName);
            }
        }

这个控件最常见的就是MailMerge进行合并数据的操作了,这个也是我们利用它来处理很多模板化文档的目的。

MailMerge对象合并数据的操作,主要是接受集合对象或者是DataTable对象,所以我们必须将我们的数据转换为这种格式,否则合并数据得不到要的结果。

合并数据的处理方式,最开始就是需要设计好模板,这点很重要,模板的设计还是沿用了常规Word文档域对象的概念,需要添加一些域来做后续数据替换的对象占位符,如下是我测试的一个模板。

图片 8

这个里面主要是主从表整合的一个模板,我们需要绑定常规的主表记录,也需要绑定明细表的集合记录,不过最后我们都需要把数据对象转换为集合(如DataSet),然后才能绑定到文档对象上去。

在上面的文档里面,你知识看到了域对象,而没有看到一个隐藏的一个集合记录的开始和结束的书签设置。关于书签的作用和如何操作,可以了解我之前的随笔文章《利用Aspose.Word控件实现Word文档的操作》、《利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出》

书签的作用很重要,否则无法正常解析集合的记录并绑定在WORD界面上的,我们打开书签管理对话框,可以看到上述文档里面有两个位置,书签标记的开始和结束位置。

图片 9

这样我们设计好模板后,第二步就是通过代码生成相关对象,然后和文档进行合并就可以了。

例如我构建一个主表和一个从表的记录,统一把它们生成一个DataSet对象供使用。

        public static DataSet CreateDataSet()
        {
            DataSet ds = new DataSet();

            DataTable dtMain = DataTableHelper.CreateTable("Company,HandNo,Creator,CreateTime|DateTime");
            dtMain.TableName = "main";
            DataRow dr = dtMain.NewRow();
            dr["Company"] = "广州爱奇迪软件科技有限公司";
            dr["HandNo"] = "123456";
            dr["Creator"] = "伍华聪";
            dr["CreateTime"] = DateTime.Now;
            dtMain.Rows.Add(dr);

            DataTable dt = DataTableHelper.CreateTable("ID,ProductName,Description,Price|decimal,Quantity|int");
            dt.TableName = "ProductInfo";
            dr = dt.NewRow();
            dr["ID"] = "1";
            dr["ProductName"] = "海飞丝洗发水";
            dr["Description"] = "海飞丝洗发水, 550ml";
            dr["Price"] = 19.8M;
            dr["Quantity"] = 100;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["ID"] = "2";
            dr["ProductName"] = "联想品牌电脑";
            dr["Description"] = "联想Y700-15ISK-ISE 旗舰版";
            dr["Price"] = 6500M;
            dr["Quantity"] = 10;
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["ID"] = "3";
            dr["ProductName"] = "IPhone7 128G";
            dr["Description"] = "苹果IPhone7, 128G";
            dr["Price"] = 5800M;
            dr["Quantity"] = 10;
            dt.Rows.Add(dr);

            ds.Tables.Add(dtMain);
            ds.Tables.Add(dt);
            return ds;
        }

先加载模板文档

if (setting == null)
{
    setting = new TXTextControl.LoadSettings();
    setting.ApplicationFieldFormat = TXTextControl.ApplicationFieldFormat.MSWord;
}
_textControl.Load(Application.StartupPath + "\Template\template1.docx", TXTextControl.StreamType.WordprocessingML, setting);

整合合并数据

DataSet ds = PurchaseInfoHelper.CreateDataSet();
mailMerge1.MergeBlocks(ds);
mailMerge1.Merge(ds.Tables["main"], true);

最后就可以看到我们所需要的结果了。

图片 10

当然,如果很熟悉Aspose.Word控件的使用,我们其实也可以利用Aspose.Word控件来做后台的数据整合处理,Aspose.Word控件支持很多变量定义,以及更加复杂的处理,如我把原来在框架模块里面的人员信息导出Word功能抽取出来,这个模块原先是利用Aspose.Word来处理数据合并的,我不修改其中的逻辑,只是把合并后的数据展示在TX Text Control即可,如下代码所示。

var saveFile = StaffHelper.GenerateDoc();
//加载文档
_textControl.Load(saveFile, StreamType.MSWord);

最后就生成了我们开始介绍的软件界面效果。

图片 11

这个控件目前使用起来还算不错,不过对于一些数据源的处理方面,以后希望继续增加更多的接口,继续保持观察,希望能将研究的成果用在具体的项目上。

 

一、感慨

1. File类:文件

      上大学的时候,没有学过C#,花了5块钱在地坛书市买了一本教程,也就算是正式入行了。后来深造,学过JAVA,后来迫于生计,打算转JAVA了。后来考虑考虑,自己写的框架还是有很大发展余地,后来还是在C#的阵地上坚持了下来。从一开始的雏形,到SuperIO的产品化,再到服务器端的ServerSuperIO,也是慢慢演化而来。后期打算把ServerSuperIO移植到嵌入式设备上,以及完善开发文档。本来不想提这些,但是今天打算招一个C#开发人员(B/S方面),是群友,可是人家要转JAVA开发了,也只能说缘分不到,无法在一起做事,后面附一些聊天记录,供大家职业发展参考。

创建:File.Create(路径);创建文件,返回FileStream

 

FileStream fs = File.Create(路径);之后需要关闭否则打不开,fs.close();

二、答疑

删除:File.Delete(路径);无返回值

        有人问,你这个框架和SuperSocket、netty......有什么区别?ServerSuperIO是通讯框架不?是;ServerSuperIO支持高并发不?理论上支持;ServerSuperIO支持跨平台不?在Ubuntu上跑过。但是这些并不是ServerSuperIO起初设计的初发点,它继承了SuperIO的设计思想,后期才逐步的向服务端发展,加强通讯能力、跨平台等等。

复制文件:File.Copy(源文件,目标文件);

        ServerSuperIO是一个物联网框架,首先是以设备(传感器)为核心构建的框架,设备(传感器)的协议无关性,可以随意挂载设备驱动在框架下运行。所以ServerSuperIO本质上协调设备驱动(协议)、IO通道(COM和NET)、运行机制(模式)之间的关系,使之无缝结合、运行。

剪切文件:File.Move(源文件路径,目标路径);

        一直在工业领域混,做集成系统、远程监测监控等等,所以ServerSuperIO不仅仅是一个通讯框架,更多的是结合了工作实践经验,本着能够解决实质问题。

判断文件是否存在:File.Exists(路径);返回布尔型,true代表已存在

 

文件加密:File.Encrypt(); 文件名会变成绿色 当前用户还是可以打开 复制给别的用户打不开

三、运行控制模式

文件解密:File.Decrypt();

1、轮询模式

File.GetCreationTime(路径);  获取创建时间,返回DateTime类型 SetCreationTime(路径,DateTime类型);修改创建时间

    这是框架最早的运行模式,串口和网络通讯时都可以使用这种控制模式。当有多个设备 连接到通讯平台时,通讯平台会轮询调度设备进行通讯任务。某一时刻只能有一个设备发送请求命令、等待接收返回数据,这个设备完成发送、接收(如果遇到超时 情况,则自动返回)后,下一个设备才进行通讯任务,依次轮询设备。

File.GetLastAccessTime(路径);  最后访问时间,返回DateTime类型 SetLastAccessTime(路径,DateTime类型);修改访问时间

    应用场景是这样的,服务端与设备进行通讯遵循呼叫应答的方式,也就是IO可用的情况下,服务端先发起通讯命令请求,设备根据命令信息,检验通过后返回数据给服务端。这种通讯模式很好理解,每个设备的通讯都遵循排队的原则。但是如果某个设备的命令需要及时发送,怎么办?ServerSuperIO框架是支持设备优先级别调度的,例如:对某个设备要进行实时的检测,需要连续发送命令,那么就需要对设备进行高级别设置,发送请求数据命令。

File.GetLastWriteTime(路径);  最后修改时间,返回DateTime类型 SetLastWriteTime(路径,DateTime类型);修改修改时间

    通讯结构如下图:

 

本文由澳门新葡亰手机版发布于编程,转载请注明出处:文字处理控件TX,文件操作

上一篇:多态与多态性,计算机网络 下一篇:澳门新葡亰手机版表达式树
猜你喜欢
热门排行
精彩图文