Excel VBA读取Markdown变更日志乱码,如何实现文件编辑更新?
问题解答
可行性结论
该需求完全可实现。
乱码原因
读取出现乱码的核心原因是编码不匹配:你看到的开头ÿþ是UTF-16 LE编码的BOM(字节顺序标记),说明目标Markdown文件采用UTF-16 LE编码存储,而调用FileSystemObject.OpenTextFile时未指定编码参数,方法默认按系统ASCII编码解析文件内容,无论全量读取还是逐行读取,编码解析错误的问题都存在,因此都会返回乱码。
正确实现方案
FileSystemObject对多编码文本的兼容性较差,原生不支持UTF-8格式读取,建议改用ADODB.Stream对象处理文件读写,可自动识别带BOM的UTF-8、UTF-16编码,适配绝大多数Markdown文件的存储格式。
完整实现逻辑如下:
- 通过
ADODB.Stream按正确编码读取现有Markdown文件全量内容 - 遍历Excel工作表中存储的更新记录,按Markdown格式拼接待追加内容
- 将原有内容和新增内容拼接后写回原文件
可直接运行的参考代码:
Public Sub UpdateChangeLog() Dim filePath As String Dim originalContent As String Dim appendContent As String Dim ws As Worksheet Dim lastRow As Long, i As Long Dim stream As Object ' 按需修改以下配置参数 filePath = "C:\your-workspace\CHANGELOG.md" ' 替换为目标Markdown文件的实际完整路径 Set ws = ThisWorkbook.Worksheets("更新记录") ' 替换为存储项目更新内容的工作表名称 ' 假设更新内容存储在工作表A列,第1行为表头,实际内容从第2行开始 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 读取Markdown文件原始内容 Set stream = CreateObject("ADODB.Stream") With stream .Type = 2 ' 设为文本读取模式 .Charset = "utf-8" ' 优先按UTF-8解析,遇到带BOM的UTF-16文件会自动适配 .Open .LoadFromFile filePath originalContent = .ReadText .Close End With ' 组装Excel中记录的更新内容,按Markdown列表格式拼接 appendContent = vbNewLine & "### " & Format(Now(), "yyyy-MM-dd") & " 版本更新" & vbNewLine For i = 2 To lastRow If Trim(ws.Cells(i, "A").Value) <> "" Then appendContent = appendContent & "- " & ws.Cells(i, "A").Value & vbNewLine End If Next i ' 将拼接完成的内容写回文件 With stream .Charset = "utf-8" .Open .WriteText originalContent & appendContent .SaveToFile filePath, 2 ' 参数2代表覆盖原文件写入 .Close End With ' 释放占用的对象 Set stream = Nothing Set ws = Nothing MsgBox "变更日志更新完成", vbInformation End Sub
补充说明
- 如果确定目标文件固定为UTF-16 LE编码,也可继续使用FSO实现读取,只需补全
OpenTextFile的编码参数即可:FileSystemObject.OpenTextFile(filePath, ForReading, False, -1),最后一个参数-1代表按Unicode(UTF-16 LE)编码读取,但该方式不支持UTF-8编码文件,通用性较差。 - 如果需要保留原文件的UTF-16编码,只需将上述代码中
stream.Charset的属性值改为unicode即可。 - 按照通用变更日志规范,不建议将新增内容直接追加到文件末尾,可调整字符串拼接逻辑,将新增更新插入到
## [Unreleased]节点下方,符合常规使用习惯。
内容的提问来源于stack exchange,提问作者delucaezequiel
相关产品推荐
相关产品推荐

