在使用C# NPOI读取.xlsx文件并转换为.csv格式时,中文出现乱码是一个常见问题。造成该问题的主要原因是在CSV文件写入过程中未正确设置编码格式,导致默认使用ASCII或非UTF-8编码保存文件。NPOI本身在读取Excel时能正确识别中文,但导出CSV时若未指定Encoding.UTF8,中文字符将无法正常显示。此外,部分文本编辑器(如记事本)对UTF-8带BOM和无BOM的识别差异也可能引发乱码。如何确保导出的CSV文件在各种环境下正确显示中文,是开发中需要解决的关键问题。
1条回答 默认 最新
祁圆圆 2025-07-08 15:00关注解决C# NPOI导出CSV中文乱码问题的深度解析
1. 问题现象与初步分析
在使用C# NPOI读取.xlsx文件并转换为.csv格式时,经常出现中文字符显示为乱码的问题。例如:
- 原本Excel中的“测试数据”变成CSV后的“?測試數據”;
- 打开CSV文件后发现中文被替换为问号或方块符号。
这一问题通常不是因为NPOI无法正确读取Excel中的内容,而是由于写入CSV文件时未指定正确的编码格式,导致默认使用ASCII或非UTF-8编码保存文件。
2. 编码基础知识回顾
编码类型 描述 ASCII 仅支持英文字符,不支持中文 UTF-8 广泛支持多语言字符,包括中文 UTF-8 with BOM 带有字节顺序标记(BOM),部分编辑器识别更友好 3. 问题根源剖析
- NPOI读取Excel时能自动识别中文字符集,因此不会出现乱码;
- 但在导出为CSV时,若使用StreamWriter默认构造函数,会使用ASCII编码写入文件;
- 部分文本编辑器(如Windows记事本)对无BOM的UTF-8文件识别存在偏差,导致乱码。
4. 解决方案与代码示例
为确保导出的CSV文件在各种环境下正确显示中文,应明确指定编码为UTF-8,并建议包含BOM头。
using System.IO; using System.Text; using NPOI.XSSF.UserModel; public void ConvertXlsxToCsv(string inputPath, string outputPath) { using (var fs = new FileStream(inputPath, FileMode.Open, FileAccess.Read)) { var workbook = new XSSFWorkbook(fs); var sheet = workbook.GetSheetAt(0); using (var writer = new StreamWriter(outputPath, false, new UTF8Encoding(true))) { foreach (var row in sheet) { var line = string.Join(",", row.Cells.Select(c => c.ToString())); writer.WriteLine(line); } } } }5. 验证与调试流程图
graph TD A[开始] --> B{是否使用UTF-8编码?} B -- 是 --> C[检查是否包含BOM] B -- 否 --> D[修改代码设置UTF8Encoding(true)] C --> E{是否所有编辑器都能正常显示?} E -- 是 --> F[问题解决] E -- 否 --> G[尝试不同编辑器验证]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报