設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

Access輸出資料到Word用于打印

1970-1-1 08:00| 發(fā)布者: cg1/wtm| 查看: 4298| 評論: 0

兩種輸出方法隨便選:

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中,如表格的復雜程度、頁面視圖、對象的使用,等等。 

 

最新評論

相關(guān)分類

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 08:24 , Processed in 0.456302 second(s), 16 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部