如何将MySQL查询结果集导出为CSV格式?Java基于OpenCSV实现时格式异常求助
代码问题排查与修正
- 列值与表头映射错位:代码硬编码的表头顺序为
id、id_name、name、attribute_name、values,但循环写入数据时,data数组的第3位(索引3)直接取values字段值,第4位(索引4)取data_part字段值,完全漏过了attribute_name列的取值,所有数据行的列值和对应表头完全错位,打开CSV后会出现列名和内容不匹配的问题。 - 资源未自动释放导致文件损坏:代码没有对数据库连接、查询结果集、文件输出流做关闭处理,大结果集导出时会出现流未完全写入就被系统回收的情况,直接造成CSV文件末尾截断、格式残缺。
- OpenCSV默认配置不兼容通用CSV读取工具:无参构造的
CSVWriter默认使用单引号作为字段包裹符、反斜杠作为转义符,和Excel等常用工具默认识别的双引号包裹、双引号转义的CSV标准不兼容,打开文件时会出现字段拆分错误、内容串列的问题。 - 空值写入异常:循环赋值时没有对数据库返回的null值做兼容处理,字段值为null时会直接被写为空,进一步打乱列对齐规则。
修正核心代码逻辑
// 采用try-with-resources语法自动回收所有资源,手动指定兼容通用标准的CSV写入配置 try ( Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/employee", "root", "root"); PreparedStatement statement = con.prepareStatement(sql); ResultSet rs = statement.executeQuery(); CSVWriter writer = new CSVWriter( new FileWriter(file), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END ) ) { // 严格按照表头顺序匹配查询字段取值 String[] header = {"id", "id_name", "name", "attribute_name", "values"}; writer.writeNext(header); while (rs.next()) { writer.writeNext(new String[]{ String.valueOf(rs.getInt("id")), String.valueOf(rs.getInt("id_name")), rs.getString("name"), rs.getString("attribute_name"), // 补上对应表头列的取值,保证顺序匹配 rs.getString("data_part") }); } }
内容的提问来源于stack exchange,提问作者user15316614
相关产品推荐
相关产品推荐

