VBMAN.Csv - CSV 文件操作对象
概述
VBMAN.Csv 提供了强大的 CSV 文件读写功能,支持从文件加载、保存到文件、与数据库记录集交互,以及直接在 ListView 中显示数据。
核心特性
- 自动编码识别: 支持 UTF-8、ANSI 等多种编码
- 标准 CSV 解析: 正确处理逗号、引号、换行等特殊字符
- 数据绑定: 直接绑定到 ListView 控件显示
- 进度事件: 大文件处理支持进度反馈
- 链式调用: 流畅的 API 设计
属性
| 属性 | 类型 | 说明 |
|---|---|---|
Data | Scripting.Dictionary | CSV 数据字典(行号→行数据) |
CurrentLineDic | Scripting.Dictionary | 当前行数据字典 |
CurrentLineNumber | Long | 当前行号 |
Delimiter | String | 分隔符(默认逗号) |
LastError | String | 最后错误信息 |
HasHeadTitle | Boolean | 是否有标题行 |
HeadTitle | Scripting.Dictionary | 标题字典 |
HeadTitleWidth | Scripting.Dictionary | 列宽字典 |
HeadTitleWidthDefault | Long | 默认列宽(默认1500) |
HeadTitleWidthMax | Long | 最大列宽(默认8000) |
HeadTitleWidthAuto | Boolean | 是否自动调整列宽 |
IsFirstLineToHead | Boolean | 首行是否作为标题 |
方法
数据操作
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 rowDataNewColumn
添加新列
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, rowDicValue 属性
直接访问单元格值
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 WithSaveTo
保存到文件
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.CloseSaveFromRecordSet
直接将记录集保存为 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最佳实践
- 始终检查 LastError: 文件操作可能失败,建议检查错误信息
- 使用链式调用: 充分利用链式调用使代码更简洁
- 大数据量使用事件: 处理大文件时使用进度事件避免界面卡死
- 正确编码: 根据实际文件编码指定 CharSet 参数
- 及时 Reset: 重复使用对象时先调用 Reset 清除旧数据