首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

Access導出Execl解决方案

2012-01-30 
Access導出ExeclVB+Access做的系統,為方便查閱與打印,需導出為execl表格,help。環境:Access表是Access 2000

Access導出Execl
VB+Access做的系統,
為方便查閱與打印,
需導出為execl表格,
help。
環境:Access表是Access 2000;


[解决办法]
窗体代码

VB code
Private Sub outcstinf_Click() '导出资料为XLS    Dim i As Integer '行     Dim j As Integer '列    Call openXLT("Custom.xlt")'Custom.xlt是一个与要导出的数据表格式相同的excel模板文件    Call OpenConn        sql = "select * from 要导出的表 ORDER BY 用于排序的字段(一般是编号) ASC"        rs.Open sql, cn, 1, 1        If rs.RecordCount < 1 Then            MsgBox "数据库中没有记录!": Exit Sub        Else            i = 2'从xls的第二行开始写入(模板中第一行已作为字段名保留)            Do While Not rs.EOF                For j = 0 To rs.Fields.Count - 1 '循环数据表的0至最后一列                    xlsheet.Cells(i, j + 1) = rs.Fields(j) '写入(数据表字段索引是从0开始,而xls的列示从1开始, 因此要j+1)                Next                rs.MoveNext                i = i + 1 '跳到i+1行继续写入            Loop        End If    Call CloseConn    Call closeXLT    sql = ""End Sub
[解决办法]
ado连接和关闭数据库的代码

探讨
引用:
窗体代码
VB codePrivateSub outcstinf_Click()'导出资料为XLSDim iAsInteger'行Dim jAsInteger'列Call openXLT("Custom.xlt")'Custom.xlt是一个与要导出的数据表格式相同的excel模板文件Call OpenConn
        sql="select * from 要导出的表 ORDER BY 用于排序的字段(一般是编号) ASC"
        rs.Open sql, cn,1,1If rs.RecordCount <1Then
            MsgBox"数据库中没有记录!":ExitSubElse
            i=2'从xls的第二行开始写入(模板中第一行已作为字段名保留)DoWhileNot rs.EOFFor j=0To rs.Fields.Count-1'循环数据表的0至最后一列                    xlsheet.Cells(i, j+1)= rs.Fields(j)'写入(数据表字段索引是从0开始,而xls的列示从1开始, 因此要j+1)Next
                rs.MoveNext
                i= i+1'跳到i+1行继续写入LoopEndIfCall CloseConnCall closeXLT
    sql=""End Sub
模块代码
VB codePublic xlAppAs Excel.Application'定义EXCEL类Public xlBookAs Excel.Workbook'定义工件簿类Public xlsheetAs Excel.Worksheet'定义工作表类PublicSub openXLT(ByVal xltNameAsString)'打开EXCEL过程Set xlApp=CreateObject("Excel.Application")'创建EXCEL应用类Set xlBook= xlApp.Workbooks.Open(App.Path&"\xltmodel\"& xltName)'打开EXCEL工作簿Set xlsheet= xlBook.Worksheets(1)'打开EXCEL工作表End SubPublicSub closeXLT()
  xlApp.Visible=True'设置EXCEL可见Set xlApp=Nothing'释放EXCEL对象End Sub

PS:代码是用在某居下载的一个《企业人事管理系统》的代码随便改了一下

VB codeCall OpenConnCall CloseConn
調用函數“OpenConn”and “CloseConn”能附上嗎;

[解决办法]
Dim cn As New ADODB.Connection
cn.CursorLocation = adUseClient
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password=123"
[解决办法]
以上是打开ADO连接
cn.close
是关闭
[解决办法]
打开和关闭数据库的模块代码
VB code
'打开库Public Sub OpenConn()  Set cn = New ADODB.Connection  Set rs = New ADODB.Recordset  cn.CursorLocation = adUseClient  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\数据库所在文件夹的名称\数据库名称;Jet OLEDB:DataBase Password=数据库密码;Persist Security Info=False;"End Sub'关闭库Public Sub CloseConn()  If rs.State <> sckClosed Then rs.Close  Set rs = Nothing  If cn.State <> sckClosed Then cn.Close  Set cn = NothingEnd Sub
[解决办法]


探讨
打开和关闭数据库的模块代码
VB code'打开库PublicSub OpenConn()Set cn=New ADODB.ConnectionSet rs=New ADODB.Recordset
cn.CursorLocation= adUseClient
cn.Open"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& App.Path&"\数据库所在文件夹的名称\数据库名称;Jet OLEDB:DataBase Password=数据库密码;Persist Security Info=False;"End Sub'关闭库PublicSub CloseConn()If rs.State<> sckClosedThen rs.CloseSet rs=NothingIf cn.State<> sckClosedThen cn.CloseSet cn=NothingEnd Sub

[解决办法]
从菜单 工程->引用:
Dim cn As New ADODB.Connection
cn.CursorLocation = adUseClient
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password=123"

VB code'打开库PublicSub OpenConn()Dim cnAsNew ADODB.Connection'出現編譯錯誤:用戶定義類型未cn.CursorLocation= adUseClient
cn.Open"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& App.Path&"\DBList.mdb"End Sub
出現編譯錯誤:
用戶定義類型未定義;

[解决办法]
如上所述:工程-引用,找到Microsoft Access Data Objects 2.x Library,勾选它。

[解决办法]
探讨
Dim cn As New ADODB.Connection'出現編譯錯誤:用戶定義類型未
cn.CursorLocation= adUseClient
cn.Open"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& App.Path&"\DBList.mdb"End Sub
出現編譯錯誤:
用戶定義類型未定義;

[解决办法]
Private Sub MdbToExcelByDAO() '使用DAO将MDB数据库导入到EXCEL
Dim db As Database, rs As Recordset
Set db = OpenDatabase("data.mdb")
db.Execute "select * into sheet1 in 'c:\x.xls' 'Excel 8.0;' from bb" 'sheet1为工作表名
db.Close
End Sub
Private Sub MdbToExcelByADODC() '使用ADODC将MDB数据库导入到EXCEL
Dim cn As New Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=data.mdb"
cn.Execute "select * into sheet1 in 'c:\x.xls' 'Excel 8.0;' from bb"
cn.Close
End Sub

[解决办法]
DAO也要引用
对于高版本的EXCEL好象未必能用
另外EXCEL好象版本不是8.0.而是11

探讨
Private Sub MdbToExcelByDAO() '使用DAO将MDB数据库导入到EXCEL
Dim db As Database, rs As Recordset
Set db = OpenDatabase("data.mdb")
db.Execute "select * into sheet1 in 'c:\x.xls' 'Excel 8.0;' from bb" 'sheet1为工作表名
db.Close
End Sub
Private Sub MdbToExcelByADODC() '使用ADODC将MDB数据库导入到EXCEL
Dim cn As New Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=data.mdb"
cn.Execute "select * into sheet1 in 'c:\x.xls' 'Excel 8.0;' from bb"
cn.Close
End Sub


[解决办法]
探讨
DAO也要引用
对于高版本的EXCEL好象未必能用
另外EXCEL好象版本不是8.0.而是11

[解决办法]
VB code
'在vb中,将ACESS数据导入Excel中Private Sub Command1_Click()    On Error GoTo myErr    Dim Excel_app As Object, AccessFile As String    Dim iExcelFile As String, iExcelPath As String, iSQL As String        iExcelFile = "tmp.xls"    AccessFile = "F:\tk\tk.mdb"    iSQL = "select * from tbUser"        iExcelPath = IIf(Len(App.Path) > 3, App.Path & "\" & iExcelFile, App.Path & iExcelFile)    Set Excel_app = CreateObject("Excel.Application")    'Excel_app.Visible = True    Excel_app.WorkBooks.Add    Excel_app.Sheets("sheet1").Select    Screen.MousePointer = vbHourglass    With Excel_app.ActiveSheet.QueryTables.Add(Connection:=Array( _        "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=" & _         AccessFile), Destination:=Excel_app.Range("A1"))        .CommandType = 3        .CommandText = Array(iSQL)        .Refresh    End With        Excel_app.DisplayAlerts = False    Excel_app.ActiveWorkBook.SaveAs FileName:=iExcelPath    Excel_app.DisplayAlerts = True    Excel_app.Quit    Set Excel_app = Nothing    Screen.MousePointer = vbDefault    MsgBox "导出了成功", , "导出成功"Exit SubmyErr:    If Err.Number = 429 Then        Screen.MousePointer = vbDefault        MsgBox "请先安装EXCEL!", , "导出错误"        Exit Sub    End If    Excel_app.DisplayAlerts = False    Excel_app.Quit    Excel_app.DisplayAlerts = True    Set Excel_app = Nothing    Me.MousePointer = vbDefault    MsgBox " 导出数据到 Excel 时出错! ", , "导出错误"       End Sub 


[解决办法]
给你一个简单的

VB code
Private Sub sub_ExpToExcel()    Dim xlapp As Excel.Application    Dim xlbook As Excel.Workbook    Dim xlsheet As Excel.Worksheet    Dim cn As New ADODB.Connection    Dim rs As New ADODB.Recordset    cn.CursorLocation = adUseClient    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password="    rs.Open "select * from mytable", cn, adOpenStatic, adLockOptimistic    rs.RecordCount    If rs.RecordCount > 0 Then        Set xlapp = CreateObject("Excel.Application")        Set xlbook = xlapp.Workbooks.Add        Set xlsheet = xlbook.Worksheets(1)        xlsheet.Range("a1").CopyFromRecordset rs        xlsheet.SaveAs strFileName    End If        rs.Close    Set rs = Nothing        cn.Close    Set cn = NothingEnd Sub
[解决办法]
探讨通过VB向EXCEL传输数据的方法

一、引言
VB向Excel传输数据的几种常用方法进行总结,并分析每种方法的优缺点及适用环境
 
二、概述

通常我们向Excel传输数据使用自动化。自动化提供了最好的便利性并且能在运行时对单元格进行格式化和其他各项设置。对于自动化可以使用几种不同的途径来传输数据:

l 一个单元格一个单元格的传输数据;

l 传输数组中的数据到一组单元格;

l 使用CopyFromRecordset方法传输ADO recordset到一组单元格;

l 通过在Excel worksheet中定义一个Querytable,这个querytable通过ODBC或者OLEDB连接到数据源;

l 先将数据拷贝到剪切板然后将剪贴板内容粘贴到Excel worksheet中;

还有几种方法向Excel中传输数据,比如运行服务端应用程序,可以不通过客户端进行批量数据处理。以下几种方法是不通过自动化进行数据传输的方法:

l 传输数据到有tab符或者逗号分割的文本文件中,Execl可以分析这个文件将它放到worksheet中;

l 通过ADO(ActiveX Data Object)将数据传输到worksheet中;

l 通过DDE(Dynamic Data Exchange)传输数据到worksheet中。 
三、几种常用方法的详细说明。

1、 使用自动化一个单元格一个单元格传输数据

可以使用自动化,一次可以将数据传输到worksheet一个单元格中,举例如下:

dim oExcel As object

Dim oBook as object

dim oSheet as object



'在EXCEL中创建一个新的worksheet

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.workbooks.Add

'在新的workbook中向第一个worksheet的单元格添加数据

Set oSheet = oBook.Worksheets(1)

oSheet.Range("A1").Value ="张三"

oSheet.Range("B1").Value="男"

oSheet.Range("A1:B1").font.Bold=true

oSheet.Range("A2").Value="李四"

oSheet.Range("B2").value="女"

'保存workbook并退出Excel

oBook.SaveAs "C:\book1.xls"

oExcel.quit

如果要传输的数据量不是很大,一个单元一个单元传输数据是比较好的方法。可以方便的将数据放到workbook任何地方并且还可以在运行时格式化单元格。但是,当传输到workbook中数据量很大则不建议使用这种方法,因为在运行结果中的每一个range对象都需要创建接口,所以这种方法速度较慢。此外,微软的windows95和windows98接口有64k的限制,当接口需求超过64k时,自动化服务器(Excel)可能就会停止响应或者提示内存不足错误。所以如果需要向Excel中传输的数据不是很大时建议使用这种方式。
 
2、 使用自动化传输一个数组数据到wooksheet的range

可以一次将数组中的数据传输到weeksheet中包括多个单元格组成的range中。举例如下:

Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object



'在Excel中创建一个新的wookbook

Set oExcel = CreateObject("excel.Application")

Set oBook=oExcel.WorkBooks.Add



'创建一个3列、100行的数组

Dim DataArray(1 to 100,1 to 3 ) as variant

Dim r as integer

For r = 1 to 100

DataArray(r,1) = "ORD" & Format(r,"0000")

DAtaArray(r,2)= Rnd() * 1000

DataArray(r,3) = DataArray(r,2) * 7

Next

'在worksheet的第一行加上标题

Set oSheet = oBook.Worksheets(1)

oSheet,Range("A1:C1").valve = Array("定单号","数量","税金")

'将数组中的数据传输到worksheet中,数据的开始位置是A2

oSheet.Range("A2").Resize(100,3).valve=DataArray

'保存workbook,退出Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit
 

如果通过数组而不是一个单元一个单元的传输大量的数据,则会发现性能会显著提高,将数据传输到300个worksheet的单元格中的语句如下:



osheet.range("A2").Resize(100,3)Value=DataArray



这条语句需要两个接口(由Range方法生成的Range对象需要一个接口,由resize方法生成的range对象也需要一个接口)。如果要是通过一个单元格一个单元格的传输数据则需要为range对象生成300个接口。不论什么情况,作为开发者要尽量使用批量数据传输以减少接口数量,从而提高应用系统的性能。
 
 
3、使用自动化传输ADO的recordset到wooksheet的range

Excel2000及以后版本引入了CopyFromRecordset方法,从而允许开发者将ADO的recordset传输到worksheet的range中。下面的代码演示了如何使用CopyFromRecordset将示例数据库Northwind 中orders表的数据传输到Excel中:

'生成一个包含Orders表所有记录的 Recordset

Dim sNWind As String

Dim conn As New ADODB.Connection

Dim rs As ADODB.Recordset

sNWind = "C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"



conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

sNWind & ";"

conn.CursorLocation = adUseClient

Set rs = conn.Execute("Orders", , adCmdTable)



'在Excel中创建新的workbook

Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add

Set oSheet = oBook.Worksheets(1)



'向 Excel中传输数据

oSheet.Range("A1").CopyFromRecordset rs



'保存并退出Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit



'关闭连接

rs.Close

conn.Close
 

 
 
4、使用剪切板

windows的剪切板也可以作为向worksheet传输数据的一种机制。可以拷贝被TAB符分割的列、回车符分割的行的字符串到worksheet的单元格中。VB通过clipboard对象传输数据到Excel的代码如下:

'拷贝字符串到剪切板

Dim sData As String

sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _

& "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _

& "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"

Clipboard.Clear



Clipboard.SetText sData



' 在 Excel中创建一个workbook

Dim oExcel As Object

Dim oBook As Object

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add





'粘贴数据

oBook.Worksheets(1).Range("A1").Select

oBook.Worksheets(1).Paste



'保存并退出Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit
 

 
 

5、生成一个带有分割符的文本文件

Excel可以打开内容被TAB符或逗号分割的文件,并且能正确的分解数据到相应的单元格中。可以利用这一点来传输大量数据,如果可能的话再使用少量的自动化。这种方式对SERVER/CLIENT应用程序是一个很好的选择,因为文本文件在服务端生成,然后在客户端使用自动化一次打开。

下面代码演示如何使用ADO recordset生成被逗号分割的文本文件。

'生成一个包含Orders表所有记录的 Recordset

Dim sNWind As String

Dim conn As New ADODB.Connection

Dim rs As ADODB.Recordset

Dim sData As String

sNWind = _

"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

sNWind & ";"

conn.CursorLocation = adUseClient

Set rs = conn.Execute("Orders", , adCmdTable)



'将 recordset保存成以 tab分割符分割的文本文件

sData = rs.GetString(adClipString, , vbTab, vbCr, vbNullString)

Open "C:\Test.txt" For Output As #1

Print #1, sData

Close #1



'关闭连接

rs.Close

conn.Close



'在Excel中打开一个新的文本文件

Shell "C:\Program Files\Microsoft Office\Office\Excel.exe " & _

Chr(34) & "C:\Test.txt" & Chr(34), vbMaximizedFocus
 



如果文本文件具有.csv扩展名,Excel直接打开文件而不会出现导入向导,并且是假设文件是被逗号分割的。与此类似,如果文件具有.txt扩展名,Excel自动以TAB符为文件的分割符来分解文件。

在前一个例子,Excel通过shell语句启动,命名文件使用带参数的命令行语句。没有使用自动化,然而,如果愿意的话,可以少量的使用自动化打开文件和存储文件。举例如下:



'创建一个新的Excel实例

Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object

Set oExcel = CreateObject("Excel.Application")



'打开文本文件

Set oBook = oExcel.Workbooks.Open("C:\Test.txt")



'保存文件并退出

oBook.SaveAs "C:\Book1.xls", xlWorkbookNormal

oExcel.Quit
 


6、通过ADO向worksheet中传输数据

使用 microsoft Jet OLE DB Provider可以向已经存在的Excel workbook中的表添加数据,这里所谓的表就是已经定义了名字的range。这个定义了名字的range的第一行必须包含标题(或者叫字段名),接下来各行包含的是记录。以下演示了通过如何在workbook中创建名为MyTalbe的表:

⑴、创建一个新的workbook

⑵、在sheet1的单元格A1:B1增加如下内容

A1:FirstName B1:LastName

⑶、格式化B1为右对齐;

⑷、选中A1:B1

⑸、在插入菜单选择Names然后选择Define,输入名称MyTable然后点ok。

⑹、将新的workbook存为c:\book1.xls,退出Excel

使用ADO向MyTable增加记录的代码如下:

' 创建一个连接Book1.xls的connection对象

Dim conn As New ADODB.Connection

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:\Book1.xls;Extended Properties=Excel 8.0;"

conn.Execute "Insert into MyTable (FirstName, LastName)" & _

" values ('Bill', 'Brown')"

conn.Execute "Insert into MyTable (FirstName, LastName)" & _

" values ('Joe', 'Thomas')"

conn.Close
 


果使用这种方式向表中添加记录,workbook中的格式是自动维护的,在上面的例子中,新增加记录的B列自动被格式化为右对齐。每一条增加的行自动借用上一行的格式。

注意,如果一条记录被增加到worksheet的单元格中,则在该单元格中的数据被覆盖掉,换句话说就是新增加的记录不是插入一行,而是覆盖原先的行。
 
四、小结

本文通过对VB向Excel中传输数据的几种常用方法分析和总结,提出若干建议。借鉴这些建议一定会给开发者的开发带来便利。 

热点排行