兩種輸出方法隨便選:
Function export_word_use_range()
'請先引用 word Dim objWord As New Word.Application Dim ragRange As Range Dim Ils1 As InlineShape objWord.Documents.add objWord.WindowState = wdWindowStateMaximize objWord.Visible = True objWord.ActiveDocument.PageSetup.LeftMargin = 30 objWord.ActiveDocument.PageSetup.RightMargin = 30
Set ragRange = objWord.ActiveDocument.Paragraphs.add.Range ragRange.InsertBefore "標題" ragRange.Font.Bold = True ragRange.Font.Size = 22 ragRange.ParagraphFormat.Alignment = wdAlignParagraphCenter '引用ado Dim Rs As New ADODB.Recordset Rs.Open "select * from temp order by 課程名稱,類型名稱,臨時編號", CurrentProject.Connection, 1, 1 If Rs.EOF And Rs.BOF Then MsgBox "沒有任何記錄" Exit Function End If Set ragRange = Nothing
Dim strType As String Dim lngNO As Long Dim lngTopicNo As Long LoadTopicNo Do Until Rs.EOF If strType <> Rs("類型名稱") Then lngTopicNo = lngTopicNo + 1 Set ragRange = objWord.ActiveDocument.Paragraphs.add.Range
ragRange.InsertBefore strTopicNo(lngTopicNo) & "、" & Rs("類型名稱") & ":" ragRange.InsertBefore vbCrLf ragRange.Bold = True ragRange.Font.Size = 15 strType = Rs("類型名稱") lngNO = 0 End If lngNO = lngNO + 1 Set ragRange = objWord.ActiveDocument.Paragraphs.add.Range ragRange.InsertBefore Str(lngNO) & ". " & Nz(Rs("試題內(nèi)容"), "") ragRange.Bold = False ragRange.Font.Size = 10
If Len(Nz(Rs("圖形"), "")) > 0 Then Set Ils1 = objWord.ActiveDocument.InlineShapes.AddPicture(filename:= _ Rs("圖形"), _ LinkTofile:=False, SaveWithDocument:=True) End If
Set ragRange = objWord.ActiveDocument.Paragraphs.add.Range ragRange.InsertBefore Chr(9) & "第 " & Str(lngNO) & ". 題答案: " & Nz(Rs("試題答案"), "") ragRange.Bold = False ragRange.Font.Size = 10 ragRange.Font.Color = wdColorLightBlue Rs.MoveNext Loop Rs.Close Set ragRange = objWord.ActiveDocument.Paragraphs.add.Range ragRange.InsertAfter "試卷生成日期:" & FormatDateTime(Now, vbLongDate) & " " & FormatDateTime(Now, vbLongTime) ragRange.Font.Bold = False ragRange.Font.Size = 10 ragRange.ParagraphFormat.Alignment = wdAlignParagraphRight
End Function |
Function export_word_use_selection()
'請先引用 word Dim objWord As New Word.Application Dim Slt1 As Selection Dim Ils1 As InlineShape objWord.Documents.add objWord.WindowState = wdWindowStateMaximize objWord.Visible = True objWord.ActiveDocument.PageSetup.LeftMargin = 30 objWord.ActiveDocument.PageSetup.RightMargin = 30
Set Slt1 = objWord.ActiveWindow.Selection Slt1.Font.Size = 22 Slt1.Font.Bold = True Slt1.ParagraphFormat.Alignment = wdAlignParagraphCenter Slt1.InsertBefore "標題" & vbCrLf Slt1.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove
'引用ado Dim Rs As New ADODB.Recordset Rs.Open "select * from temp order by 課程名稱,類型名稱,臨時編號", CurrentProject.Connection, 1, 1 If Rs.EOF And Rs.BOF Then MsgBox "沒有任何記錄" Exit Function End If
Dim strType As String Dim lngNO As Long Dim lngTopicNo As Long LoadTopicNo Do Until Rs.EOF If strType <> Rs("類型名稱") Then lngTopicNo = lngTopicNo + 1 Slt1.Font.Bold = True Slt1.Font.Size = 15 Slt1.ParagraphFormat.Alignment = wdAlignParagraphThaiJustify Slt1.InsertBefore strTopicNo(lngTopicNo) & "、" & Rs("類型名稱") & ":" & vbCrLf Slt1.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove strType = Rs("類型名稱") lngNO = 0 End If lngNO = lngNO + 1 Slt1.Font.Bold = False Slt1.Font.Size = 10 Slt1.InsertBefore Chr(9) & Str(lngNO) & ". " & Nz(Rs("試題內(nèi)容"), "") & vbCrLf Slt1.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove If Len(Nz(Rs("圖形"), "")) > 0 Then Slt1.InlineShapes.AddPicture filename:=Rs("圖形"), LinkTofile:=False, SaveWithDocument:=True Slt1.InsertBefore vbCrLf Slt1.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove End If Slt1.Font.Bold = False Slt1.Font.Size = 10 Slt1.Font.Color = wdColorLightBlue Slt1.InsertBefore Chr(9) & Chr(9) & "第 " & Str(lngNO) & ". 題答案: " & Nz(Rs("試題答案"), "") & vbCrLf Slt1.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdMove Slt1.Font.Color = wdColorAutomatic Rs.MoveNext Loop Rs.Close Slt1.InsertBefore vbCrLf Slt1.InsertBefore vbCrLf Slt1.InsertAfter "試卷生成日期:" & FormatDateTime(Now, vbLongDate) & " " & FormatDateTime(Now, vbLongTime) Slt1.Font.Bold = False Slt1.Font.Size = 10 Slt1.ParagraphFormat.Alignment = wdAlignParagraphRight
End Function |
轉(zhuǎn)自Aaccess911
還有一個例子,比較詳細:
在Access中應(yīng)用ADO將數(shù)據(jù)輸出到Word 1. 系統(tǒng)配置 系統(tǒng)軟件:Microsoft Windows 9x/NT/2000;Microsoft Access 2000;Microsoft Word 2000。 樣例數(shù)據(jù)庫:“C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb”,Office 2000中包含的例子。可將其中的“產(chǎn)品”表復制到一個新的數(shù)據(jù)庫中,如“D:\db1.mdb”。 窗 體:在數(shù)據(jù)庫“D:\db1.mdb”中新建窗體“窗體1”,其中只包含1個命令按鈕“命令0”。 引用ADO:按Alt+F11進入Visual Basic編輯器,執(zhí)行“工具”->“引用”命令,在彈出的引用窗體中選擇“Microsoft ActiveX Data Objects 2.1”或更高版本。 引用Word:再次執(zhí)行命令“工具”->“引用”,在彈出的引用窗體中選擇“Microsoft Word 9.0 Object Library”。 2. 代碼詳解 在“窗體1”的設(shè)計模式下右鍵單擊“命令0”按鈕,選擇“事件生成器”,進入Visual Basic編輯器,創(chuàng)建過程“Private Sub 命令0_Click()”,其代碼如下:
Sub 命令0_Click() '輸入表格標題 Title = InputBox(vbCrLf & vbCrLf & "請輸入表格標題:", "表格標題", "XX公司產(chǎn)品報價單") If Title = "" Then Title = "XX公司產(chǎn)品報價單" '步驟1:建立數(shù)據(jù)連接cnn '由于數(shù)據(jù)庫已經(jīng)打開,所以直接應(yīng)用CurrentProject.Connection就可以建立連接 Set cnn = New ADODB.Connection Set cnn = CurrentProject.Connection '步驟2:用SQL語句創(chuàng)建記錄集rs Set rs = New ADODB.Recordset '設(shè)定游標類型與鎖定類型 rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic '制定特定的查詢條件,可以是任何有效的SQL查詢,甚至包括多表、多條件等復雜的查詢,查詢條件也常常從窗體取得 SQL = "select 產(chǎn)品名稱,單位數(shù)量,單價,庫存量 from 產(chǎn)品 where 單價>10.00" '創(chuàng)建記錄集rs rs.Open SQL, cnn '統(tǒng)計字段數(shù)及記錄數(shù) total_fields = rs.Fields.Count total_records = rs.RecordCount '步驟3:建立Word文檔對象 Set mywdapp = CreateObject("word.application") '調(diào)整Word窗口大小 mywdapp.WindowState = wdWindowStateNormal '生成新的Word文檔實例 mywdapp.Documents.Add '設(shè)置視圖為頁面視圖 mywdapp.ActiveWindow.View.Type = wdPrintView '轉(zhuǎn)到Word視圖,顯示文檔生成過程 mywdapp.Visible = True mywdapp.Activate '設(shè)置文檔(表格)字體 mywdapp.ActiveDocument.Range.Font.Size = "9" '步驟4:將記錄集rs中的字段名稱和字段內(nèi)容輸出到Word,各字段之間用制表符分隔 '輸出字段名稱 For I = 0 To total_fields - 2 mywdapp.Selection.TypeText Text:=rs.Fields(I).Name & vbTab Next I '最后一個字段名稱后加回車符 mywdapp.Selection.TypeText Text:=rs.Fields(total_fields - 1).Name & vbCrLf '逐條輸出字段內(nèi)容 Do While Not rs.EOF For I = 0 To total_fields - 2 tmpstr = rs.Fields(I).value If rs.Fields(I).Name = "單價" Then tmpstr = Format(tmpstr, "####.00") End If mywdapp.Selection.TypeText Text:=tmpstr & vbTab Next I '一條記錄的最后一個字段后加回車符 mywdapp.Selection.TypeText Text:=rs.Fields(total_fields - 1).value & vbCrLf rs.MoveNext Loop '步驟5:關(guān)閉記錄集 rs.Close Set rs = Nothing '步驟6:對Word中的數(shù)據(jù)進行格式化處理 '選定文本,將其轉(zhuǎn)換為表格 '設(shè)置視圖為普通視圖 mywdapp.ActiveWindow.View.Type = wdNormalView '將光標移動到文檔末尾 mywdapp.Selection.EndKey Unit:=wdStory '刪除文檔末尾多余的回車符 mywdapp.Selection.Delete Unit:=wdCharacter, Count:=1 '選中全部內(nèi)容 mywdapp.Selection.WholeStory '將所選內(nèi)容轉(zhuǎn)換為表格 mywdapp.Selection.ConvertToTable Separator:=wdSeparateByTabs, DefaultTableBehavior:=wdWord8TableBehavior '將光標移動到文檔開頭 mywdapp.Selection.HomeKey Unit:=wdStory '選定表格對象 Set Temp_Table = mywdapp.ActiveDocument.Tables(1) '根據(jù)需要對表格進行處理,這是制作表格格式的關(guān)鍵,可反復調(diào)試 '本例只簡單地設(shè)置了表格居中、自動調(diào)整表格列寬、表頭居中、標題行重復、設(shè)置表格邊框線、設(shè)置表格縱向居中 Temp_Table.Rows.Alignment = wdAlignRowCenter Temp_Table.AutoFitBehavior wdAutoFitContent Temp_Table.Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter Temp_Table.Rows(1).Range.Rows.HeadingFormat = wdToggle Temp_Table.Borders(wdBorderLeft).LineWidth = wdLineWidth150pt Temp_Table.Borders(wdBorderRight).LineWidth = wdLineWidth150pt Temp_Table.Borders(wdBorderTop).LineWidth = wdLineWidth150pt Temp_Table.Borders(wdBorderBottom).LineWidth = wdLineWidth150pt Temp_Table.Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter '將光標移動到文檔開頭 mywdapp.Selection.HomeKey Unit:=wdStory '拆分表格 mywdapp.Selection.SplitTable mywdapp.Selection.Font.Name = "黑體" '插入標題 mywdapp.Selection.TypeText Text:=Title & vbCrLf mywdapp.Application.ScreenRefresh '刷屏 '轉(zhuǎn)到Acdess視圖,顯示結(jié)束對話框 mywdapp.Visible = False Msg = "數(shù)據(jù)提取完畢。" & vbCrLf & vbCrLf Msg = Msg & "總記錄數(shù)=" & total_records & " 條" MsgBox Msg, vbOKOnly, "數(shù)據(jù)提取完畢" '轉(zhuǎn)到Word視圖,顯示文檔 mywdapp.Visible = True mywdapp.Activate End Sub | 三、在Word中應(yīng)用ADO直接提取Access數(shù)據(jù)庫中的數(shù)據(jù) 1. 系統(tǒng)配置 系統(tǒng)軟件: Microsoft Windows 9x/NT/2000;Microsoft Word 2000。 樣例數(shù)據(jù)庫:“C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb”,Office 2000中包含的例子。 引用ADO:按Alt+F11進入Visual Basic編輯器,執(zhí)行命令“工具”->“引用”,在彈出的引用窗體中選擇“Microsoft ActiveX Data Objects 2.1”或更高版本。 2. 代碼詳解 進入Visual Basic編輯器,創(chuàng)建過程“Sub Word_ADO()”,其代碼如下:
Sub Word_ADO() '輸入表格標題 Title = InputBox(vbCrLf & vbCrLf & "請輸入表格標題:", "表格標題", "XX公司產(chǎn)品報價單") If Title = "" Then Title = "XX公司產(chǎn)品報價單" '步驟1:建立數(shù)據(jù)連接cnn '打開連接,示例數(shù)據(jù)庫:C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb Set cnn = New ADODB.Connection cnn.Provider = "Microsoft.jet.oledb.4.0" cnn.Open "C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb" '步驟2:用SQL語句創(chuàng)建記錄集rs Set rs = New ADODB.Recordset rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic SQL = "select 產(chǎn)品名稱,單位數(shù)量,單價,庫存量 from 產(chǎn)品 where 單價>10.00" rs.Open SQL, cnn total_fields = rs.Fields.Count total_records = rs.RecordCount ActiveDocument.Range.Font.Size = "9" '步驟3:將記錄集rs中的字段名稱和字段內(nèi)容輸出到Word文檔,各字段之間用制表符分隔 For I = 0 To total_fields - 2 Selection.TypeText Text:=rs.Fields(I).Name & vbTab Next I Selection.TypeText Text:=rs.Fields(total_fields - 1).Name & vbCrLf Do While Not rs.EOF For I = 0 To total_fields - 2 tmpstr = rs.Fields(I).value If rs.Fields(I).Name = "單價" Then tmpstr = Format(tmpstr, "####.00") End If Selection.TypeText Text:=tmpstr & vbTab Next I Selection.TypeText Text:=rs.Fields(total_fields - 1).value & vbCrLf rs.MoveNext Loop '步驟4:關(guān)閉記錄集和連接 rs.Close cnn.Close Set rs = Nothing Set cnn = Nothing '步驟5:對Word中的數(shù)據(jù)進行格式化處理 ActiveWindow.View.Type = wdNormalView Selection.EndKey Unit:=wdStory Selection.Delete Unit:=wdCharacter, Count:=1 Selection.WholeStory Selection.ConvertToTable Separator:=wdSeparateByTabs, DefaultTableBehavior:=wdWord8TableBehavior Selection.HomeKey Unit:=wdStory Set Temp_Table = ActiveDocument.Tables(1) Temp_Table.Rows.Alignment = wdAlignRowCenter Temp_Table.AutoFitBehavior wdAutoFitContent Temp_Table.Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter Temp_Table.Rows(1).Range.Rows.HeadingFormat = wdToggle Temp_Table.Borders(wdBorderLeft).LineWidth = wdLineWidth150pt Temp_Table.Borders(wdBorderRight).LineWidth = wdLineWidth150pt Temp_Table.Borders(wdBorderTop).LineWidth = wdLineWidth150pt Temp_Table.Borders(wdBorderBottom).LineWidth = wdLineWidth150pt Temp_Table.Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter Selection.HomeKey Unit:=wdStory Selection.SplitTable Selection.Font.Name = "黑體" Selection.TypeText Text:=Title & vbCrLf Application.ScreenRefresh Msg = "數(shù)據(jù)提取完畢。" & vbCrLf & vbCrLf Msg = Msg & "總記錄數(shù)=" & total_records & " 條" MsgBox Msg, vbOKOnly, "數(shù)據(jù)提取完畢" End Sub | 四、兩種方法的比較 1. 適用性 上述兩種方法都可以滿足我們制作特殊報表的要求,但筆者認為Access+ADO+Word更適合于進行多表的復雜查詢,編制的東西也更有“程序味”,若既要求錄入數(shù)據(jù)又要求輸出特殊報表,可采用該方法;而Word+ADO非常適合于處理表格形式固定的報表,不負責數(shù)據(jù)錄入,只要求輸出報表的情況。 2. 復雜性 在程序的編寫上,這兩種方法也有一些小的差別:前者比后者略微復雜些,在對一些特殊命令的處理上兩者也有一些不同。 3. 對報表格式的控制 由于Word本身就是個字處理軟件,所以它對文檔的控制也就比Access對文檔的控制更容易、更靈活,若對表格要求很高,采用后者會更加有效。 4. 處理速度 兩者的處理速度基本相當。上述兩段程序采用的都是先輸出數(shù)據(jù),再將其轉(zhuǎn)換為表格的方法,這樣處理主要是基于速度上的考慮,特別是對于幾百條乃至上千條的記錄,其處理速度是比較快的。另外,也可以直接向文檔中輸出表格,再逐行增加表格或逐單元格地填寫數(shù)據(jù),但對于大的報表來講,其速度將大打折扣。影響處理速度的因素是多方面的,主要瓶頸是在Word中,如表格的復雜程度、頁面視圖、對象的使用,等等。
|