文字處理控件TX Text Control的使用


這幾天一直在研究TX Text Control的使用,由於這方面的資料相對比較少,主要靠下載版本的案例代碼進行研究,以及官方的一些博客案例進行學習,使用總結了一些心得,特將其總結出來,供大家分享學習。本篇隨筆主要介紹TX Text Control V20的相關使用心得。

1、TX Text Control控件介紹

TX Text Control是一款功能類似於 MS Word 的文字處理控件,包括文檔創建、編輯、打印、郵件合並、格式轉換、拆分合並、導入導出、批量生成等功能。廣泛應用於企業文檔管理,網站內容發布,電子病歷中病案模板創建、病歷書寫、修改歷史、連續打印、病案歸檔等功能的實現。

這個控件主要的功能就是可以作為Word以及其他文檔的編輯器使用,雖然展示WORD內容的控件也有一些,如我們可以利用DevExpress里面的RTF文檔編輯器來實現,同樣運行的很好,結合Aspose.Word后台的文檔處理,我們可以做到類似報表的數據生成,而且可以把生成后的文檔進行顯示、編輯等操作處理。

TX Text Control雖然作為文檔編輯各方面都表現不錯,不過其MailMerge郵件合並功能還是經常使用的一個功能,就是把我們的數據和文檔模板來一個合並,然后顯示最終的文檔內容,這種可以用來做一些類似發票、郵件、員工信息等的數據處理和顯示,MailMerge郵件合並可以綁定主從表的數據,能夠符合大多數的要求。

我本來想用它做一個類似電子病歷一樣的功能模塊,不說在文檔里面,我們很難做到一些下拉列表的處理( 官方博客里面有一個簡單的案例,不過不好用),一般情況下,如果我們只是做文檔展示、數據合並等常規的操作,還是很不錯的。

這個控件的功能介紹,可以參考葡萄城里面的網頁介紹(http://www.gcpowertools.com.cn/products/textcontrol_winform_features.htm),這個控件的相關開發人員使用然后分享經驗的文章很少,能在網上搜到的大多數是葡萄城人員對這個控件的Demo代碼進行一個簡單粘貼說明,沒有進一步的深入介紹和應用場景的介紹。雖然葡萄城列舉了幾個電子病歷的公司產品案例,不過這幾家公司的電子病歷產品是很難下載到,也無從知道真假或者使用情況。

這幾天我把這個控件的各種特性做了一些學習,並重新把官網的文檔編輯例子進行了全新開發,參考着做了一個完全一樣的編輯器版本,也基本上對它的各個屬性、方法處理有了一個更加深入的了解。

我們先通過一個軟件界面來了解整個軟件的一些功能(這個是我仿照官方案例做的一個程序)。

這個控件默認安裝后,會帶有很多Demo案例,具體可以參考目錄C:\Users\Administrator\Documents\TX Text Control 20.0.NET for Windows Forms\Samples\ 進行了解。

 

2、TX Text Control控件的漢化

這個控件界面默認是英文版本的,控件的相關菜單以及提示都是英文,因此我們需要對資源做一些中文本地化處理才能正確顯示。

官方沒有提供中文漢化包,只提供一個標准的英文資源,如下所示。

我們需要做的就是將它們進行中文翻譯,然后重新編譯(使用buildres.bat腳本編譯)為中文資源dll。

我們先使用VS編輯工具,把這些英文資源記錄轉換為英文(這是一個比較繁瑣的工作,官方網站上有一些舊版本的中文包可供參考,以及最新的V20軟件(編輯器軟件)下載下來運行參考)。

我們逐一進行中文處理,可以使用百度、Google的翻譯,以及軟件界面的參考哦。

以管理員方式運行VS的命令行,然后執行命令進行編譯資源即可。

buildres.bat zh-CN

編譯成功后,在目錄里面,會增加兩個資源程序集。

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");

運行程序,我們使用右鍵菜單,發現里面的資源都已經正常漢化了,其他相關的內置菜單和界面也都可以看到正常漢化。

 

3、TX Text Control的使用

有了漢化,只是我們正常使用控件的第一步,我們需要在程序里面整合控件,那么就需要對它進行使用,以及對控件的屬性、事件進行處理,才能得到最佳的應用效果。

我們在VS工具欄里面加入對應的控件,可以看到有以下相關的控件對象可供使用,一般情況下我們使用TextControl,然后在其基礎上創建其他RulerBar、ButtonBar、StatusBar即可,而如果我們需要合並數據(很常用)就需要加入MailMerge控件對象。

添加控件后,我們可以對控件的相關基礎的復制、粘貼、剪切等操作可以直接利用控件的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文檔域對象的概念,需要添加一些域來做后續數據替換的對象占位符,如下是我測試的一個模板。

這個里面主要是主從表整合的一個模板,我們需要綁定常規的主表記錄,也需要綁定明細表的集合記錄,不過最后我們都需要把數據對象轉換為集合(如DataSet),然后才能綁定到文檔對象上去。

在上面的文檔里面,你知識看到了域對象,而沒有看到一個隱藏的一個集合記錄的開始和結束的書簽設置。關於書簽的作用和如何操作,可以了解我之前的隨筆文章《利用Aspose.Word控件實現Word文檔的操作》、《利用Aspose.Word控件和Aspose.Cell控件,實現Word文檔和Excel文檔的模板化導出

書簽的作用很重要,否則無法正常解析集合的記錄並綁定在WORD界面上的,我們打開書簽管理對話框,可以看到上述文檔里面有兩個位置,書簽標記的開始和結束位置。

這樣我們設計好模板后,第二步就是通過代碼生成相關對象,然后和文檔進行合並就可以了。

例如我構建一個主表和一個從表的記錄,統一把它們生成一個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);

最后就可以看到我們所需要的結果了。

當然,如果很熟悉Aspose.Word控件的使用,我們其實也可以利用Aspose.Word控件來做后台的數據整合處理,Aspose.Word控件支持很多變量定義,以及更加復雜的處理,如我把原來在框架模塊里面的人員信息導出Word功能抽取出來,這個模塊原先是利用Aspose.Word來處理數據合並的,我不修改其中的邏輯,只是把合並后的數據展示在TX Text Control即可,如下代碼所示。

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

最后就生成了我們開始介紹的軟件界面效果。

這個控件目前使用起來還算不錯,不過對於一些數據源的處理方面,以后希望繼續增加更多的接口,繼續保持觀察,希望能將研究的成果用在具體的項目上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM