使用Apache Commons CSVPrinter生成CSV时行首出现多余分号求助
解决Apache Commons CSV打印时行首出现多余分号的问题
你的代码存在几个关键错误,直接导致了行首多余分号的出现:
- 手动调用
csvPrinter.print("\n")换行,会在新行开头留下空占位,后续printRecord会自动补充分隔符 - 循环中每个字段单独调用
printRecord,还手动给字段追加;,这会让每个字段被当作独立记录,手动添加的分隔符和CSVPrinter自动生成的分隔符重复,彻底打乱格式 keySet()遍历顺序不固定,会导致字段和表头顺序不匹配(额外提醒,虽不是当前问题,但会引发CSV数据错位)
修正后的代码
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.io.StringWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public static String createCsvFile(JsonArray array, HttpServletResponse response) { if (array.isEmpty()) { return ""; } // 固定表头顺序,避免keySet遍历顺序不确定的问题 List<String> header = new ArrayList<>(array.get(0).getAsJsonObject().keySet()); try (StringWriter stringWriter = new StringWriter(); CSVPrinter csvPrinter = new CSVPrinter(stringWriter, CSVFormat.newFormat(';') .withHeader(header.toArray(new String[0])))) { for (JsonElement element : array) { JsonObject values = element.getAsJsonObject(); // 按表头顺序收集每行字段值,保证和表头对应 List<String> rowValues = header.stream() .map(key -> values.get(key).toString()) .collect(Collectors.toList()); // 一次性打印整行,由CSVPrinter自动处理分隔符和换行 csvPrinter.printRecord(rowValues); } csvPrinter.flush(); return stringWriter.toString(); } catch (IOException e) { throw new RuntimeException(e); } }
关键修正说明
- 用
try-with-resources自动管理资源,避免手动关闭引发的泄漏问题 - 用
ArrayList存储表头,固定遍历顺序,保证每行字段和表头一一对应 - 使用
CSVFormat.withHeader()规范设置表头,替代手动打印表头的操作 - 按表头顺序收集整行字段值,一次性调用
printRecord打印整行,彻底去掉手动换行和手动添加的分隔符,让CSVPrinter自动处理格式
修正后生成的CSV不会再出现行首多余分号,字段分隔符只会在字段之间正常显示。
内容的提问来源于stack exchange,提问作者Mateus Bodanese
相关产品推荐
相关产品推荐

