读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件

读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件

工作中涉及很多提供文档数据,少则几条,多则上万,少的可以自己编辑一个,静态final来自己定义,一旦数太多得话,就得使用读取得方式了,高效又快捷。但是前提是文档得编码都是string 格式(高手可以不更改),也就是excel中得文本格式,否则会出现读取异常。

首先,将EXCEL所有文本/数字数据都改为文本样式

在这里插入图片描述
文本与数字得明显区分即为有没有绿色得三角,有绿色三角得 是正常得文本格式,下边得111 不带绿三角,再读取过程中就会出错。

变更方式》》》 1 选中全是数字得列,2 选择数据,3选择分列,在这里插入图片描述
4 选择固定宽度,下一步,再点下一步,5选择文本,然后点完成即可。
在这里插入图片描述

这样再只用读取列得时候就不会出现读取数字异常了,当然了,高手得话可以掠过这一步,使用不同得取值方法,应该是可以得。

文档准备好了,然后就是重中之重,
代码部分相对简单,但是对于多列得数据,逻辑方面还需要自己去扣

------------------------------------代码分割线-----------------------------------------

第一部分 整体调用

logger.info("开始读表");
        List<String> strings = readExcel();
        logger.info("结束读表" + JSON.toJSONString(strings));
        logger.info("开始调用API");
        HashMap<String, String> stringStringHashMap = ampApi(strings);
        logger.info("结束调用API" + JSON.toJSONString(stringStringHashMap));
        logger.info("开始输出Excel");
        loadExcel(stringStringHashMap);
        logger.info("输出Excel完成");

注释:1 readexcel 中由于我只需要一列得数据,所以就只返回了 一列得集合
2调用接口反,是根据1中得结果,去调接口,再反结果,也就是 map得key是1得结果,map得value是调接口后得结果
3,将数据输出 会增加一列文本得输出

第二部分 读取EXCEL

 /**
     * .
     *
     * @Description: 作用: 读取Excel某一列地址
     * @Author: LXT
     * @Date: 2021/11/15 14:00
     */
    public static List<String> readExcel() {
        List<String> columnList = new ArrayList<String>();
        File file = new File("C:\\Desktop\\XXX.xls");
        try {
            FileInputStream in = new FileInputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook(in);
            //获取第几个sheet页
            Sheet sheet = wb.getSheetAt(0);
            //取第一行
            int firstRowNum = sheet.getFirstRowNum();
            //取最后一行
            int lastRowNum = sheet.getLastRowNum();
            Row row = null;
            Cell cell_a = null;
            Cell cell_b = null;
            for (int i = firstRowNum; i <= lastRowNum; i++) {
                row = sheet.getRow(i);          //取得第i行
                cell_a = row.getCell(2);        //取得i行的第几列
                //这里如果是数字格式会异常,所以前边需要全部转为文本格式
                String cellValue = cell_a.getStringCellValue().trim();
                columnList.add(cellValue);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return columnList;
    }

代码就这一丢丢,相对简单,就是读取excel,然后读取全部得行数,再将没一行中选定得列数据放到集合返回。如果需要多列,或者其他数据,记得修改反参,自定义一下反参数据即可。

第三部分 调用API

 /**
     * .
     *
     * @return com.common.EzgServiceResult
     * @Description: 作用:  高德地图api
     * @Author: LXT
     * @Date: 2021/11/15 13:54
     */
    public static HashMap<String, String> ampApi(List<String> list) {
        logger.info("高德地图api");
        HashMap<String, String> map = new HashMap<>();
        for (String address : list) {
            logger.info("高德地图api---" + address);
            // 返回输入地址address的经纬度信息, 格式是 经度,纬度
            String queryUrl = "https://restapi.amap.com/v3/geocode/geo?address=" + address + "&output=JSON&key=" + ampKey;
            String queryResult = getResponse(queryUrl);
            logger.info("高德地图反参---" + address);
            JSONObject job = JSONObject.parseObject(queryResult);
            if (job.get("status").toString().equals("0")){
                logger.error("高德地图反参---" + address);
            }else {
                if (!job.get("count").toString().equals("0")) {
                    JSONObject jobJSON = JSONObject
                            .parseObject(job.get("geocodes").toString().substring(1, job.get("geocodes").toString().length() - 1));
                    String DZ = jobJSON.get("location").toString();
                    map.put(address, DZ);
                }
            }
        }
        return map;
    }

这块得话其实更简单,就是遍历得到得excel得数据 然后取调用其他接口,我这里是自己需要一个地点得经纬度,文档数据就是上万个地点名称,我调高德api,然后返回这个地点得经纬度字符串,当然了,是用 ,链接再一起得字符串,
这里就能随意发挥了,比如数据落库了,数据放缓存了等等。

第三部分 数据输出

 /**
     * .
     *
     * @Description: 作用: 读取Excel某一列地址,后存入两列 经度和纬度
     * @Author: LXT
     * @Date: 2021/11/15 14:00
     */
    public static void loadExcel(HashMap<String, String> stringStringHashMap) {
        //读取文档
        File file = new File("C:\\Desktop\\XXX.xls");
        List<String> isNull = new ArrayList<>();
        try {
            FileInputStream in = new FileInputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook(in);
            Sheet sheet = wb.getSheetAt(0);
            int firstRowNum = sheet.getFirstRowNum();
            int lastRowNum = sheet.getLastRowNum();
            Row row = null;
            Cell cell_a = null;
            Cell cell_b = null;
            for (int i = firstRowNum; i <= lastRowNum; i++) {
                row = sheet.getRow(i);          //取得第i行
                Cell cell = row.getCell(2);
                String cellValue = cell.getStringCellValue().trim();
                logger.info("取值excel" + cellValue);
                //之前得同  第二步,读取excel
                //这里是用取到得值,去反参得map里匹配
                String s = stringStringHashMap.get(cellValue);
                logger.info("取值map" + s);
                if (null != s && s.contains(",")) {
                	//如果有得话  就使用,进行分割,第三增加经度列
                    cell_a = row.getCell(3);        //经度列
                    cell_a.setCellValue(s.split(",")[0]);
                    //如果有得话  就使用,进行分割,第四增加经度列
                    cell_b = row.getCell(4);        //纬度列
                    cell_b.setCellValue(s.split(",")[1]);
                }else {
                    isNull.add(s);
                }
            }
            logger.info("为null地址" + JSON.toJSONString(isNull));
            //数据 放好之后 使用一个新得文档 经行输出 就得到新的文档数据了
            FileOutputStream fileOutputStream = new FileOutputStream("C:Desktop\\XXX-2.xls");
            wb.write(fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这里相当于是将 一 二 步进行了数据整合 , 也没啥技术含量,就是遍历比对,其实三大步完全可以放到一个里, 读取数据,调接口,放置新数据,一条就能执行,不需要分三步走。

大概得步骤就是这样,由于不是上线用,只是需要一些数据得转换,所有没有什么优化可叹,就是遍历,两万数据大概 半小时吧。需要得话记得优化一下。这么干遍历属实有点过分。

好咯,就这样吧,记得点赞!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值