java 导入csv 文件反射调用Mapper接口

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,"导入数据成功");
    }

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值