SAS:出RTF文件時在標(biāo)題行添加下劃線

有一句語句:

~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文件格式進(jìn)行分析研究,對RTF文件結(jié)構(gòu)及特性進(jìn)行了闡述,并分別列舉了幾個實用性的例子進(jìn)行詳細(xì)分析,
最終通過VB程序代碼實現(xiàn)了一個RTF書寫器(不具有所見即所得特性)。本文對軟件開發(fā)人員及RTF文件格式感興趣的人員具有參考價值。

關(guān)鍵字:RTF、Rich Text Format、Office、文件格式。

一、引言

富文本格式(RTF)規(guī)范是為了便于在應(yīng)用程序之間輕松轉(zhuǎn)儲格式化文本和圖形的一種編碼方法?,F(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文件沒有限制文件的行的最大長度??刂谱质荝TF用來標(biāo)記打印控制符和管理文檔信息的一種特殊格式的命令。一個控制字最長32個字符??刂谱值氖褂酶袷饺缦?

\字母序列<分隔符>

注意:每個控制字均以一個反斜杠\開頭。字母序列由a~z 的小寫字母組成??刂谱郑ɑ蛘叻Q為關(guān)鍵字)通常應(yīng)該不包含任何大寫字母。

分隔符標(biāo)記RTF控制字的結(jié)束, 可以是下列各項之一:

· 一個空格,這時空格是控制字的一部份。

· 一個數(shù)字或連字符(-), 表示跟隨的一個數(shù)值參數(shù)。該數(shù)字序列的長度由其后的一個空格或除了字母和數(shù)字的其他字符劃定。這個參數(shù)可以是正數(shù)或者負(fù)數(shù),它的取值范圍通常是從-32767到32767。

· 任何非字母和數(shù)字的其他字符。這種情況下,此分隔字符結(jié)束控制字,而它并不屬于控制字的一部分。

控制符由一個反斜線\跟隨單個非字母字符組成。例如,~代表一個不換行空格。控制符不需要分隔符。

組由包括在({})中的文本、控制字或控制符組成。左擴(kuò)符({)表示組的開始,右擴(kuò)符(})表示組的結(jié)束。每個組包括文本和文本的不同屬性。RTF文件也能同時包括字體、格式、屏幕顏色、圖形、腳注、注釋(注解)、文件頭和文件尾、摘要信息、域和書簽的組合,以及文檔、區(qū)段、段落和字符的格式屬性。如果包括字體、文件、格式、屏幕顏色、校訂標(biāo)記,以及摘要信息組、文檔格式屬性,則他們一定要在文件的第一純文本字符之前,這些組形成RTF的文件頭。如果包括字體組,則它應(yīng)該在格式組之前。如果組未使用,可以省略。

對于RTF文件的詳細(xì)語法及關(guān)鍵字說明請參閱《Rich Text Format (RTF) Specification v1.7》,這里不作更詳細(xì)的說明。

三、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串(包括英文一起)
'先將特殊字符進(jìn)行轉(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
四、文字的更高級表示
掌握了基本文字表述方法后,你一定會試著進(jìn)一步探索文本更高級的表示方法,如下劃線、顏色、粗體、斜體等等,而這些在V1.7規(guī)范中都作了詳細(xì)描述,本文只列出部分常用關(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)藍(lán)色的文字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 文本縮進(jìn)語法如下:
控制字
涵義
\fiN
首行縮進(jìn)(默認(rèn)為0)。
\cufiN
采用字符單位的百分比的首行縮進(jìn)值,用以覆蓋\fiN的設(shè)置,雖然它們可以設(shè)為相同值。
\liN
左端縮進(jìn)(默認(rèn)為0)。
\linN
從左至右段落的左端縮進(jìn)值;如果在從右至左段落則表示右端縮進(jìn)值(默認(rèn)為0)。\linN定義了段前空格數(shù)。
\culiN
采用字符單位的百分比的左端縮進(jìn)值,與\linN一樣,它用以覆蓋\liN和\linN的設(shè)置,雖然它們可以設(shè)為相同值。
\riN
右縮進(jìn)(默認(rèn)為0)。
\rinN
從左至右段落的右端縮進(jìn)值;如果在從右至左段落則表示左端縮進(jìn)值(默認(rèn)為0)。\rinN定義了段前空格數(shù)。
\curiN
采用字符單位的百分比的右端縮進(jìn)值,與\rinN一樣,它用以覆蓋\riN和\rinN的設(shè)置,雖然它們可以設(shè)為相同值。
\adjustright
當(dāng)文檔網(wǎng)格被定義時自動調(diào)整右縮進(jìn)。
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是一個負(fù)值,即使在其小于行間字符最高值時,總是使用N的絕對值。
\slmultN
多倍行間距。指出當(dāng)前行間距是單倍行距的倍數(shù)。該控制字只能跟在\sl后,聯(lián)合作用。
0 “最小”或者是“精確”的行距
1 多倍行距,相對于“單倍”行距。
\nosnaplinegrid
取消對齊網(wǎng)格線。
因為篇幅限制,更詳細(xì)的文本格式分析請參閱附件里的文本示例分析原文。
五、圖片的表示方式
摸清RTF中圖片的表示頗費(fèi)了一番周折,下面的分析希望能夠加速你的學(xué)習(xí)進(jìn)程。一個RTF圖片數(shù)據(jù)通常直接嵌入文件中,這些圖象可以是16進(jìn)制(默認(rèn)的)或2進(jìn)制格式。圖象屬于目標(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進(jìn)制數(shù)據(jù):
ffd8ffe000104a46494600010101004800480000ffdb0043000604040405040605050609060506090b080606080b0c0a0a0b0a0a0c100c0c0c0c0c0c100c0e0f}16進(jìn)制圖片數(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進(jìn)制數(shù)據(jù):
0100090000034660000000002160000000000400000003010800050000000b0200000000050000000c02ac00ac00030000001e00040000000701040021600000
}MetaFile類型16進(jìn)制圖片數(shù)據(jù)結(jié)束
}
為了簡化分析,我們除去所以可以省略的內(nèi)容,則一副圖片可以這樣表示:
{*\shppict{\pict piccropl0\piccropr0\piccropt0\piccropb0\picw寬度\pich高度\picwgoal顯示寬度\pichgoal顯示高度\jpegblipJPEG類型\bliptag-728883813ID值(為一個負(fù)的長整形值)
下面是該圖片的實際16進(jìn)制數(shù)據(jù):
ffd8ffe0001… …}}
如果需要通過程序獲取指定圖片合法的16進(jìn)制字符串,可以采用如下的VB函數(shù):
Public Function PicToASC(ByVal strFileName As String) As String
'獲取圖片16進(jìn)制數(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ìn)行了分析,相信你已經(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)系,我們通過對其進(jì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í)運(yùn)用,我通過VB實現(xiàn)了一個RTF輸出工具類,可以實現(xiàn)文本、圖片、表格(可以嵌入特殊文本、圖片和水平、垂直合并)?;诖斯ぞ叩牟v示范輸出也通過了基本測試。更進(jìn)一步的研究和完善將在接下來的時間進(jìn)行。
詳細(xì)描述如下:
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)對輸出速度進(jìn)行了優(yōu)化。可以設(shè)置圖片對齊方式、文件名、大小、縮放比例、是否單獨(dú)一行等。
使用方法:
.AddPicture (CommonDialog2.FileName) ‘文件名
.LastPicture.AddCRLF = True ‘獨(dú)立一行
.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_藍(lán)色
.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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自鏈接 目錄 1.認(rèn)識NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內(nèi)容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 11,160評論 1 3
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁的形式展示給用戶的,因此網(wǎng)頁是網(wǎng)絡(luò)信息傳遞的載體。網(wǎng)頁文件是用...
    阿啊阿吖丁閱讀 4,955評論 0 0
  • 一,HTML語言的一般語法: 1,圍堵標(biāo)記:<>… 1)帶屬性的標(biāo)記: … 2)無屬性的標(biāo)記:加粗 居中 標(biāo)題 2...
    清水易藍(lán)閱讀 1,374評論 0 2
  • HTML標(biāo)簽解釋大全 一、HTML標(biāo)記 標(biāo)簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,531評論 1 41
  • 1、窗體 1、常用屬性 (1)Name屬性:用來獲取或設(shè)置窗體的名稱,在應(yīng)用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調(diào)閱讀 4,784評論 0 11

友情鏈接更多精彩內(nèi)容