pom:
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.6</version>
</dependency>
CsvPosition:
package com.sdkj.exceltest.annotation;
import java.lang.annotation.*;
/**
* @author javachen
* @version 1.0.0
*/
@Documented
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface CsvPosition{
//索引位置
public int index() default 0;
}
CsvUtils:
package com.sdkj.exceltest.utils;
import com.sdkj.exceltest.annotation.CsvPosition;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author javachen
* @description
*/
public class CsvUtils {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static Object evalField(Object obj,String [] str) throws Exception {
//判断实体类内容是否为空
if(null == obj){
return "";
}
//获取实体类对象class
Class objClass = obj.getClass();
//获取类声明的变量
Field[] objFieldArray = objClass.getDeclaredFields();
//进行比对处理
for (int i = 0; i < objFieldArray.length; i++) {
Field objField = objFieldArray[i];
//获取对象的自定义注解内容
CsvPosition csvPosition = objField.getAnnotation(CsvPosition.class);
//判断变量是否有自定义注解
boolean flag = objField.isAnnotationPresent(CsvPosition.class);
if(flag){
//获取变量名称
String fieldName = objField.getName();
//获取变量的get set方法
String setMethodName = "set"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
Field field = obj.getClass().getDeclaredField(fieldName);
Method setMethod = obj.getClass().getDeclaredMethod(setMethodName,
field.getType());
setMethod.invoke(obj, str[csvPosition.index()]);
}
}
return obj;
}
}
ExcelTest:
package com.sdkj.exceltest.entity;
import com.sdkj.exceltest.annotation.CsvPosition;
import lombok.Data;
import java.io.Serializable;
@Data
public class ExcelTest implements Serializable {
@CsvPosition(index = 0)
private String id;
@CsvPosition(index = 1)
private String jgmc;
@CsvPosition(index = 2)
private String gmc;
}
test:
@Test
public void test5() {
Integer SIZE = 1000;
String path = "D://test001.csv";
try {
DataInputStream in = new DataInputStream(new FileInputStream(new File(path)));
CSVReader csvReader = new CSVReader(new InputStreamReader(in, "utf-8"), CSVParser.DEFAULT_SEPARATOR,
CSVParser.DEFAULT_QUOTE_CHARACTER, CSVParser.DEFAULT_ESCAPE_CHARACTER, 2);
String[] strs;
List<ExcelTest> list = new ArrayList<>();
int i = 0;
while ((strs = csvReader.readNext()) != null) {
ExcelTest excelTest = new ExcelTest();
excelTest= (ExcelTest) CsvUtils.evalField(excelTest,strs);
list.add(excelTest);
i++;
// 当 list 到达单批次最大数量后,执行保存数据操作,并清空list
if (i==SIZE){
excelTestService.batchAdd(list);
list.clear();
i = 0;
}
}
// 跳出循环后,判断里面有没有数据 防止有数据遗漏
if (null!=list&&list.size()>0){
excelTestService.batchAdd(list);
}
// 关闭流
csvReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}