Skip to content

VBMAN.Csv - CSV 文件操作对象

概述

VBMAN.Csv 提供了强大的 CSV 文件读写功能,支持从文件加载、保存到文件、与数据库记录集交互,以及直接在 ListView 中显示数据。

核心特性

  • 自动编码识别: 支持 UTF-8、ANSI 等多种编码
  • 标准 CSV 解析: 正确处理逗号、引号、换行等特殊字符
  • 数据绑定: 直接绑定到 ListView 控件显示
  • 进度事件: 大文件处理支持进度反馈
  • 链式调用: 流畅的 API 设计

属性

属性类型说明
DataScripting.DictionaryCSV 数据字典(行号→行数据)
CurrentLineDicScripting.Dictionary当前行数据字典
CurrentLineNumberLong当前行号
DelimiterString分隔符(默认逗号)
LastErrorString最后错误信息
HasHeadTitleBoolean是否有标题行
HeadTitleScripting.Dictionary标题字典
HeadTitleWidthScripting.Dictionary列宽字典
HeadTitleWidthDefaultLong默认列宽(默认1500)
HeadTitleWidthMaxLong最大列宽(默认8000)
HeadTitleWidthAutoBoolean是否自动调整列宽
IsFirstLineToHeadBoolean首行是否作为标题

方法

数据操作

NewLine

添加新行数据

vb
Public Function NewLine(ParamArray FieldsData() As Variant) As Boolean

示例:

vb
' 添加单行数据
VBMAN.Csv.NewLine "张三", "25", "北京"
VBMAN.Csv.NewLine "李四", "30", "上海"

' 从字典添加
Dim rowData As New Scripting.Dictionary
rowData(1) = "王五"
rowData(2) = "28"
rowData(3) = "广州"
VBMAN.Csv.NewLine rowData

NewColumn

添加新列

vb
Public Function NewColumn(ByVal Title As String, Optional Width As Long, Optional Content As String) As Boolean

示例:

vb
' 添加新列
VBMAN.Csv.NewColumn "年龄", 1000, "0"
VBMAN.Csv.NewColumn "城市"

GetLine / SetLine

获取/设置行数据

vb
Public Function GetLine(ByVal LineNumber As Long, Optional ByRef LineDic As Scripting.Dictionary) As Boolean
Public Function SetLine(ByVal LineNumber As Long, ByRef LineDic As Scripting.Dictionary) As Boolean

示例:

vb
' 获取第2行数据
Dim rowDic As Scripting.Dictionary
If VBMAN.Csv.GetLine(2, rowDic) Then
    Debug.Print rowDic(1)  ' 第一列数据
    Debug.Print rowDic(2)  ' 第二列数据
End If

' 修改第2行数据
rowDic(2) = "新值"
VBMAN.Csv.SetLine 2, rowDic

Value 属性

直接访问单元格值

vb
' 读取
Dim val As Variant
val = VBMAN.Csv.Value(2, 3)  ' 第2行第3列

' 写入
VBMAN.Csv.Value(2, 3) = "新值"

文件操作

LoadFrom

从文件加载 CSV

vb
Public Function LoadFrom(ByVal FilePath As String, Optional IsFirstHead As Boolean = True, Optional CharSet As String = "UTF-8") As cCsv

参数:

  • FilePath - 文件路径
  • IsFirstHead - 首行是否作为标题(默认True)
  • CharSet - 字符编码(默认UTF-8)

示例:

vb
' 基本加载
If VBMAN.Csv.LoadFrom("C:\\data.csv") Then
    Debug.Print "加载成功,共 " & VBMAN.Csv.Data.Count & " 行"
Else
    Debug.Print "加载失败: " & VBMAN.Csv.LastError
End If

' 链式调用
With VBMAN.Csv
    .LoadFrom("C:\\data.csv")
    Debug.Print .CountLine & " 行, " & .CountColumn & " 列"
End With

SaveTo

保存到文件

vb
Public Function SaveTo(ByVal FilePath As String, Optional CharSet As String = "UTF-8") As Boolean

示例:

vb
' 保存到文件
If VBMAN.Csv.SaveTo("C:\\output.csv") Then
    Debug.Print "保存成功"
Else
    Debug.Print "保存失败: " & VBMAN.Csv.LastError
End If

数据库交互

LoadFromRecordSet

从 ADODB.Recordset 加载

vb
Public Function LoadFromRecordSet(ByVal Rs As Object, Optional IsFirstHead As Boolean = True) As cCsv

示例:

vb
' 从记录集加载
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM users", conn

VBMAN.Csv.LoadFromRecordSet rs, True

rs.Close

SaveFromRecordSet

直接将记录集保存为 CSV 文件

vb
Public Function SaveFromRecordSet(ByVal Rs As Object, ByVal SaveToFilePath As String, Optional IncludeFieldNames As Boolean = True) As Boolean

示例:

vb
' 直接将查询结果导出为 CSV
Dim rs As ADODB.Recordset
Set rs = conn.Execute("SELECT * FROM users")

VBMAN.Csv.SaveFromRecordSet rs, "C:\\users.csv", True

界面显示

ShowTo

显示到 ListView 控件

vb
Public Function ShowTo(Lv As Object, Optional DefaultWidth As Long = 800) As Boolean

示例:

vb
' 显示到 ListView
Private Sub LoadCsvToListView()
    ' 加载 CSV 文件
    VBMAN.Csv.LoadFrom "C:\\data.csv"
    
    ' 显示到 ListView1
    VBMAN.Csv.ShowTo ListView1, 1000
End Sub

其他方法

方法说明
Reset(Optional OnlyData As Boolean)重置对象状态
StopLoop()中断加载/保存操作
CanStop()启用可中断模式(返回 Me)
DeleteColumn(Optional ColumnNumber As Long)删除列
SetHeadTitleWidth(ColumnNumber, ColumnWidth)设置列宽
CountLine返回行数(Property Get)
CountColumn返回列数(Property Get)

事件

vb
' 进度事件
Public Event Progress(ByVal Operation As CsvOperationType, ByVal CurrentLine As Long, ByVal TotalLines As Long, ByVal Percent As String, LineDataArray As Variant)

' 完成事件
Public Event Complete(ByVal Operation As CsvOperationType, ByVal TotalLines As Long, ByVal Success As Boolean)

操作类型枚举:

vb
Public Enum CsvOperationType
    OperationNone = 0
    OperationLoadFrom = 1
    OperationLoadFromRecordSet = 2
    OperationSaveTo = 3
    OperationSaveFromRecordSet = 4
End Enum

事件使用示例:

vb
' 需要声明带事件的变量
Private WithEvents mCsv As cCsv

Private Sub Form_Load()
    Set mCsv = VBMAN.Csv
End Sub

Private Sub mCsv_Progress(ByVal Operation As CsvOperationType, ByVal CurrentLine As Long, ByVal TotalLines As Long, ByVal Percent As String, LineDataArray As Variant)
    ProgressBar1.Value = CLng(Replace(Percent, "%", ""))
    DoEvents
End Sub

Private Sub mCsv_Complete(ByVal Operation As CsvOperationType, ByVal TotalLines As Long, ByVal Success As Boolean)
    If Success Then
        MsgBox "处理完成,共 " & TotalLines & " 行"
    Else
        MsgBox "处理失败"
    End If
End Sub

综合示例

示例1: 创建并保存 CSV

vb
Private Sub CreateCsv()
    ' 重置
    VBMAN.Csv.Reset
    
    ' 添加标题行
    VBMAN.Csv.NewLine "姓名", "年龄", "城市"
    
    ' 添加数据行
    VBMAN.Csv.NewLine "张三", "25", "北京"
    VBMAN.Csv.NewLine "李四", "30", "上海"
    VBMAN.Csv.NewLine "王五", "28", "广州"
    
    ' 保存
    If VBMAN.Csv.SaveTo("C:\\users.csv") Then
        MsgBox "CSV 创建成功!"
    End If
End Sub

示例2: 读取并修改 CSV

vb
Private Sub ModifyCsv()
    ' 加载文件
    If Not VBMAN.Csv.LoadFrom("C:\\users.csv") Then
        MsgBox "加载失败: " & VBMAN.Csv.LastError
        Exit Sub
    End If
    
    ' 遍历所有行
    Dim i As Long
    For i = 1 To VBMAN.Csv.CountLine
        Dim rowDic As Scripting.Dictionary
        If VBMAN.Csv.GetLine(i, rowDic) Then
            ' 修改年龄列(第2列)
            If i > 1 Then  ' 跳过标题行
                rowDic(2) = CInt(rowDic(2)) + 1  ' 年龄加1
                VBMAN.Csv.SetLine i, rowDic
            End If
        End If
    Next i
    
    ' 保存修改
    VBMAN.Csv.SaveTo "C:\\users.csv"
End Sub

示例3: 数据库导出到 CSV

vb
Private Sub ExportToCsv()
    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\data.mdb"
    
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Open "SELECT * FROM orders WHERE date >= #2024-01-01#", conn
    
    ' 导出到 CSV
    If VBMAN.Csv.SaveFromRecordSet(rs, "C:\\orders_2024.csv", True) Then
        MsgBox "导出成功!"
    Else
        MsgBox "导出失败: " & VBMAN.Csv.LastError
    End If
    
    rs.Close
    conn.Close
End Sub

示例4: 大文件处理(带进度条)

vb
Private WithEvents mCsv As cCsv

Private Sub LoadLargeFile()
    Set mCsv = VBMAN.Csv
    
    ' 启用中断支持
    mCsv.CanStop.LoadFrom "C:\\large_file.csv"
End Sub

Private Sub mCsv_Progress(ByVal Operation As CsvOperationType, ByVal CurrentLine As Long, ByVal TotalLines As Long, ByVal Percent As String, LineDataArray As Variant)
    ProgressBar1.Max = 100
    ProgressBar1.Value = CLng(Replace(Percent, "%", ""))
    Label1.Caption = "已处理: " & CurrentLine & " / " & TotalLines
    DoEvents
End Sub

Private Sub CommandCancel_Click()
    mCsv.StopLoop  ' 取消操作
End Sub

最佳实践

  1. 始终检查 LastError: 文件操作可能失败,建议检查错误信息
  2. 使用链式调用: 充分利用链式调用使代码更简洁
  3. 大数据量使用事件: 处理大文件时使用进度事件避免界面卡死
  4. 正确编码: 根据实际文件编码指定 CharSet 参数
  5. 及时 Reset: 重复使用对象时先调用 Reset 清除旧数据

VB6及其LOGO版权为微软公司所有