1.引入pom依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.6</version>
</dependency>
2.创建工具类 CsvUtils
也可以自己在网上找模板,我也是网上借鉴的
public class CsvUtils {
/**
* io流导出
* @author kpzc
* @date 2018年12月29日 下午3:48:34
* @param file csv文件(路径+文件名),csv文件不存在会自动创建
* @param dataList 数据,字符串用逗号分隔
* @return 返回导出是否成功 true成功 false失败
*/
public static boolean exportCsv(File file, List<String> dataList){
boolean isSucess=false;
FileOutputStream out=null;
OutputStreamWriter osw=null;
BufferedWriter bw=null;
try {
out = new FileOutputStream(file);
//解决FileOutputStream中文乱码问题 解决MS office乱码问题
osw = new OutputStreamWriter(out, "GBK");
bw =new BufferedWriter(osw);
if(dataList!=null && !dataList.isEmpty()){
for(String data : dataList){
bw.append(data).append("\r");
}
}
isSucess=true;
} catch (Exception e) {
isSucess=false;
}finally{
if(bw!=null){
try {
bw.close();
bw=null;
} catch (IOException e) {
e.printStackTrace();
}
}
if(osw!=null){
try {
osw.close();
osw=null;
} catch (IOException e) {
e.printStackTrace();
}
}
if(out!=null){
try {
out.close();
out=null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return isSucess;
}
/**
* 导入
* @author kpzc
* @date 2018年12月29日 下午3:48:11
* @param file csv文件(路径+文件)
* @return 返回List<String>列表
*/
public static List<String> importCsv(MultipartFile file){
List<String> dataList=new ArrayList<String>();
BufferedReader br=null;
try {
br = new BufferedReader(new InputStreamReader(file.getInputStream(), "UTF-8"));
String line = "";
while ((line = br.readLine()) != null) {
dataList.add(line.replace("\"",""));
}
}catch (Exception e) {
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
br=null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return dataList;
}
/**
* apache commons-csv导出
* 注意jdk要在1.7及以上使用
* map的数据个数要与header的个数相等 并且一一对应,可参照main方法
* @author kpzc
* @date 2019年1月4日 上午10:12:20
* @param filePath 文件存储路径
* @param list 数据列表
* @param header 表头
*/
public static void write(String filePath, List<LinkedHashMap<String, String>> list, String... header) {
try {
FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(header);
CSVPrinter csvPrinter = new CSVPrinter(osw, csvFormat);
//跟上面两行代码是一样的
//CSVPrinter csvPrinter = CSVFormat.DEFAULT.withHeader(header).print(osw);
for (Map<String, String> map : list) {
csvPrinter.printRecord(map.values());
}
csvPrinter.flush();
csvPrinter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.创建SpringContextUtil 获取上下文对象
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext appCtx = null;
/**
* @param applicationContext
* ApplicationContext.
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appCtx = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return appCtx;
}
public static Object getBean(String beanName) {
return appCtx.getBean(beanName);
}
}
4.导入文件类
@Override
public ResultInfo importFile(ImportRo importRo, HttpServletRequest request) {
String path = "com.senhua.dao." + importRo.getEntityName() + "Mapper";//Mapper文件都是放在此目录下,所以写死了
List<String> list = CsvUtils.importCsv(importRo.getFile());
//System.out.println("list = " + list.get(1));
try{
if(!list.isEmpty()){
Class c = Class.forName(path);
// 得到对象中所有的方法
Method[] methods = c.getMethods();
Class param = null;
Field[] fields = null;
for (int i = 0; i < methods.length; i++) {
if(methods[i].getName().equals("insertSelective")){
Class[] paramTypes = methods[i].getParameterTypes();//获取方法参数类型
param = paramTypes[0];
// 得到对象中所有的属性
fields = param.getDeclaredFields();
}
}
//获取反射类方法
Method m = c.getMethod("insertSelective",param);
boolean flag = false;
for(int i=1;i<list.size();i++){
//实例化参数类,这一步很重要
Object paramClass = param.newInstance();
String[] data = list.get(i).split(",",-1);
for (int j=0;j<fields.length;j++) {
Field field = fields[j];
if(field.getName().equals("serialVersionUID")){
flag = true;
continue;
}
int num = flag?j-1:j;
// 取消属性的访问权限控制,即使private属性也可以进行访问。
field.setAccessible(true);
// 获取属性的名字
String name = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
String typeName = field.getType().toString();
Method m1 = param.getMethod("get" + name);
//下面的操作就是给字段赋值
switch (typeName){
case "class java.lang.Long":
m1 = param.getMethod("set"+name,Long.class);
if(name.equals("Id")){
m1.invoke(paramClass,idWorker.nextId());
}else {
m1.invoke(paramClass,Long.valueOf(data[num]));
}
break;
case "class java.lang.Integer":
m1 = param.getMethod("set"+name,Integer.class);
if(name.equals("Id")){
}else {
if(num==43){
System.out.println(num);
System.out.println("importRo = " + data[num] + ", request = " + data[num].equals("") + "");
}
if(data[num].equals("")||data[num]==null){
m1.invoke(paramClass,0);
}else{
m1.invoke(paramClass,Integer.valueOf(data[num]));
}
}
break;
case "class java.math.BigDecimal":
m1 = param.getMethod("set"+name,BigDecimal.class);
m1.invoke(paramClass,BigDecimal.valueOf(Long.valueOf(data[num])));
break;
case "class java.util.Date":
m1 = param.getMethod("set"+name,Date.class);
if(data[num].equals("")||data[num]==null){
}else{
m1.invoke(paramClass,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(data[num].replace("/","-")));
}
break;
case "class java.lang.String":
m1 = param.getMethod("set"+name,String.class);
m1.invoke(paramClass,data[num]);
break;
default:
break;
}
}
String beanName = importRo.getEntityName().substring(0, 1).toLowerCase() + importRo.getEntityName().substring(1)+"Mapper";
Object o = m.invoke(SpringContextUtil.getBean(beanName), paramClass);//这里有用到SpringContextUtil方法,使用上下文去获取bean对象,注意bean 的名称首字母小写
}
}
}catch (Exception e){
e.printStackTrace();
return new ResultInfo(CodeEnum.ERROR,"数据解析异常");
}
return new ResultInfo(CodeEnum.SUCCESS,"导入数据成功");
}