如何使用Apache Commons CSV写入带UTF-8 BOM的Excel格式CSV文件?
解决方案:Java写入带UTF-8 BOM的CSV文件(结合Apache Commons工具)
当然支持写入带UTF-8 BOM的文件啦!你提到Apache Commons IO只有BOMInputStream,其实它还有对应的BOMOutputStream类可以用来写BOM,另外也可以手动写入BOM头,结合Apache Commons CSV轻松完成需求。下面给你两种实用方案:
方案一:手动写入UTF-8 BOM头 + Apache Commons CSV
UTF-8 BOM本质就是三个固定字节:0xEF, 0xBB, 0xBF,我们可以先把这三个字节写入文件开头,再用Commons CSV写入具体内容。
示例代码:
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; public class CsvWithBomWriter { public static void main(String[] args) throws Exception { File csvFile = new File("output_with_bom.csv"); // 1. 先写入UTF-8 BOM头 try (FileOutputStream fos = new FileOutputStream(csvFile)) { fos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}); // 2. 用Commons CSV写入内容 try (OutputStreamWriter writer = new OutputStreamWriter(fos, StandardCharsets.UTF_8); CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("列1", "列2", "列3"))) { printer.printRecord("内容1", "内容2", "内容3"); printer.printRecord("中文测试", "UTF-8", "BOM"); } } } }
方案二:使用Apache Commons IO的BOMOutputStream(更优雅)
Commons IO其实提供了BOMOutputStream,它可以自动为输出流添加指定编码的BOM,不用手动处理字节,代码更简洁:
示例代码:
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.io.output.BOMOutputStream; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; public class CsvWithBomWriter { public static void main(String[] args) throws Exception { // 用BOMOutputStream包装输出流,指定UTF-8编码 try (FileOutputStream fos = new FileOutputStream("output_with_bom.csv"); BOMOutputStream bomOs = new BOMOutputStream(fos, StandardCharsets.UTF_8); OutputStreamWriter writer = new OutputStreamWriter(bomOs, StandardCharsets.UTF_8); CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("列1", "列2", "列3"))) { printer.printRecord("内容1", "内容2", "内容3"); printer.printRecord("中文测试", "UTF-8", "BOM"); } } }
注意事项
- 确认你的Apache Commons IO版本足够新(至少2.4+,
BOMOutputStream是在2.4版本加入的) - Excel识别UTF-8 CSV时依赖BOM,这种写法能确保Excel打开不会出现乱码问题
- 如果你用的是旧版Commons IO没有
BOMOutputStream,方案一的手动写入方式完全兼容所有版本
内容的提问来源于stack exchange,提问作者6H057845H
相关产品推荐
相关产品推荐

