- java写入csv,可以使用下面的方法
public String uploadCsv(JSONObject map,String Id, JSONArray idRecordList, String date,String[] tag) {
//开启日志,不要可以省略
LOGGER.info("目标:" + Id + ",共需上传:" + 1 + "个文件。");
String strategy_id = map.getString("strategy_id");
//创建本地目录
File file = FileUtil.mkdir(System.getProperty("user.dir") + File.separator + "data" + File.separator + date);
//创建目录下的临时文件
File tmp = new File(file.getPath() + File.separator +Id + ".csv");
//设置编码
CsvWriter writer = CsvUtil.getWriter(tmp, CharsetUtil.CHARSET_UTF_8);
try {
//写表头字段名
String[] headers ={
};
writer.write(headers);
//循环数据
for (int i = 0; i < idRecordList.size(); i++) {
JSONObject record = idRecordList.getJSONObject(i);
String[] rs = new String[headers.length];
for (int j = 0; j < headers.length; j++) {
String key = headers[j];
}
writer.write(rs);
}
//这里文件就已经在本地生成了
} catch (Exception e) {
e.printStackTrace();
} finally {
writer.flush();
writer.close();
}
}
2.调用上面方法导出
但在导出时,有时会遇到一个问题,这个是我踩的比较大的坑,就是bbb的值出现在了name的值后面,导致后面的数据错位,如下图所示:
debugger发现每个字段都获取到对应的值了,但是写入的时候出现了这种情况,我把bbb从第三列设置在第四列,发现第三列的值依旧写入在了第二列的单元格里,因此问题不是后面的字段,而是第二列的字段,最后我得出了两种解决办法:
- 将第二列换到导出的最后一列,就是写headers时写在最后一个,这样就不会有数据添加在它的单元格里,这个就是不要求导出列的顺序的情况下可采用
- 第二个就是在获取第二列的值时,记得添加"\n"换行符,这种方式不会影响导出的列顺序
for (int j = 0; j < headers.length; j++) {
String key = headers[j];
if (key.equals("id")) {
rs[j] = record.getString(key);
} else if (key.equals("name")) {
rs[j] = record.getString(key)+"\n";
}
问题就成功解决啦