读取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();
}
}
这里相当于是将 一 二 步进行了数据整合 , 也没啥技术含量,就是遍历比对,其实三大步完全可以放到一个里, 读取数据,调接口,放置新数据,一条就能执行,不需要分三步走。
大概得步骤就是这样,由于不是上线用,只是需要一些数据得转换,所有没有什么优化可叹,就是遍历,两万数据大概 半小时吧。需要得话记得优化一下。这么干遍历属实有点过分。
好咯,就这样吧,记得点赞!!!