游戏中很多配置文件都采用Excel保存数据。但实际使用时,可能需要对Excel数据再处理成我们需要的格式。基于此需求,学习了Excel的VBA来导出数据到文件中。
开启VBA
Excel中的开发工具默认都没有打开,此处需要百度一下如何打开对应版本的Excel。(注:高版本的开发工具需要专业版或商业版才能使用,最好不要使用过高版本,最低office excel 2007版)
宏设置
Excel默认禁用所有宏,在宏安全中可以设启用所有宏
新建模块
打开Visual Basic面板,选中工程面板下任意选项右键-插入-模块。
代码示例
Option Explicit
Sub parseAndOutputData()
Dim result As String
Dim file_name As String
Dim file_path As String
Dim info_row As Integer
Dim sheets_count As Integer
If Len(Worksheets(1).Cells(2, 1).Value) > 0 Then
file_name = Worksheets(1).Cells(2, 1)
End If
If Len(Worksheets(1).Cells(2, 2).Value) > 0 Then
file_path = Worksheets(1).Cells(2, 2)
End If
If Len(Worksheets(1).Cells(2, 3).Value) > 0 Then
info_row = Worksheets(1).Cells(2, 3)
End If
sheets_count = Worksheets.Count
sheets_count = 0
While Len(Worksheets(1).Cells(2, sheets_count + 4)) > 0
sheets_count = sheets_count + 1
Wend
If MsgBox("It will Clear File!",VbOKCancel,"提示") = vbCancel Then
Exit Sub
End If
Open ThisWorkbook.Path & "\" & file_name & ".txt" For Output As #1
Write #1, ""
Close #1
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim max_row As Integer
Dim max_col As Integer
Open ThisWorkbook.Path & "\" & file_name & ".txt" For Binary As #1
result = "return {"
For i = 2 To sheets_count
max_col = 0
While Len(Worksheets(i).Cells(info_row, (max_col + 1)).Value) > 0
max_col = max_col + 1
Wend
max_row = info_row
While Len(Worksheets(i).Cells((max_row + 1), 1).Value) > 0
max_row = max_row + 1
Wend
If i <> 2 Then
result = result & "," & Chr(10)
Else
result = result & Chr(10)
End If
result = result & Chr(9) & Worksheets(1).Cells(2, (i + 2)).Value & " = {"
For j = (info_row + 1) To max_row
If j <> (info_row + 1) Then
result = result & "," & Chr(10) & Chr(9) & Chr(9) & "{"
Else
result = result & Chr(10) & Chr(9) & Chr(9) & "{"
End If
For k = 1 To max_col
If Len(Worksheets(i).Cells(j, k).Value) > 0 Then
If k <> 1 Then
result = result & ","
End If
result = result & Chr(10) & Chr(9) & Chr(9) & Chr(9) & Worksheets(i).Cells(info_row, k) & "=" & Worksheets(i).Cells(j, k).Value
End If
Next
result = result & Chr(10) & Chr(9) & Chr(9) & "}"
Put #1, , result
result = ""
Next
result = result & Chr(10) & Chr(9) & "}"
Next
result = result & Chr(10) & "}"
Put #1, , result
Close #1
MsgBox "OutPut Success!"
End Sub
Worksheets(1).Cells(2, 3)代表第一个表的第2行第3列单元格 其中Worksheets(1)代表第一个表,其指多个表中排最前面的表,只与位置有关
Worksheets.Count代表当前xls文件中表的个数
<> 表示不等于 & 表示连接 Chr(9)表示转义字符Tab
在条件语句中 = 表示判断是否相等
ThisWorkbook.Path代表当前文件路径 Output 和 Binary 代表文件打开模式
其中Output 对应用Write写入数据 其会覆盖到文件所有内容。
Binary对应用Put写入数据 其有三个参数,第二个代表可选字节数 ,第三个代表内容
Binary其会覆盖掉最初写入的部分,不会修改其他数据。所以采用Output清除文件内容。
Binary一次最多读写32kb,可以不关闭文件多次顺序写入数据。
#1代表文件号 类似文件句柄吧
MsgBox 弹出框控件 具体使用细节可根据需求百度
本示例代码主要是读取第一个表,获取一些配置信息,比如需要读取多少个表,从第几行开始读取。之后的逻辑主要是为了组织数据的布局
最后在Excel中的开发者面板中点击宏,选择模块再执行。导出文件成功
新建一个空xlsx文件,为其开启宏并添加模块。只要与该xlsx文件在同一文件夹的,其它xlsx文件就可以直接调用其模块导出数据
中文显示问题:
二进制文本输出后的编码格式是ANSI
一般代码文件都采用的是UTF-8 无BOM格式
最简单的方法:
Notepad++可以显示ANSI的中文,但直接将其转换编码格式,其新的格式不能显示原有中文
使用Notepad++新建文件将其编码格式修改为UTF-8 无BOM格式 在将原来的内容拷贝到新文件中即可显示原有中文