Excel VBA导出工作表日文为UTF-8文本仅输出SJIS编码如何排查
VBA导出UTF-8编码日文文本的问题解决
问题定位
你的编码问题和Range区域取值逻辑完全无关,是SaveAs方法的参数配置错误导致的:
- 你使用的
FileFormat:=xlText参数对应的是系统默认ANSI编码,日文系统环境下默认就是Shift-JIS编码 - 额外加的
Local:=True参数会强制匹配Excel本地区域的编码规则,进一步锁死了SJIS的输出逻辑
修复方案
方案1:直接修改SaveAs参数(生成带BOM的UTF-8文件,适配Excel 2016及以上版本)
仅需要把你代码中SaveAs那行替换为以下内容即可:
ActiveWorkbook.SaveAs Filename:=fPath & fName, FileFormat:=xlTextUTF8, Local:=False
如果是Excel 2016以下的旧版本,无法识别xlTextUTF8常量,直接替换为对应的数值即可:
ActiveWorkbook.SaveAs Filename:=fPath & fName, FileFormat:=65001, Local:=False
这个方案生成的是带UTF-8 BOM的文本文件,绝大多数日文软件、系统都可以正常识别读取。
方案2:生成无BOM的UTF-8文件(适配特殊场景要求)
如果你的使用场景要求不能带BOM,Excel自带的SaveAs方法无法实现,需要改用ADODB.Stream对象写文件,完整修改后的代码参考:
Set rng = Range("A1").CurrentRegion ' 先把内容写到临时工作表,处理格式和删除首行 Workbooks.Add ActiveSheet.Cells.NumberFormatLocal = "@" rng.Copy ActiveSheet.Range("A1") Rows(1).Delete ' 用ADODB.Stream输出无BOM UTF-8 Dim stream As Object Set stream = CreateObject("ADODB.Stream") With stream .Charset = "UTF-8" .Mode = 3 .Type = 2 .Open ' 遍历单元格写入内容,按制表符分隔、换行符分行,可根据你的分隔需求修改 For i = 1 To ActiveSheet.UsedRange.Rows.Count rowContent = "" For j = 1 To ActiveSheet.UsedRange.Columns.Count rowContent = rowContent & Cells(i, j).Value & vbTab Next .WriteText Left(rowContent, Len(rowContent) - 1) & vbCrLf Next .Position = 3 ' 跳过BOM头 .SaveToFile fPath & fName, 2 .Close End With Set stream = Nothing ActiveWindow.Close SaveChanges:=False Worksheets("sheetname").Select Application.DisplayAlerts = True
内容的提问来源于stack exchange,提问作者SJ W
相关产品推荐
相关产品推荐

