1、导入的jar包
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
2、公共返回类R
@Data
@NoArgsConstructor
public class R<T> {
private int code;
private String msg;
private T data;
public static R ok(){
R r = new R();
r.setCode(200);
r.setMsg("成功");
return r;
}
public static R error(){
R r = new R();
r.setCode(444);
r.setMsg("失败");
return r;
}
public R data(T data){
this.setData(data);
return this;
}
}
3、csv工具类
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Iterator;
import com.csvreader.CsvWriter;
import lombok.extern.slf4j.Slf4j;
/**
* 类名称: CsvUtil
* 类描述: 文件操作
*/
@Slf4j
public class CsvUtil {
/**
* Description: 将List<T>类型数据以csv存储至本地
* list:list<T>
* csvFilePath: 如D:/XXX/DATA20190821.csv
* csvHeaders:表头
*/
public static <T> void writeCSV(Collection<T> list,String csvFilePath,String[] csvHeaders) {
try {
log.info("<--------CSV文件开始写入-------->");
// 定义路径,分隔符,编码
CsvWriter csvWriter = new CsvWriter(csvFilePath, ',', Charset.forName("UTF-8"));
// 写表头
csvWriter.writeRecord(csvHeaders);
// 写内容
//遍历集合
Iterator<T> it = list.iterator();
while (it.hasNext()) {
T t = (T) it.next();
//获取类属性
Field[] fields = t.getClass().getDeclaredFields();
String[] csvContent=new String[fields.length];
for (short i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
if (value == null) {
continue;
}
//取值并赋给数组
String textvalue= value.toString();
csvContent[i]= textvalue;
}catch (Exception e) {
e.getStackTrace();
}
}
//迭代插入记录
csvWriter.writeRecord(csvContent);
}
csvWriter.close();
log.info("<--------CSV文件写入成功-------->");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4、测试
@RestController
@RequestMapping("/csv")
public class CsvController {
@Autowired
private ChinaService chinaService;
@GetMapping("/mysqlToCsv")
public R mysqlToCsv(){
// 从mysql中查数据
List<China> list = chinaService.getAll();
//1.设置存储路径和文件名
String filePath="D:\\china.csv";
//2.表头 ( 表头数组中的数据一般与数据库表中的字段名对应 )
String[] csvHeaders = {"fid","the_geom","sheng"};
CsvUtil.writeCSV(list,filePath,csvHeaders);
return R.ok();
}
}
5、结果
这里乱码了,可能是因为csv文件编码格式不一样,我用文本打开就没有乱码。