有一句語句:
~R'\qc\brdrb\brdrs\brdrw1'
放在sas代碼中proc report 語句的column行育特,如下
proc report data=_m_dsin_report out=_m_dsout_report split="#" style(column)=[asis=off] list nowd;
column trt01pn trt01p subjid agsxnt avisitn avisit qsdate ("健康描述系統(tǒng) ~R'\qc\brdrb\brdrs\brdrw1 '" col1 col2 col3 col4 col5 ) COL7 COL6;
define TRT01PN/order noprint order=internal;
define TRT01P/order order=internal '組別' format=$19. style=[just=center width=13.7%];
define SUBJID/order order=internal '受試者#編號' format=$6. style=[just=center width=4.3%];
define AGSXNT/order order=internal '年齡/#性別#/民族' format=$10. style=[just=center width=7.2%];
define AVISITN/order noprint order=internal;
define AVISIT/order order=internal '分析#訪視' format=$13. style=[just=center width=9.4%];
define QSDATE/display order=internal '評分日期#/研究天數(shù)' format=$14. style=[just=center width=10.1%];
define COL1/display order=internal '行動' format=best1. style=[just=center width=2.9%];
define COL2/display order=internal '自我#照顧' format=best1. style=[just=center width=2.9%];
define COL3/display order=internal '日常#活動' format=best1. style=[just=center width=2.9%];
define COL4/display order=internal '疼痛/#不舒服' format=best1. style=[just=center width=4.3%];
define COL5/display order=internal '焦慮/#抑郁' format=best1. style=[just=center width=3.6%];
define COL7/display order=internal '健康描述系統(tǒng)評分' format=best5. style=[just=center width=11.5%];
define COL6/display order=internal 'VAS評分' format=best4. style=[just=center width=5.0%];
run;
這句語句的具體含義拗秘,涉及到RTF文件的內(nèi)容签舞,參考
https://blog.csdn.net/a3729291988/article/details/8144883
摘要: 本文對RTF文件格式進行分析研究贷帮,對RTF文件結(jié)構(gòu)及特性進行了闡述戚揭,并分別列舉了幾個實用性的例子進行詳細分析,
最終通過VB程序代碼實現(xiàn)了一個RTF書寫器(不具有所見即所得特性)撵枢。本文對軟件開發(fā)人員及RTF文件格式感興趣的人員具有參考價值民晒。
關(guān)鍵字:RTF精居、Rich Text Format、Office潜必、文件格式靴姿。
一、引言
富文本格式(RTF)規(guī)范是為了便于在應(yīng)用程序之間輕松轉(zhuǎn)儲格式化文本和圖形的一種編碼方法〈殴觯現(xiàn)在佛吓,用戶可以利用特定轉(zhuǎn)換軟件,在不同系統(tǒng)如MS-DOS垂攘、Windows维雇、OS/2、Macintosh和Power Macintosh的應(yīng)用程序之間轉(zhuǎn)移字處理文檔晒他。RTF規(guī)范提供一種在不同的輸出設(shè)備谆沃、操作環(huán)境和操作系統(tǒng)之間交換文本和圖形的一種格式。RTF使用ANSI, PC-8, Macintosh, 或IBM PC字符集控制文檔的表示法和格式化仪芒,包括屏幕顯示和打印唁影。憑借RTF規(guī)范,不同的操作系統(tǒng)和不同的軟件程序創(chuàng)建的文檔能夠在這些操作系統(tǒng)和應(yīng)用程序之間傳遞掂名。
將一個格式化的文件轉(zhuǎn)換為RTF文件的軟件稱為RTF書寫器据沈。RTF書寫器用于分離現(xiàn)有文本中的程序控制信息,并且生成一個包含文本和與之相關(guān)的RTF組的新文件饺蔑。將RTF文件轉(zhuǎn)換成格式化文件的軟件則稱為RTF閱讀器锌介。
二、RTF基本語法
RTF文件由未格式化本文猾警、控制字孔祸、控制符和組組成。RTF文件沒有限制文件的行的最大長度发皿〈藁郏控制字是RTF用來標(biāo)記打印控制符和管理文檔信息的一種特殊格式的命令。一個控制字最長32個字符穴墅』淌遥控制字的使用格式如下:
\字母序列<分隔符>
注意:每個控制字均以一個反斜杠\開頭。字母序列由a~z 的小寫字母組成玄货』食控制字(或者稱為關(guān)鍵字)通常應(yīng)該不包含任何大寫字母。
分隔符標(biāo)記RTF控制字的結(jié)束, 可以是下列各項之一:
· 一個空格松捉,這時空格是控制字的一部份夹界。
· 一個數(shù)字或連字符(-), 表示跟隨的一個數(shù)值參數(shù)。該數(shù)字序列的長度由其后的一個空格或除了字母和數(shù)字的其他字符劃定隘世。這個參數(shù)可以是正數(shù)或者負數(shù)可柿,它的取值范圍通常是從-32767到32767也拜。
· 任何非字母和數(shù)字的其他字符。這種情況下趾痘,此分隔字符結(jié)束控制字慢哈,而它并不屬于控制字的一部分。
控制符由一個反斜線\跟隨單個非字母字符組成永票。例如卵贱,~代表一個不換行空格÷录控制符不需要分隔符键俱。
組由包括在({})中的文本、控制字或控制符組成世分。左擴符({)表示組的開始编振,右擴符(})表示組的結(jié)束。每個組包括文本和文本的不同屬性臭埋。RTF文件也能同時包括字體踪央、格式、屏幕顏色瓢阴、圖形畅蹂、腳注、注釋(注解)荣恐、文件頭和文件尾液斜、摘要信息、域和書簽的組合叠穆,以及文檔少漆、區(qū)段、段落和字符的格式屬性硼被。如果包括字體示损、文件、格式祷嘶、屏幕顏色屎媳、校訂標(biāo)記夺溢,以及摘要信息組论巍、文檔格式屬性,則他們一定要在文件的第一純文本字符之前风响,這些組形成RTF的文件頭嘉汰。如果包括字體組,則它應(yīng)該在格式組之前。如果組未使用,可以省略状勤。
對于RTF文件的詳細語法及關(guān)鍵字說明請參閱《Rich Text Format (RTF) Specification v1.7》鞋怀,這里不作更詳細的說明双泪。
三、Hello Word
國際慣例密似,一個Hello Word!演示例子焙矛,內(nèi)容如下:
{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052
{\fonttbl{\f0\fmodern\fprq6\fcharset134 'cb'ce'cc'e5;}}
{*\generator Msftedit 5.41.21.2500;}\viewkind4\uc1\pard\lang2052\f0\fs20 Hello World!\par}
該文件分析如下(紅色):
1、文件基本屬性:
{\rtf1 RTF版本\ansi字符集\ansicpg936簡體中文\deff0默認(rèn)字體0\deflang1033美國英語\deflangfe2052中國漢語
2残腌、字體表:
{\fonttbl{\f0字體0\fmodern\fprq6字體間距為6\fcharset134GB2312國標(biāo)碼 'cb'ce'cc'e5宋體;}}
3村斟、生成器信息:
{*\generator Msftedit 5.41.21.2500;}
4、文檔屬性:
\viewkind4正常視圖\uc1單字節(jié)\pard默認(rèn)段落屬性\lang2052中國漢語\f0字體0\fs20字體大小20磅
5抛猫、正文文本:
Hello World!\par段落標(biāo)記
}文件結(jié)束
注意:在RTF文件中蟆盹,中文等雙字節(jié)字符采用其單字節(jié)ASCII碼序列表示,例如文本“宋體ABC”應(yīng)該表示為:'cb'ce'cc'e5ABC闺金,這就是為什么RTF可讀性差的原因逾滥。如果需要通過程序獲取某個字符串的合法ASCII序列,可以采用如下的VB函數(shù):
Public Function StrToASC(ByVal strIn As String) As String
'將中文字符串轉(zhuǎn)換為ASC串(包括英文一起)
'先將特殊字符進行轉(zhuǎn)義:
strIn = Replace(strIn, Chr(9), "\TAB ")
strIn = Replace(strIn, Chr(13) + Chr(10), "\par ")
Dim i As Long, s As String, lsChar As String, lsPart1 As String, lsPart2 As String
Dim lsCharHex As String
For i = 1 To Len(strIn)
lsChar = Mid(strIn, i, 1)
If lsChar = "?" Then
lsCharHex = LCase(Hex(Asc(lsChar)))
If Len(lsCharHex) = 4 Then
lsCharHex = "'" + Mid(lsCharHex, 1, 2) + "'" + Mid(lsCharHex, 3, 2)
Else
lsCharHex = lsChar
End If
s = s + lsCharHex
Else
lsCharHex = LCase(Hex(Asc(lsChar)))
If Len(lsCharHex) = 4 Then
lsCharHex = "'" + Mid(lsCharHex, 1, 2) + "'" + Mid(lsCharHex, 3, 2)
Else
lsCharHex = lsChar
End If
s = s + lsCharHex
End If
Next
StrToASC = s
End Function
四败匹、文字的更高級表示
掌握了基本文字表述方法后寨昙,你一定會試著進一步探索文本更高級的表示方法,如下劃線掀亩、顏色毅待、粗體、斜體等等归榕,而這些在V1.7規(guī)范中都作了詳細描述尸红,本文只列出部分常用關(guān)鍵字,以供參考刹泄。
l 對于字體表和顏色表的說明:
對于我們在文檔中使用的每一個字體和顏色外里,我們都必須在文檔頭的字體表和顏色表中預(yù)先定義。
字體表定義的例子如下:
{\fonttbl
{\f0\froman\fcharset0\fprq2{*\panose 02020603050405020304}Times New Roman;}
{\f1\fswiss\fcharset0\fprq2{*\panose 020b0604020202020204}Arial;}
{\f10\fnil\fcharset2\fprq2{*\panose 05000000000000000000}Wingdings;}
… …
}
我們在使用字體時特石,就可以直接指定字體表的一個索引盅蝗,如:“\f1Happy”表示字體為Arial 的文本Happy。如果我們想加入其他字體姆蘸,如“華文中宋”墩莫,那么只需要在字體表中加入該字體說明,并在需要時引用該字體索引值即可逞敷。方法為(華文中宋的ASCII串為“'bb'aa'ce'c4'd6'd0'cb'ce”):{f222\fnil\fcharset134\fprq2'bb'aa'ce'c4'd6'd0'cb'ce;}狂秦,然后通過\f222來引用該字體即可。
顏色表定義的例子如下:
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; … …}
顏色表中每個顏色值采用RGB格式書寫推捐,每個顏色用分號格開裂问,注意第一個顏色值\c0為空,表示系統(tǒng)默認(rèn)顏色(一般為黑色)。依次為:\0堪簿、\1痊乾、\2、… …椭更。我們在使用顏色時(如字體顏色)就可以指定某一個顏色索引值哪审,如“\cf2Sunday”表示字體顏色為RGB(0,0,255)藍色的文字Sundy÷瞧伲“\cb6ABC”表示字體背景色為RGB(255,0,0)的文字“ABC”协饲。如果我們需要加入其他顏色值,只需要在顏色表中加入顏色定義缴川,并通過相應(yīng)的索引值來引用它即可茉稠。
l 字符底紋語法如下:
控制字
涵義
\chbrdr
字符邊框(每邊均有邊框)。
\chshdngN
字符陰影把夸。參數(shù)N的值文字陰影的百分比而线。
\chcfpatN
N是背景圖案的顏色,指定文檔顏色表的一個索引恋日。
\chcbpatN
N是填充色膀篮,指定文檔顏色表的一個索引。
\chbghoriz
指定水平線文本背景圖案岂膳。
\chbgvert
指定垂直線文本背景圖案誓竿。
\chbgfdiag
指定正向?qū)蔷€文本背景圖案(\\)。
\chbgbdiag
指定反向?qū)蔷€文本背景圖案(\\)谈截。
\chbgcross
指定十字線文本背景圖案筷屡。
\chbgdcross
指定對角十字線文本背景圖案。
\chbgdkhoriz
指定粗水平線文本背景圖案簸喂。
\chbgdkvert
指定粗垂直線文本背景圖案毙死。
\chbgdkfdiag
指定粗前斜線文本背景圖案(\\)。
\chbgdkbdiag
指定粗后斜線文本背景圖案(////)喻鳄。
\chbgdkcross
指定粗十字線文本背景圖案扼倘。
\chbgdkdcross
指定粗對角十字線文本背景圖案。
假設(shè)我們希望得到背景為水平線除呵、字體為華文中宋(字體索引為222)再菊、顏色為紅色(顏色索引為6)的文本“星期天”,則只需輸入:\f222\cf6'bb'aa'ce'c4'd6'd0'cb'ce 即可颜曾。
l 字符下劃線語法如下:
控制字
涵義
\ul
連續(xù)的下劃線纠拔。\ul0關(guān)閉所有下劃線。
\ulcN
下劃線顏色泛啸。(注意:大寫N表示一個索引數(shù)字绿语,下同)
\uld
點下劃線秃症。
\uldash
短劃下劃線候址。
\uldashd
點劃下劃線吕粹。
\uldashdd
雙點劃下劃線。
\uldb
雙下劃線岗仑。
\ulhwave
加重波浪下劃線匹耕。
\ulldash
長劃下劃線。
\ulnone
停止所有下劃線荠雕。
\ulth
粗下劃線稳其。
\ulthd
粗點下劃線。
\ulthdash
粗短劃下劃線炸卑。
\ulthdashd
粗點劃下劃線既鞠。
\ulthdashdd
粗雙點劃下劃線。
\ulthldash
粗長劃下劃線盖文。
\ululdbwave
雙波浪下劃線嘱蛋。
\ulw
字下加下劃線。
\ulwave
波浪下劃線五续。
下劃線語法與前面底紋的使用相同洒敏。
l 其他文本顯示高級屬性:
控制字
涵義
\outl
邊框。\ outl 0關(guān)閉之疙驾。
\scaps
小體大寫字母凶伙。\ scaps 0關(guān)閉之。
\shad
陰影它碎。\ shad 0關(guān)閉之函荣。
\strike
刪除線。\strike0關(guān)閉之扳肛。
\striked1
雙刪除線偏竟。\striked0關(guān)閉之。
\sub
按照字體信息的下標(biāo)文本和縮小點的尺寸敞峭。
\super
按照字體信息的上標(biāo)文本和縮小點的尺寸踊谋。
l 對齊方式語法如下:
控制字
涵義
\qc
居中對齊。
\qj
兩端對齊旋讹。
\ql
左對齊(默認(rèn))殖蚕。
\qr
右對齊。
\qd
分散對齊沉迹。
\qkN
使用Kashida規(guī)則調(diào)整行百分比(0-低睦疫、10-中、20-高)鞭呕。
\qt
.用于泰文的分散對齊蛤育。
l 文本縮進語法如下:
控制字
涵義
\fiN
首行縮進(默認(rèn)為0)。
\cufiN
采用字符單位的百分比的首行縮進值,用以覆蓋\fiN的設(shè)置瓦糕,雖然它們可以設(shè)為相同值底洗。
\liN
左端縮進(默認(rèn)為0)。
\linN
從左至右段落的左端縮進值咕娄;如果在從右至左段落則表示右端縮進值(默認(rèn)為0)亥揖。\linN定義了段前空格數(shù)。
\culiN
采用字符單位的百分比的左端縮進值圣勒,與\linN一樣费变,它用以覆蓋\liN和\linN的設(shè)置,雖然它們可以設(shè)為相同值圣贸。
\riN
右縮進(默認(rèn)為0)挚歧。
\rinN
從左至右段落的右端縮進值;如果在從右至左段落則表示左端縮進值(默認(rèn)為0)吁峻。\rinN定義了段前空格數(shù)滑负。
\curiN
采用字符單位的百分比的右端縮進值,與\rinN一樣锡搜,它用以覆蓋\riN和\rinN的設(shè)置橙困,雖然它們可以設(shè)為相同值。
\adjustright
當(dāng)文檔網(wǎng)格被定義時自動調(diào)整右縮進耕餐。
l 文本間距語法如下:
\sbN
段后間隔(默認(rèn)為0)凡傅。
\saN
段前間隔(默認(rèn)為0)。
\sbautoN
自動段前間隔:
0 段前間距取決于\sb肠缔。
1 自動段前間距(忽略\sb)夏跷。
默認(rèn)為0。
\saautoN
自動段后間隔:
0 段后間距取決于\sa明未。
1 自動段后間距(忽略\sa)
默認(rèn)為0槽华。
\lisbN
采用字符單位的百分比的段前間隔值,用以覆蓋\sbN的設(shè)置趟妥,雖然它們可以設(shè)為相同值猫态。
\lisaN
采用字符單位的百分比的段后間隔值,用以覆蓋\saN的設(shè)置披摄,雖然它們可以設(shè)為相同值亲雪。
\slN
行間距。如果沒有使用該控制字或者使用\sl0疚膊,則行間距將根據(jù)行間字符最高值自動取值义辕。若N為一個正值,則該值將僅僅在該值大于行間字符最高值時才使用(否則寓盗,使用字符最高值)灌砖;分N是一個負值璧函,即使在其小于行間字符最高值時,總是使用N的絕對值基显。
\slmultN
多倍行間距蘸吓。指出當(dāng)前行間距是單倍行距的倍數(shù)。該控制字只能跟在\sl后续镇,聯(lián)合作用美澳。
0 “最小”或者是“精確”的行距
1 多倍行距销部,相對于“單倍”行距摸航。
\nosnaplinegrid
取消對齊網(wǎng)格線。
因為篇幅限制舅桩,更詳細的文本格式分析請參閱附件里的文本示例分析原文酱虎。
五、圖片的表示方式
摸清RTF中圖片的表示頗費了一番周折擂涛,下面的分析希望能夠加速你的學(xué)習(xí)進程读串。一個RTF圖片數(shù)據(jù)通常直接嵌入文件中,這些圖象可以是16進制(默認(rèn)的)或2進制格式撒妈。圖象屬于目標(biāo)引用恢暖,由\pict 控制字開始。如后面的例子中將描述的狰右,\pict關(guān)鍵字應(yīng)在*\shppict引用控制關(guān)鍵字之后杰捂。
一個圖象的例子如下:
{*\shppict{\pict
{*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}
\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4516\pich4516\picwgoal2560\pichgoal2560\jpegblip\bliptag-728883813
{*\blipuid d48e1d9b2268ef9f2741709749fb439c}
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f… …}}
{\nonshppict {\pict \picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4516\pich4516\picwgoal2560\pichgoal2560\wmetafile8\bliptag-728883813\blipupi72
{*\blipuid d48e1d9b2268ef9f2741709749fb439c}
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000… …}}
其分析如下(紅色):
{*\shppict圖片(引用)
{\pict圖片開始
繪圖對象屬性(這個組可以省略):
{*\picprop表示這里是應(yīng)用于一個內(nèi)嵌圖象的形狀屬性\shplid1025標(biāo)識每個圖形的唯一數(shù)值
{\sp繪圖對象屬性定義
{\sn shapeType}{\sv 75}} 圖片類型為相框
{\sp{\sn fFlipH}{\sv 0}} 水平翻轉(zhuǎn):False
{\sp{\sn fFlipV}{\sv 0}} 垂直翻轉(zhuǎn):False
{\sp{\sn pibFlags}{\sv 2}} 鏈接圖片標(biāo)志
{\sp{\sn fLine}{\sv 0}}具有線條:False
{\sp{\sn fLayoutInCell}{\sv 1}}允許圖形錨點定位在單元格內(nèi)部:True
}繪圖對象屬性定義結(jié)束
圖片屬性:
\picscalex100水平縮放比例\picscaley100垂直縮放比例
\piccropl0左端剪切值=0\piccropr0右端剪切值=0\piccropt0上端剪切值=0\piccropb0下端剪切值=0
\picw4516圖片的像素寬度\pich4516圖片的像素高度\picwgoal2560圖象期望寬度\pichgoal2560圖象期望高度\jpegblip圖片源為一個JPEG文件\bliptag圖象ID標(biāo)識-728883813
{*\blipuid d48e1d9b2268ef9f2741709749fb439c}
圖片16進制數(shù)據(jù):
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f}16進制圖片數(shù)據(jù)結(jié)束
}
兼容性wMetaFile文件內(nèi)容(可用省略):
{\nonshppict只用于兼容,不讀取
{\pict圖片開始\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4516\pich4516\picwgoal2560\pichgoal2560\wmetafile8\bliptag-728883813\blipupi72
{*\blipuid d48e1d9b2268ef9f2741709749fb439c}
下面是MetaFile類型的16進制數(shù)據(jù):
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000
}MetaFile類型16進制圖片數(shù)據(jù)結(jié)束
}
為了簡化分析棋蚌,我們除去所以可以省略的內(nèi)容嫁佳,則一副圖片可以這樣表示:
{*\shppict{\pict piccropl0\piccropr0\piccropt0\piccropb0\picw寬度\pich高度\picwgoal顯示寬度\pichgoal顯示高度\jpegblipJPEG類型\bliptag-728883813ID值(為一個負的長整形值)
下面是該圖片的實際16進制數(shù)據(jù):
ffd8ffe0001… …}}
如果需要通過程序獲取指定圖片合法的16進制字符串,可以采用如下的VB函數(shù):
Public Function PicToASC(ByVal strFileName As String) As String
'獲取圖片16進制數(shù)據(jù)
Dim bData() As Byte
Dim i As Long
Dim lNum As Long
Dim strData As String, strTMP As String
lNum = FreeFile
Open strFileName For Binary As #lNum
ReDim bData(LOF(lNum) - 1)
Get #lNum, , bData
Close #lNum
strData = Space((UBound(bData) + 1) * 2)
For i = 0 To UBound(bData)
strTMP = Hex$(bData(i))
If Len(strTMP) = 1 Then
strTMP = "0" + strTMP
End If
Mid(strData, i * 2 + 1) = strTMP
Next
PicToASC = strData
End Function
六谷暮、表格基本表示方法
上面對文本和圖片都進行了分析蒿往,相信你已經(jīng)對RTF文件格式有了一定體會,接下來說明RTF文件中表的表示方法湿弦。表的定義稍顯復(fù)雜瓤漏,不過還是有規(guī)律可循的。不存在RTF表組颊埃,實際上表由段落屬性來描述蔬充。一個表表現(xiàn)為多個表行的順序排列。一個表行是一個由不同單元格組成的段落序列竟秫。簡言之娃惯,表格由行組成,行由單元格組成肥败。不管有多復(fù)雜的表格趾浅,它都是通過一行接一行的描述來實現(xiàn)的愕提,包括表格的嵌套。表行從控制字\trowd開始皿哨,\row結(jié)束浅侨。包含在一個表行中的每個段落必須指定\intbl控制字或者從前一段落繼承。一個單元內(nèi)可能有多個段落证膨;單元由單元格標(biāo)志(\cell控制字)結(jié)束如输,行由行標(biāo)志(\row控制字)結(jié)束。表行也可以被絕對定位央勒。此時不见,表行的每個段落必須具有相同的定位控制字。表的屬性可以從前一行繼承崔步;因此稳吮,連續(xù)的表行可以通過單一的<tbldef>來定義。
一個簡單表格例子如下:
1,1
1,2
1,3
2,1
2,2
2,3
RTF內(nèi)容如下:
\trowd \irow0\irowband0\ts15\trgaph108\trleft-108\trbrdrt
\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10
\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid2113686\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2840\clshdrawnil \cellx2732\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2841\clshdrawnil \cellx5573\clvertalt\clbrdrt
\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2841\clshdrawnil \cellx8414\pard\plain \qj \li0\ri0\nowidctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\yts15
\fs21\lang1033\langfe2052\kerning2\loch\af0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid2113686 \hich\af0\dbch\af13\loch\f0 1,1\cell \hich\af0\dbch\af13\loch\f0 1,2\cell \hich\af0\dbch\af13\loch\f0 1,3\cell }\pard\plain
\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs21\lang1033\langfe2052\kerning2\loch\af0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid2113686 \trowd \irow0\irowband0\ts15\trgaph108\trleft-108\trbrdrt
\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10
\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid2113686\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2840\clshdrawnil \cellx2732\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2841\clshdrawnil \cellx5573\clvertalt\clbrdrt
\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2841\clshdrawnil \cellx8414\row }\pard\plain \qj \li0\ri0\nowidctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0\yts15
\fs21\lang1033\langfe2052\kerning2\loch\af0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid2113686 \hich\af0\dbch\af13\loch\f0 2,1\cell \hich\af0\dbch\af13\loch\f0 2,2\cell \hich\af0\dbch\af13\loch\f0 2,3\cell }\pard\plain
\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs21\lang1033\langfe2052\kerning2\loch\af0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid2113686 \trowd \irow1\irowband1\lastrow \ts15\trgaph108\trleft-108\trbrdrt
\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10
\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid2113686\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2840\clshdrawnil \cellx2732\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2841\clshdrawnil \cellx5573\clvertalt\clbrdrt
\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth2841\clshdrawnil \cellx8414\row }
是不是很復(fù)雜井濒?不過沒關(guān)系灶似,我們通過對其進行分段,并加入適當(dāng)注釋瑞你,你就會對RTF文件中的表結(jié)構(gòu)一目了然酪惭。首先需要聲明的是,RTF1.7規(guī)范中規(guī)定者甲,表行的格式如下:(<tbldef> <cell>+ <tbldef> \row) | (<tbldef> <cell>+ \row) | (<cell>+ <tbldef> \row)春感,目前Word2003采用的方式就是第一種,即“定義+內(nèi)容+重復(fù)定義”过牙,如此一來就會有很大的數(shù)據(jù)冗余甥厦,這就是為什么Word2003的一個簡單文檔都會很大的原因,不過為了兼容性考慮寇钉,這樣處理也是必要的刀疙。其定義也由“行定義+單元格定義”組成,其中單元格定義可用重復(fù)扫倡。
分析代碼如下(紅色):
表格行1
\trowd表行1開始
表格屬性
\trgaph108表中單元格半間距\trleft-108表的最左邊位置
行邊框設(shè)置
\trbrdrt行的上邊框\brdrs單倍厚度\brdrw10線寬
\trbrdrl行的左邊框\brdrs單倍厚度\brdrw10線寬
\trbrdrb行的下邊框\brdrs單倍厚度\brdrw10線寬
\trbrdrr行的右邊框\brdrs單倍厚度\brdrw10線寬
單元格1邊框設(shè)置
\clbrdrt單元格上邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrl單元格左邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrb單元格下邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrr單元格右邊框\brdrw15線寬\brdrs單倍厚度
\cellx2732單元格右邊界
單元格2邊框設(shè)置
\clbrdrt單元格上邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrl單元格左邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrb單元格下邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrr單元格右邊框\brdrw15線寬\brdrs單倍厚度
\cellx5573單元格右邊界
單元格3邊框設(shè)置
\clbrdrt單元格上邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrl單元格左邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrb單元格下邊框\brdrw15線寬\brdrs單倍厚度
\clbrdrr單元格右邊框\brdrw15線寬\brdrs單倍厚度
\cellx8414單元格右邊界
行1數(shù)據(jù)
\pard重置段落屬性\intbl段落是表的一部分\kerning2緊縮字符尺寸\f0字體0\fs21尺寸21
1,1 1,1 \cell表單元格1結(jié)束
1,2 1,2 \cell表單元格2結(jié)束
1,3 1,3 \cell表單元格3結(jié)束
\f1字體1
\row表行1結(jié)束
\f0字體0
表格行2
\trowd表行2開始
\trgaph108表中單元格半間距\trleft-108表的最左邊位置
行邊框設(shè)置
\trbrdrt\brdrs\brdrw10
\trbrdrl\brdrs\brdrw10
\trbrdrb\brdrs\brdrw10
\trbrdrr\brdrs\brdrw10
單元格1邊框設(shè)置
\clbrdrt\brdrw15\brdrs
\clbrdrl\brdrw15\brdrs
\clbrdrb\brdrw15\brdrs
\clbrdrr\brdrw15\brdrs
\cellx2732
單元格2邊框設(shè)置
\clbrdrt\brdrw15\brdrs
\clbrdrl\brdrw15\brdrs
\clbrdrb\brdrw15\brdrs
\clbrdrr\brdrw15\brdrs
\cellx5573
單元格3邊框設(shè)置
\clbrdrt\brdrw15\brdrs
\clbrdrl\brdrw15\brdrs
\clbrdrb\brdrw15\brdrs
\clbrdrr\brdrw15\brdrs
\cellx8414
行2數(shù)據(jù)
\intbl 段落是表的一部分
2,1 2,1\cell表單元格1結(jié)束
2,2 2,2\cell表單元格2結(jié)束
2,3 2,3\cell表單元格3結(jié)束
\f1字體1
\row表行2結(jié)束
至此谦秧,你應(yīng)該對RTF表格輸出有一定認(rèn)識了吧。當(dāng)然在表格中插入圖片撵溃、嵌入表格等的實現(xiàn)方法同理疚鲤,嵌入的圖片可以等同于一段文本來處理,但是嵌套表格的實現(xiàn)可能比較復(fù)雜缘挑,因為它涉及段落文本嵌套層次等高級問題集歇,這里不再詳述,有興趣的讀者可以參考《Rich Text Format (RTF) Specification v1.7》语淘。
七诲宇、小結(jié):RTF文檔基本結(jié)構(gòu)
通過對RTF文件的分析际歼,我們得出一個RTF文件基本結(jié)構(gòu)如下:
RTF文件<File>
文件頭<header>
RTF版本\rtf
字符集<charset>
默認(rèn)字體區(qū)域設(shè)置<deffont>
默認(rèn)字體號\deff?
字體表<fonttbl>
文件表<filetbl>?
顏色表<colortbl>?
樣式表<stylesheet>?
編目表<listtables>?
編目表{ *\listtable }
編目替換表{ *\listoverridetable }
段落組屬性{ *\pgptbl }
跟蹤修訂<revtbl>?
RSID表<rsidtable>?
生成器信息<generator>?
文檔區(qū)<document>
文檔信息區(qū)<info>?
標(biāo)題<title>?
主題<subject>?
作者<author>?
經(jīng)理<manager>?
公司<company>?
最后修改者<operator>?
文檔類別<category>?
關(guān)鍵字<keywords>?
注釋<comment>?
文檔的版本號\version?
Word摘要信息中的注釋<doccomm>?
內(nèi)部版本號\vern?
創(chuàng)建時間<creatim>?
修訂時間<revtim>?
最后打印時間<printim>?
備份時間<buptim>?
總編輯時間(單位:分鐘)\edmins?
頁數(shù)\nofpages?
字?jǐn)?shù)\nofwords?
包含空格的總字符數(shù)\nofchars?
內(nèi)部ID號\id?
文檔格式屬性<docfmt>*
節(jié)文本<section>+
節(jié)格式屬性<secfmt>*
頁眉頁腳設(shè)置<hdrftr>?
段落文本<para>+
文本<textpar>|
項目符號與編號<pn>?
段落邊框<brdrdef>?
段落格式屬性<parfmt>*
定位對象與邊框<apoctl>*
制表位設(shè)置<tabdef>?
段落底紋<shading>?
隱藏與否(/v /spv)?
表格<row>
行開始\trowd
行定義<tbldef>
單元格<cell>+
單元格定義+
單元格內(nèi)容+
重復(fù)行定義<tbldef>
行結(jié)束\row
字符文本<char>+
圖片<pict>
圖片開始{*\shppict {\pict }
圖片屬性
圖片數(shù)據(jù)
對象<obj>
繪圖對象\shp
腳注\footnote
注釋<annot>
域<field>
八、學(xué)以致用:基于對象的RTF文件書寫器設(shè)計
基于對RTF的學(xué)習(xí)運用姑蓝,我通過VB實現(xiàn)了一個RTF輸出工具類鹅心,可以實現(xiàn)文本、圖片纺荧、表格(可以嵌入特殊文本旭愧、圖片和水平、垂直合并)宙暇∈淇荩基于此工具的病歷示范輸出也通過了基本測試。更進一步的研究和完善將在接下來的時間進行客给。
詳細描述如下:
l RTF文檔:
可以添加文本用押、圖片肢簿、表格靶剑,支持頁眉、頁腳池充、頁碼桩引、頁眉對齊方式、頁腳對齊方式收夸、頁碼對齊方式坑匠。
基本方法:
Dim myRTF as New RTFCreator.clsRTFCreator
With myRTF
.PageHead = "頁眉" ‘頁眉
.PageHeadAlign = alm1_左端對齊 ‘頁眉對齊方式
.PageFooter = "時間:" & Format(Now, "YYYY年MM月DD日 HH:nn:ss") ‘頁腳
.PageNumber = True ‘是否顯示頁碼
.PageNumberAlign = alm3_居右對齊 ‘頁碼對齊方式
End With
l 文本:
可以實現(xiàn)粗體、斜體卧惜、前景色(目前為固定顏色表)厘灼、字體大小、字體樣式(目前為固定樣式)咽瓷、字符樣式(目前為固定樣式)设凹、動畫、水平縮放茅姜、雕刻闪朱、浮雕、字符間距钻洒、邊框奋姿、陰影、刪除線素标、雙刪除線称诗、下標(biāo)、上標(biāo)头遭、下劃線(17種)寓免、下劃線顏色退腥、隱藏文本、WEB下隱藏再榄、字符邊框(陰文)狡刘、字符陰影(陽文)、底紋背景色困鸥、底紋前景色嗅蔬、底紋樣式(12種)、高亮顯示疾就、高亮顏色澜术、對齊方式、項目符號等猬腰。
基本方法:
.AddText ‘添加文本鸟废,也可用.AddText “文本內(nèi)容”,或者通過i=.AddText(“AAA”)返回索引值I,然后通過myRTF.Texts(i).Bold=True來設(shè)置屬性姑荷。
.LastText.Bold = True ‘粗體設(shè)置
.LastText.FontStyle = ft1_標(biāo)題1 ‘字體尺寸設(shè)置
.LastText = "文本" & vbCrLf ‘文本設(shè)置盒延,如果需要回車,直接添加vbCrLf到文本中適當(dāng)位置
.LastText.Alignment = alm2_居中對齊 ‘對齊方式
…其他設(shè)置
l 圖片:
可以插入JPEG鼠冕、GIF等圖片添寺,已經(jīng)對輸出速度進行了優(yōu)化⌒阜眩可以設(shè)置圖片對齊方式计露、文件名、大小憎乙、縮放比例票罐、是否單獨一行等。
使用方法:
.AddPicture (CommonDialog2.FileName) ‘文件名
.LastPicture.AddCRLF = True ‘獨立一行
.LastPicture….其他設(shè)置(如對圖像尺寸的設(shè)置)
l 表格:
可以設(shè)置單元格水平對齊泞边、垂直對齊该押、上下左右邊框是否存在、是否包含內(nèi)部斜線(左上繁堡、左下)沈善、邊框樣式(支持28種邊框)、邊框顏色椭蹄、底紋類型闻牡、底紋背景色、底紋前景色绳矩、底紋明暗百分比罩润、單元格寬度單位、單元格首選寬度翼馆、單元格右邊界割以、是否是水平合并的首單元格金度、是否與前一單元水平合并、是否是垂直合并的首單元格严沥、是否與前一定義垂直合并猜极、行數(shù)、列數(shù)消玄、文本適應(yīng)單元格跟伏、不允許文本換行、是否嵌套翩瓜、數(shù)據(jù)類型(目前支持簡單文本受扳、高級文本、圖片三種類型兔跌,嵌套表格暫時不支持)勘高。
使用方法:
myRTF.Addtable
With myRTF.LastTable
.Alignment = ral2_居中對齊
.AddRow '插入第1行
.LastRow.AddCell '第1行,第1列(該單元格為簡單文本坟桅、默認(rèn))
.LastRow.BorderStyle = cbs03_雙倍厚度邊框
.LastRow.BorderColor = clr02_藍色
.LastRow.BorderWidth = 75
.LastRow.AddCell '第1行华望,第2列(該單元格為高級文本,需要賦值)
Dim rtfTxt1 As cRTFText
Set rtfTxt1 = New cRTFText
.LastCell.DataType = cct1_高級文本
rtfTxt1.Bold = True
rtfTxt1.Text = "第(1,2)單元格內(nèi)容:高級文本"
rtfTxt1.ForeColor = clr06_大紅
rtfTxt1.FontSize = fs09_四號
Set .LastCell = rtfTxt1
.LastCell.MergeStart = True
.LastCell.BorderStyle = cbs25_雙波浪線邊框
.LastCell.BorderWidth = 75
.LastCell.BorderColor = clr10_深青
…其他設(shè)置
l 對象模型:
RTFCreator
RTFTexts
RTFText
RTFPictures
RTFPicture
RTFTables
RTFTables
RTFRows
RTFRow
RTFCells
RTFCell
RTFNodes
RTFNode