摘要:該文介紹了將Access數據庫中的圖文混編內容導出到Word文檔的方法,并給出了用Visual Basic 6.0實現的程序實例。
關鍵詞:Access Database;圖像;導出;Word Document
中圖分類號:TP317文獻標識碼:A文章編號:1009-3044(2009)33-9121-02
Exporting the Method of Graphic Information on the Access Database to Word Document
CHE Guang-hong
(School of Information Engineering, Anhui University of Finance Economics, Hefei 233041, China)
Abstract: Introduced a method of the contents of the graphic mixed on Access database exported to Word documents,and gives Example program using Visual Basic 6.0.
Key words: Access Database; graphic; export; word document
1 問題的提出
最近,在工作中遇到了這樣一個問題:需要將Access數據庫的一些表中的內容導出到Word文檔,但這些表中有備注型字段,其中存放著圖文混編的信息。
麻煩的是簡體中文版OfficeXP和Office2003中的Access都沒有提供直接將這種類型字段的數據按原格式導出到Word(或RTF格式)文檔的功能(更高版本的Office有無此種功能?)。使用Access的導出功能將表導出為RTF文件時,所有備注型字段的內容均呈現為“亂碼”。例如,圖1所示的就是某表導出到RTF格式文件的情況,其中前三列為文本型字段的內容,是正確的;而第四列是備注型字段的內容,為“亂碼”。
為了解決這個問題,在網上搜索了好幾天,但始終沒有找到現成的方法。無奈之下只好自己動手了。還好,經過苦苦摸索,終于找到了解決問題的方法。該方法雖非完美,但確實能夠解決上述問題。所以還是將其寫出來,供有上述需求但還沒有找到更好的解決方法的讀者參考。
2 解決方法
為了找到解決問題的途徑,我們先來揭開這些“亂碼”的面紗。使用過Visual Basic編寫數據庫應用程序的人都知道,存放于Access數據庫表中備注字段中的圖文混編的內容可以正確地顯示于RichTextBox控件中,而RichTextBox控件的內容是可以保存為RTF格式的文件的。所以,圖1中那些看似“亂碼”的內容其實一點也不亂,它們是相應字段內容在RTF格式文件中的編碼。例如,圖1右邊單元格的完整內容如下:
{\\rtf1\\ansi\\ansicpg936\\deff0{\\fonttbl{\\f0\\fnil\\fcharset134 \\'cb\\'ce\\'cc\\'e5;}}
\\viewkind4\\uc1\\pard\\lang2052\\f0\\fs18
\\par\\'ce\\'aa\\'bd\\'e2\\'be\\'f6\\'c4\\'b3\\'b8\\'f6\\'ca\\'b5\\'bc\\'ca\\'ce\\'ca\\'cc\\'e2\\'b6\\'f8\\'b1\\'e0\\'c5\\'c5\\'b5\\'c4\\'d6\\'b8\\'c1\\'ee\\'d0\\'f2\\'c1\\'d0\\'b3\\'c6\\'d6\\'ae\\'ce\\'aa()\\'a1\\'a3
\\par A.\\'d6\\'b8\\'c1\\'ee
\\par B.\\'b9\\'fd\\'b3\\'cc
\\par C.\\'b3\\'cc\\'d0\\'f2
\\par D.\\'ba\\'af\\'ca\\'fd
\\par }
如果將上面內容存放到一個文本文件中,然后將文本文件的擴展名改為.RTF,再用Word打開時,我們就會看到其本來面目,原來是一道單項選擇題:
明白了這個道理,也就有了解決問題基本思路:設法將Access數據庫表(含有備注字段)中的所有記錄的內容按原順序放入一個RichTextBox控件中,然后將RichTextBox控件中的內容寫入一個RTF文件,最后用Word打開該RTF文件,將其另存為Word文檔即可。
將表中所有記錄的內容按原順序放入一個RichTextBox控件中的處理過程如下(假設rsTm為記錄集,rtfT為RichTextBox控件):
rtfT.TextRTF = \"\"
Do While Not rsTm.EOF
rtfT.SelRTF = rsTm.Fields(0).Value '第一字段值
rtfT.SelRTF = \" \" '字段值之間加以空格
rtfT.SelRTF = rsTm.Fields(1).Value '第二字段值
rtfT.SelRTF = \" \" '字段值之間加以空格
' ......
rtfT.SelRTF = rsTm.Fields(n-1).Value '第n字段值
rtfT.SelRTF = vbCrLf '每個記錄后換一行
rsTm.MoveNext
Loop
3 程序實現
假設有一個名為Test.mdb的Access數據庫,其中有一個含有4個字段(含有備注型字段)的表t1,現在我們用VB 6.0編寫一個成程序,來將表t1中的內容導出到一個名為Test.rtf的RTF格式文件中。實現方法如下:
程序界面如圖2所示。
只需一個RichTextBox控件(名稱屬性設置為rtfT)和一個命令按鈕控件。
需要編寫下列代碼:
1)在窗體的“通用-聲明”部分定義用于連接數據庫的變量:
Dim connTk As New ADODB.Connection
Dim rsTm As New ADODB.Recordset
2)在窗體的Load事件中連接數據庫:
Private Sub Form_Load()
Dim strSQL As String
strSQL = \"Provider=MSDASQL.1;Extended Properties=DBQ=\" _
App.Path \"\est.MDB;DefaultDir=\" App.Path _
\";Driver={Microsoft Access Driver (*.mdb)}\"
connTk.ConnectionString = strSQL
connTk.Open strSQL, \"\", \"\"
End Sub
3)在窗體的Unload事件中取消數據庫的連接:
Private Sub Form_Unload(Cancel As Integer)
If rsTm.State = adStateOpen Then rsTm.Close
Set rsTm = Nothing
connTk.Close
Set connTk = Nothing
End Sub
4)在命令按鈕的Click事件中完成導出功能:
Private Sub Command1_Click()
Dim strSQL As String
' 將表t1的內容提取到記錄集rsTm
strSQL = \"select * from t1\"
If rsTm.State = adStateOpen Then rsTm.Close
rsTm.CursorLocation = adUseClient
rsTm.Open strSQL, connTk, adOpenDynamic, adLockOptimistic
DoEvents
' 將記錄集rsTm的全部記錄放到RichTextBox控件rtfT中
' --------------------------------
rtfT.TextRTF = \"\"
Do While Not rsTm.EOF
rtfT.SelRTF = rsTm.Fields(0).Value 'ID字段值
rtfT.SelRTF = \" \" '字段值之間加以空格
rtfT.SelRTF = rsTm.Fields(1).Value 'th字段值
rtfT.SelRTF = \" \" '字段值之間加以空格
rtfT.SelRTF = rsTm.Fields(2).Value 'da字段值
rtfT.SelRTF = \" \" '字段值之間加以空格
rtfT.SelRTF = rsTm.Fields(3).Value 'tm字段值(備注型)
rtfT.SelRTF = vbCrLf '每個記錄后換一行
rsTm.MoveNext
Loop
' 將rtfT中的內容寫入到名為test.rtf的RTF文件
rtfT.SaveFile App.Path \"\est.rtf\"
' --------------------------------
End Sub
4 結束語
本方法是先將表中的全部記錄都拼接到一起放在一個RichTextBox控件中,然后才輸出到文件的,因此當表中記錄太多時,可能會需要運行較長時間,令人不安。為了解決這個問題,可以將程序進行如下優化:
將RichTextBox控件rtfT的Visible屬性設置為False,不讓其顯示,這樣速度可以提高一些。
參考文獻:
[1] Petroutsos E,Hough K.Visual Basic 6 高級開發指南[M].邱仲潘,譯.北京:電子工業出版社,1999.
[2] 東名,吳名月.Access 2002數據庫管理務實[M].北京:人民郵電出版社,2002.