這幾天一直在研究TX Text Control的使用,由于這方面的資料相對(duì)比較少哪痰,主要靠下載版本的案例代碼進(jìn)行研究生音,以及官方的一些博客案例進(jìn)行學(xué)習(xí),使用總結(jié)了一些心得缩麸,特將其總結(jié)出來(lái)讯榕,供大家分享學(xué)習(xí)。本篇隨筆主要介紹TX Text Control V20的相關(guān)使用心得匙睹。
1愚屁、TX Text Control控件介紹
TX Text Control是一款功能類似于 MS Word 的文字處理控件,包括文檔創(chuàng)建痕檬、編輯霎槐、打印、郵件合并梦谜、格式轉(zhuǎn)換丘跌、拆分合并、導(dǎo)入導(dǎo)出唁桩、批量生成等功能闭树。廣泛應(yīng)用于企業(yè)文檔管理,網(wǎng)站內(nèi)容發(fā)布荒澡,電子病歷中病案模板創(chuàng)建报辱、病歷書寫、修改歷史单山、連續(xù)打印碍现、病案歸檔等功能的實(shí)現(xiàn)。
這個(gè)控件主要的功能就是可以作為Word以及其他文檔的編輯器使用米奸,雖然展示W(wǎng)ORD內(nèi)容的控件也有一些昼接,如我們可以利用DevExpress里面的RTF文檔編輯器來(lái)實(shí)現(xiàn),同樣運(yùn)行的很好悴晰,結(jié)合Aspose.Word后臺(tái)的文檔處理慢睡,我們可以做到類似報(bào)表的數(shù)據(jù)生成,而且可以把生成后的文檔進(jìn)行顯示、編輯等操作處理漂辐。
TX Text Control雖然作為文檔編輯各方面都表現(xiàn)不錯(cuò)钻弄,不過(guò)其MailMerge郵件合并功能還是經(jīng)常使用的一個(gè)功能,就是把我們的數(shù)據(jù)和文檔模板來(lái)一個(gè)合并者吁,然后顯示最終的文檔內(nèi)容,這種可以用來(lái)做一些類似發(fā)票饲帅、郵件复凳、員工信息等的數(shù)據(jù)處理和顯示,MailMerge郵件合并可以綁定主從表的數(shù)據(jù)灶泵,能夠符合大多數(shù)的要求育八。
我本來(lái)想用它做一個(gè)類似電子病歷一樣的功能模塊,不說(shuō)在文檔里面赦邻,我們很難做到一些下拉列表的處理( 官方博客里面有一個(gè)簡(jiǎn)單的案例髓棋,不過(guò)不好用),一般情況下惶洲,如果我們只是做文檔展示按声、數(shù)據(jù)合并等常規(guī)的操作,還是很不錯(cuò)的恬吕。
這個(gè)控件的功能介紹签则,可以參考葡萄城里面的網(wǎng)頁(yè)介紹(http://www.gcpowertools.com.cn/products/textcontrol_winform_features.htm),這個(gè)控件的相關(guān)開發(fā)人員使用然后分享經(jīng)驗(yàn)的文章很少铐料,能在網(wǎng)上搜到的大多數(shù)是葡萄城人員對(duì)這個(gè)控件的Demo代碼進(jìn)行一個(gè)簡(jiǎn)單粘貼說(shuō)明渐裂,沒(méi)有進(jìn)一步的深入介紹和應(yīng)用場(chǎng)景的介紹。雖然葡萄城列舉了幾個(gè)電子病歷的公司產(chǎn)品案例钠惩,不過(guò)這幾家公司的電子病歷產(chǎn)品是很難下載到柒凉,也無(wú)從知道真假或者使用情況。
這幾天我把這個(gè)控件的各種特性做了一些學(xué)習(xí)篓跛,并重新把官網(wǎng)的文檔編輯例子進(jìn)行了全新開發(fā)膝捞,參考著做了一個(gè)完全一樣的編輯器版本,也基本上對(duì)它的各個(gè)屬性愧沟、方法處理有了一個(gè)更加深入的了解绑警。
我們先通過(guò)一個(gè)軟件界面來(lái)了解整個(gè)軟件的一些功能(這個(gè)是我仿照官方案例做的一個(gè)程序)。
這個(gè)控件默認(rèn)安裝后央渣,會(huì)帶有很多Demo案例计盒,具體可以參考目錄C:\Users\Administrator\Documents\TX Text Control 20.0.NET for Windows Forms\Samples\ 進(jìn)行了解。
2芽丹、TX Text Control控件的漢化
這個(gè)控件界面默認(rèn)是英文版本的北启,控件的相關(guān)菜單以及提示都是英文,因此我們需要對(duì)資源做一些中文本地化處理才能正確顯示。
官方?jīng)]有提供中文漢化包咕村,只提供一個(gè)標(biāo)準(zhǔn)的英文資源场钉,如下所示。
我們需要做的就是將它們進(jìn)行中文翻譯懈涛,然后重新編譯(使用buildres.bat腳本編譯)為中文資源dll惭载。
我們先使用VS編輯工具,把這些英文資源記錄轉(zhuǎn)換為英文(這是一個(gè)比較繁瑣的工作田藐,官方網(wǎng)站上有一些舊版本的中文包可供參考怠苔,以及最新的V20軟件(編輯器軟件)下載下來(lái)運(yùn)行參考)。
我們逐一進(jìn)行中文處理埋心,可以使用百度指郁、Google的翻譯,以及軟件界面的參考哦拷呆。
以管理員方式運(yùn)行VS的命令行闲坎,然后執(zhí)行命令進(jìn)行編譯資源即可。
buildres.bat zh-CN
編譯成功后茬斧,在目錄里面腰懂,會(huì)增加兩個(gè)資源程序集。
txdocumentserver.resources.dll
txtextcontrol.resources.dll
然后我們把它復(fù)制到運(yùn)行目錄下项秉,并放在zh-CN的目錄里面即可悯恍。有了這些中文化的資源程序集,我們就可以利用它進(jìn)行對(duì)控件的內(nèi)置菜單提示進(jìn)行中文化了伙狐。
中文化操作和其他常規(guī)的做法一樣涮毫,我們?cè)贛ain函數(shù)里面,添加如下代碼即可贷屎。
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN");
運(yùn)行程序罢防,我們使用右鍵菜單,發(fā)現(xiàn)里面的資源都已經(jīng)正常漢化了唉侄,其他相關(guān)的內(nèi)置菜單和界面也都可以看到正常漢化咒吐。
3、TX Text Control的使用
有了漢化属划,只是我們正常使用控件的第一步恬叹,我們需要在程序里面整合控件,那么就需要對(duì)它進(jìn)行使用同眯,以及對(duì)控件的屬性绽昼、事件進(jìn)行處理,才能得到最佳的應(yīng)用效果须蜗。
我們?cè)赩S工具欄里面加入對(duì)應(yīng)的控件硅确,可以看到有以下相關(guān)的控件對(duì)象可供使用目溉,一般情況下我們使用TextControl,然后在其基礎(chǔ)上創(chuàng)建其他RulerBar菱农、ButtonBar缭付、StatusBar即可,而如果我們需要合并數(shù)據(jù)(很常用)就需要加入MailMerge控件對(duì)象循未。
添加控件后陷猫,我們可以對(duì)控件的相關(guān)基礎(chǔ)的復(fù)制、粘貼的妖、剪切等操作可以直接利用控件的API即可實(shí)現(xiàn)绣檬。
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();
}
其中查找、替換對(duì)話框也是可以通過(guò)API進(jìn)行調(diào)出羔味。
private void menuEdit_Find_Click(object sender, EventArgs e)
{
_textControl.Find();
}
private void menuEdit_Replace_Click(object sender, EventArgs e)
{
_textControl.Replace();
}
利用這些最基礎(chǔ)的API是常規(guī)的操作。
而利用插入相關(guān)的對(duì)象钠右,如圖片赋元、文本框等,就需要做一些簡(jiǎn)單的編碼飒房,方便把對(duì)象加入到TextControl對(duì)象里面搁凸。
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);
}
}
這個(gè)控件最常見(jiàn)的就是MailMerge進(jìn)行合并數(shù)據(jù)的操作了,這個(gè)也是我們利用它來(lái)處理很多模板化文檔的目的狠毯。
MailMerge對(duì)象合并數(shù)據(jù)的操作护糖,主要是接受集合對(duì)象或者是DataTable對(duì)象,所以我們必須將我們的數(shù)據(jù)轉(zhuǎn)換為這種格式嚼松,否則合并數(shù)據(jù)得不到要的結(jié)果嫡良。
合并數(shù)據(jù)的處理方式,最開始就是需要設(shè)計(jì)好模板献酗,這點(diǎn)很重要寝受,模板的設(shè)計(jì)還是沿用了常規(guī)Word文檔域?qū)ο蟮母拍睿枰砑右恍┯騺?lái)做后續(xù)數(shù)據(jù)替換的對(duì)象占位符罕偎,如下是我測(cè)試的一個(gè)模板很澄。
這個(gè)里面主要是主從表整合的一個(gè)模板,我們需要綁定常規(guī)的主表記錄颜及,也需要綁定明細(xì)表的集合記錄甩苛,不過(guò)最后我們都需要把數(shù)據(jù)對(duì)象轉(zhuǎn)換為集合(如DataSet),然后才能綁定到文檔對(duì)象上去俏站。
在上面的文檔里面讯蒲,你知識(shí)看到了域?qū)ο螅鴽](méi)有看到一個(gè)隱藏的一個(gè)集合記錄的開始和結(jié)束的書簽設(shè)置肄扎。關(guān)于書簽的作用和如何操作爱葵,可以了解我之前的隨筆文章《利用Aspose.Word控件實(shí)現(xiàn)Word文檔的操作》施戴、《利用Aspose.Word控件和Aspose.Cell控件,實(shí)現(xiàn)Word文檔和Excel文檔的模板化導(dǎo)出》
書簽的作用很重要萌丈,否則無(wú)法正常解析集合的記錄并綁定在WORD界面上的赞哗,我們打開書簽管理對(duì)話框,可以看到上述文檔里面有兩個(gè)位置辆雾,書簽標(biāo)記的開始和結(jié)束位置肪笋。
這樣我們?cè)O(shè)計(jì)好模板后,第二步就是通過(guò)代碼生成相關(guān)對(duì)象度迂,然后和文檔進(jìn)行合并就可以了藤乙。
例如我構(gòu)建一個(gè)主表和一個(gè)從表的記錄,統(tǒng)一把它們生成一個(gè)DataSet對(duì)象供使用惭墓。
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"] = "廣州愛(ài)奇迪軟件科技有限公司";
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"] = "海飛絲洗發(fā)水";
dr["Description"] = "海飛絲洗發(fā)水, 550ml";
dr["Price"] = 19.8M;
dr["Quantity"] = 100;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "2";
dr["ProductName"] = "聯(lián)想品牌電腦";
dr["Description"] = "聯(lián)想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);
整合合并數(shù)據(jù)
DataSet ds = PurchaseInfoHelper.CreateDataSet();
mailMerge1.MergeBlocks(ds);
mailMerge1.Merge(ds.Tables["main"], true);
最后就可以看到我們所需要的結(jié)果了坛梁。
當(dāng)然,如果很熟悉Aspose.Word控件的使用腊凶,我們其實(shí)也可以利用Aspose.Word控件來(lái)做后臺(tái)的數(shù)據(jù)整合處理划咐,Aspose.Word控件支持很多變量定義,以及更加復(fù)雜的處理钧萍,如我把原來(lái)在框架模塊里面的人員信息導(dǎo)出Word功能抽取出來(lái)褐缠,這個(gè)模塊原先是利用Aspose.Word來(lái)處理數(shù)據(jù)合并的,我不修改其中的邏輯风瘦,只是把合并后的數(shù)據(jù)展示在TX Text Control即可队魏,如下代碼所示。
var saveFile = StaffHelper.GenerateDoc();
//加載文檔
_textControl.Load(saveFile, StreamType.MSWord);
最后就生成了我們開始介紹的軟件界面效果万搔。
這個(gè)控件目前使用起來(lái)還算不錯(cuò)胡桨,不過(guò)對(duì)于一些數(shù)據(jù)源的處理方面,以后希望繼續(xù)增加更多的接口瞬雹,繼續(xù)保持觀察登失,希望能將研究的成果用在具體的項(xiàng)目上。