如何将Sql查询出的结果导出成csv文件
核心思想:
1、执行sql,封装查询出的结果。
2、导入javaCSV包
3、迭代遍历查询结果,写入文件。
第一步:封装成List<HashMap<String, Object>>
每一行是一个HashMap,Key为列表。
第二步:导包
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
第三步:写入
/**
*接收查询结果,存储文件名
* @param defiled_info sql查询结果
* @param fileName fileName为下载文件名,防止文件重名覆盖,可加入时间戳
*/
public static void defiled_csv(List<HashMap<String, Object>> defiled_info,String fileName) {
String rootPath = "";
if(fileName == null){
rootPath = "D:/file_"+ System.currentTimeMillis()+".csv";
}else {
rootPath = "D:/"+fileName+System.currentTimeMillis()+".csv";
}
//第一个参数为文件存储路径,第二个为指定导出的文件字段间的间隔符,第三个参数为转出编码
CsvWriter csvWriter = new CsvWriter(rootPath, '|', Charset.forName("GBK"));
//需要确保查询的结果不能为空,也可以在这做判断,不为空才能自动取表头,不然需要手动传入表头
HashMap<String, Object> hashMap = defiled_info.get(0);
Set<String> defiled_sets = hashMap.keySet();
try {
if (defiled_sets.size() > 0) {
for (String key : defiled_sets) {
//写入表头信息
csvWriter.write(key, false);
}
//换行
csvWriter.endRecord();
}
//写入类容信息
for (int k = 0; k < defiled_info.size(); k++) {
HashMap<String, Object> infos = defiled_info.get(k);
for (String key : defiled_sets) {
//如果某字段为空,这转义为字符串"null"
if(infos.get(key) == null){
csvWriter.write("null");
}else {
csvWriter.write(infos.get(key).toString());
}
}
csvWriter.endRecord();
}
//关闭流
csvWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}