在项目中利用TX Text Control进行WORD文档的编辑显示处理 - 伍华聪

时间:2024-03-10 19:49:52

在项目中利用TX Text Control进行WORD文档的编辑显示处理

在很多文档管理的功能模块里面,我们往往需要对WORD稳定进行展示、编辑等处理,而如果使用微软word控件进行处理,需要安装WORD组件,而且接口使用也不见得简单易用,因此如果有第三方且不用安装Office的能够展示WORD及进行编辑,那是比较不错的选择,TX Text Control就是这样的控件,本文就是基于这个控件的使用,实现在文档管理项目中的应用。

1、TX Text Control的介绍及使用

TX Text Control是一款功能类似于 MS Word 的文字处理控件,包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理,网站内容发布,电子病历中病案模板创建、病历书写、修改历史、连续打印、病案归档等功能的实现。这个控件主要的功能就是可以作为Word以及其他文档的编辑器使用,整体展示的效果非常贴近原生WORD的展示,是一款非常不错的控件套件。

在我较早的一篇随笔《文字处理控件TX Text Control的使用》里面,大概简单的介绍了这个控件的使用,而且我把这个版本的英文资源全部汉化并进行了编译使用,基本上所有的功能都是展示正常的中文了,这样更适合我们实际项目的使用了。

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

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

我们这里主要目的是在WInform项目中集成该控件的使用,就不像上篇那样介绍使用它编写一个完整独立的Word处理那样了。

如下面就是把相关的控件拖动到自定义控件上的效果。

类代码如下所示:

    /// <summary>
    /// 基于TxTextControl控件的自定义控件封装
    /// </summary>
    public partial class TextWordControl : XtraUserControl

另外功能按钮可以自定义,增加或者减少部分按钮功能,如下列表所示。

 

2、TX Text Control自定义控件的代码实现和使用

为了实现这个WORD编辑控件的一些按键操作,如全部选择(Ctrl+A)、查找(Ctrl+F)、替换(Ctrl+H)等基础操作,我们需要在控件代码中实现相关的按键事件处理,这样我们使用这些按键就可以直接调用控件的内置处理窗体了,具体代码如下所示。

    /// <summary>
    /// 基于TxTextControl控件的自定义控件封装
    /// </summary>
    public partial class TextWordControl : XtraUserControl
    {
        public TextWordControl()
        {
            InitializeComponent();


            InitEvent();
        }

        /// <summary>
        /// 处理控件的事件
        /// </summary>
        private void InitEvent()
        {
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN");

            this.textControl1.KeyDown += textControl1_KeyDown;
        }

        void textControl1_KeyDown(object sender, KeyEventArgs e)
        {
            HandleKeyDownEvent(e);
        }

        private void HandleKeyDownEvent(KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Insert:
                    if (e.Control || e.Alt || e.Shift) break;
                    //插入按键操作
                    textControl1.InsertionMode
                       = textControl1.InsertionMode == TXTextControl.InsertionMode.Insert
                       ? TXTextControl.InsertionMode.Overwrite
                       : TXTextControl.InsertionMode.Insert;
                    break;

                case Keys.A:
                    if (!e.Control || e.Alt || e.Shift) break;
                    // Ctrl-A: 全选操作
                    textControl1.SelectAll();
                    break;

                case Keys.F:
                    if (!e.Control || e.Alt || e.Shift) break;
                    // Ctrl-F: 查找操作
                    textControl1.Find();
                    break;

                case Keys.H:
                    if (!e.Control || e.Alt || e.Shift) break;

                    // Ctrl-H: 替换操作
                    textControl1.Replace();
                    break;
            }
        }

如查找和替换的内置对话框界面如下所示。

由于WORD文档数据,我们存储在数据库里面一般使用的是二进制存储,因此还需要设置一个自定义控件的属性用来设置获取获取文档控件的数据的,具体代码如下所示。

        /// <summary>
        /// 文档数据
        /// </summary>
        [Browsable(false)]
        public byte[] DocData
        {
            get
            {
                byte[] docData = null;
                textControl1.Save(out docData, TXTextControl.BinaryStreamType.MSWord);
                return docData;
            }
            set
            {
                if (value != null)
                {
                    try
                    {
                        textControl1.Load(value, TXTextControl.BinaryStreamType.MSWord);
                    }
                    catch(Exception ex)
                    {
                        LogHelper.Error(ex);
                        MessageDxUtil.ShowError(ex.Message);
                    }
                }
            }
        }

然后再提供的接口函数,用来加载本地WORD文档的数据,具体代码如下所示。

        public void LoadData(string file)
        {
            if (!string.IsNullOrEmpty(file))
            {
                try
                {
                    this.textControl1.Load(file, TXTextControl.StreamType.MSWord);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                    MessageDxUtil.ShowError(ex.Message);
                }
            }
        }

然后在文档管理的功能模块里面,对文档的内容进行加载和保存即可,如下是文档展示的项目实际效果。

编辑WORD文档的界面效果如下所示,我们可以看到,这个控件里面展示的Word格式及内容都和WORD软件展示的并无异样,非常不错,而且速度也很快,比DevExpress的RichTextEdit控件的效果和速度要好很很多。

 

以上就是应用TX Text Control进行WORD文档的编辑显示处理的实际总结,希望能够给你提供灵感和帮助。