65.9K
CodeProject 正在变化。 阅读更多。
Home

VBScript / Excel 2007 - 访问 DBF 文件的简单方法

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2007年12月17日

CPOL

2分钟阅读

viewsIcon

74856

Excel 2007 似乎不支持 DBF 文件,这里提供一种 VBScript 解决方法。

引言

这里有两个代码片段,介绍了如何使用 ADODB 将 Excel 数据读入/写出 DBF 文件

我本可以更努力地整理这篇文章,但白天的工作妨碍了 :( 总之,如果你想从 DBF 文件或其他类型的数据库中读取或写入数据,这可能值得一读。

在 Excel 2007 中打开 DBF 文件

看来 Excel 2007 已经不再支持 DBF 文件了。这里有一个非常简单的脚本,用于在 Excel 2007 中打开 DBF 文件。

这是一个初版脚本。我使用“公式”技巧强制 Excel 不进行数据转换。因此,这对于查看文件来说没问题,但需要更多工作才能达到完美。我将尽快尝试寻找更多时间。要使用该脚本,请将其放置在您的桌面上。然后,将 DBF 文件拖放到脚本上,并将其拖放到脚本上。然后,脚本将打开 Excel,并将 DBF 文件中的数据加载到新工作簿中的新电子表格中。

如果您想了解更多关于拖放脚本、脚本宏以及成为 Excel 大神的信息,请参阅我的书“新手入门 - 如何成为 Excel 大神,无需真正尝试”。本页底部有一个链接,可以获取更多信息。

' Here is the script,I'll do a DBF write version soon
Option Explicit 
Dim inputFile,path,fileName,tableName
Dim rs,fieldVals,i,myExcel,myWorkBook,mySheet,row,column
Const adOpenDynamic=2
Const adLockPessimistic=2
Const adCmdTable=2
Const adOpenForwardOnly=0

inputFile=WScript.Arguments.Item(0)
path=Split(inputFile,"\")
fileName=path(Ubound(path))
path(Ubound(path))=""
path=Join(path,"\")
tableName=Left(fileName,Len(fileName)-4)
Dim dBConn
Set dBConn=OpenDBFConn(path)

Set rs=CreateObject("ADODB.Recordset")
rs.Open tableName, dbConn, adOpenForwardOnly, _
        adLockPessimistic, adCmdTable

Set myExcel=CreateObject("Excel.Application")
Set myWorkBook=myExcel.Workbooks.Add()
Set mySheet=myWorkBook.Sheets(1)
myExcel.Visible=TRUE

rs.MoveFirst
Dim field
row=1
column=1
For Each field In rs.Fields
    mySheet.Cells(row,column).Value=field.Name
    WScript.Echo field.type
    column=column+1
Next
row=2

Redim fieldVals(rs.Fields.Count - 1)

While Not rs.EOF
    column=0
    For Each field In rs.Fields
        fieldVals(column)="=""" & _
                          field.Value & """"
        column=column+1
    Next
    mySheet.Range(mySheet.Cells(row,1), _
            mySheet.Cells(row,column)).Formula=fieldVals
    row=row+1
    rs.MoveNext
Wend
rs.Close
WScript.Echo "Loading Finished"

Function OpenDBFConn(Path)
    Dim Conn
    Set Conn = CreateObject("ADODB.Connection")
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=" & Path & ";" & _
                   "Extended Properties=""DBASE IV;"";" 
    Set OpenDBFConn = Conn
End Function

将 Excel 文件转换为 DBF 格式

同样,看来 Excel 2007 已经不再支持 DBF 格式。这里是一个简单的脚本,用于将 Excel (.xls, .xlsx, .csv 等) 文件转换为 DBF 格式。

这离完美还差很远。这个实现最糟糕的地方在于它只将数据存储为 VARCHAR(64)。我可能会很快尝试创建一个更友好的类型版本。

该脚本使用了我的书“新手入门 - 如何成为 Excel 大神,无需真正尝试”中解释的拖放脚本技术。如果您想了解更多关于如何通过 Excel 接管世界的信息,请查看我的博客页面底部的书籍链接 ;)

该脚本将为工作簿中的每个电子表格生成一个 xxxx_n.dbf 文件,其中 xxxx 是工作簿文件的名称,n 是电子表格的索引(1、2 等)。该脚本的工作方式是使用 ADODB 创建一个具有 'Create Table' 的 DBF 表,然后打开一个指向该表的动态记录集(使用 DBF 提供程序创建表会创建一个 DBF 文件)。然后,对电子表格中的每个非空行调用记录集上的 AddNew。我使用数组访问电子表格来加快速度。

Option Explicit
Dim inputFile, path, fileName, tableName, createTable
inputFile=WScript.Arguments.Item(0)
path=Split(inputFile,"\")
fileName=path(Ubound(path))
path(Ubound(path))=""
path=Join(path,"\")
Dim dBConn
Set dBConn=OpenDBFConn(path)

' Get the name of the new table in a way will cope with .xls .xlsz etc
tableName=Split(fileName,".")
tableName(Ubound(tableName))=""
tableName=Join(tableName,".")
tableName=Left(tableName,Len(tableName)-1)

'  Open Excel and scan each spreadsheet
Dim myExcel,myWorkbook, mySheet,nColumns,column
Dim fields,row,scan,thisTableName,sheetCount
Dim createString,i

Set myExcel=CreateObject("Excel.Application")
myExcel.Visible=TRUE
Set myWorkbook=myExcel.Workbooks.Open(inputFile)

sheetCount=1
For Each mySheet In myWorkbook.Sheets
    ' Get number of fields from column headers
    scan=mySheet.Rows(1).Value
    For nColumns=1 To UBound(scan,2)
        If IsEmpty(scan(1,nColumns)) Then Exit For
    Next    
    nColumns=nColumns-1
    If nColumns >0 Then
        thisTableName=tableName & "_" & sheetCount
        createString="CREATE TABLE "
        createString=createString & thisTableName & " ("
        For i=1 to nColumns
            createString = createString & "[" & _
                           Replace(scan(1,i)," ","_") & _
                           "] VARCHAR(64) "
            If Not i=nColumns Then
                createString=createString & ", "
        Next
        createString=createString & " )"
        On Error Resume Next
        dbConn.Execute "Drop Table " & thisTableName
        On Error Goto 0
        WScript.Echo createString
        dBConn.Execute createString
        
        ' Now we have the table, let us write to it
        Dim rs,fieldPos,fieldVals
        Redim fieldPos(nColumns-1)
        Redim fieldVals(nColumns-1)
        For i=0 to nColumns-1
           fieldPos(i)=i
        Next
        Set rs=CreateObject("ADODB.Recordset")
        Const adOpenDynamic=2
        Const adLockPessimistic=2
        Const adCmdTable=2

        rs.Open thisTableName, dbConn, adOpenDynamic, _
                adLockPessimistic, adCmdTable

        For row=2 to 1048576
            scan=mySheet.Rows(row).Value
            For i=1 to nColumns
                If Not IsEmpty(scan(1,i)) Then Exit For
            Next
            ' Blank row found
            If i > nColumns Then Exit For
            For i=0 to nColumns-1
                fieldVals(i)=scan(1,i+1)
            Next
            rs.AddNew fieldPos,fieldVals
        Next

        rs.Close

    End If
    sheetCount=sheetCount+1
Next

Function OpenDBFConn(Path)
  Dim Conn
  Set Conn = CreateObject("ADODB.Connection")
  Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=" & Path & ";" & _
                   "Extended Properties=""DBASE IV;"";" 
  Set OpenDBFConn = Conn
End Function
© . All rights reserved.