代码之家  ›  专栏  ›  技术社区  ›  Pablo Santa Cruz

用vb6生成Excel文件

  •  2
  • Pablo Santa Cruz  · 技术社区  · 15 年前

    我正在寻找关于这个具体问题的建议:

    在VisualBasic6(vb6)中,生成Excel文件(常规的XLS文件,而不是XLSX文件)的最快方法是什么?

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  3
  •   ZippyV    15 年前

    最简单的方法是在项目中设置对Excel COM对象的引用,并以编程方式将所有数据插入到工作表中。

        2
  •  3
  •   MyItchyChin JNK    15 年前

    Excel从Excel2000开始就能够读取HTML。

    这个 最容易的 方法是编写HTML表并使用.xls扩展名保存它们,或者如果是Web应用程序,则清除响应缓冲区,将响应类型设置为“application/vnd.ms-excel”,然后不使用任何其他内容写出表。

    将以下内容复制并粘贴到记事本中,然后用.xls扩展名保存并打开。

    <table>
    <tr><th>Color</th><th>Shape</th></tr>
    <tr><td>Blue</td><td>Square</td></tr>
    </table>
    

    免责声明:

    我不推荐这种方法,因为它可能只与Excel兼容,但这是我所知道的最简单的方法。

        3
  •  2
  •   Mike Woodhouse    15 年前

    设置对Excel对象库的引用(在VBA中的“工具”菜单上,在VB6中的“项目”)(不记得确切的名称,但它将以“Microsoft”开头,并在名称中的某个位置具有“Excel”)。

    然后像这样:

    Public Sub BuildAndSaveWorkbook
    
        With New Excel.Workbook
            ' do all the stuff to create the content, then'
            .SaveAs Filename:="WhateverYouWantToCallIt.xls", FileFormat:=xlExcel8
        End With
    
    End Sub
    
        4
  •  1
  •   wqw    15 年前

    创建XLS文件的最快方法是使用Jet的ISAM Excel驱动程序。下面是一个如何使用ADO和ADOX的示例:

    ' References:
    '   Microsoft ActiveX Data Objects 2.8 Library
    '   Microsoft ADO Ext. 2.8 for DDL and Security
    Option Explicit
    
    Private Sub Command1_Click()
        Dim rs              As ADODB.Recordset
    
        Set rs = CreateRecordset( _
            "ID", adDouble, _
            "Name", adVarWChar, 200, _
            "Value", adDouble, _
            "Memo", adLongVarWChar)
        rs.AddNew Array("ID", "Name", "Value", "Memo"), _
            Array(1, "test", 5.1, "long long text here")
        rs.AddNew Array("ID", "Name", "Value"), _
            Array(1, "proba", 15.678)
        AppendExcelSheet rs, App.Path & "\test.xls", "My Data", True
        AppendExcelSheet rs, App.Path & "\test.xls", "More Data"
    End Sub
    
    Private Function CreateRecordset(ParamArray FldDesc()) As ADODB.Recordset
        Dim lIdx            As Long
    
        Set CreateRecordset = New ADODB.Recordset
        With CreateRecordset.Fields
            Do While lIdx < UBound(FldDesc)
                Select Case FldDesc(lIdx + 1)
                Case adDouble, adDate, adCurrency, adBoolean
                    .Append FldDesc(lIdx), FldDesc(lIdx + 1), , adFldIsNullable
                    lIdx = lIdx + 2
                Case adVarWChar
                    .Append FldDesc(lIdx), FldDesc(lIdx + 1), FldDesc(lIdx + 2), adFldIsNullable
                    lIdx = lIdx + 3
                Case adLongVarWChar
                    .Append FldDesc(lIdx), FldDesc(lIdx + 1), -1, adFldIsNullable
                    lIdx = lIdx + 2
                Case Else
                    Err.Raise vbObjectError, , "Not support Excel data type!"
                End Select
            Loop
        End With
        CreateRecordset.Open
    End Function
    
    Private Function AppendExcelSheet( _
                rsSrc As Recordset, _
                sXlsFile As String, _
                Optional ByVal sSheetName As String, _
                Optional ByVal bCreateNew As Boolean) As Boolean
        Dim sConnStr        As String
        Dim oTbl            As ADOX.Table
        Dim oCol            As ADOX.Column
        Dim oFld            As ADODB.Field
        Dim rsDst           As ADODB.Recordset
    
        '--- init local vars
        sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & sXlsFile & ";Extended Properties=""Excel 8.0;Read Only=0"""
        If LenB(sSheetName) = 0 Then
            sSheetName = "Sheet1"
        End If
        '--- cleanup previous file
        If bCreateNew Then
            On Error Resume Next
            SetAttr sXlsFile, vbArchive
            Kill sXlsFile
            On Error GoTo 0
        End If
        '--- create/open workbook and append worksheet
        With New ADOX.Catalog
            .ActiveConnection = sConnStr
            Set oTbl = New ADOX.Table
            oTbl.Name = sSheetName
            For Each oFld In rsSrc.Fields
                Set oCol = New ADOX.Column
                With oCol
                    .Name = oFld.Name
                    .Type = oFld.Type
                End With
                oTbl.Columns.Append oCol
            Next
            .Tables.Append oTbl
        End With
        '--- copy data to range (named after worksheet)
        If rsSrc.RecordCount > 0 Then
            Set rsDst = New ADODB.Recordset
            rsDst.Open "[" & sSheetName & "]", sConnStr, adOpenDynamic, adLockOptimistic
            rsSrc.MoveFirst
            Do While Not rsSrc.EOF
                rsDst.AddNew
                For Each oFld In rsSrc.Fields
                    rsDst.Fields(oFld.Name).Value = oFld.Value
                Next
                rsDst.Update
                rsSrc.MoveNext
            Loop
        End If
    End Function
    

    注意到 Read Only=0 连接字符串上的扩展属性。