吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3180|回复: 4
收起左侧

[Java 转载] JAVA获取广西水利各个水文站点水位和流量,各个站点的降雨量并生成Excel保存本地

   关闭 [复制链接]
大眼pro 发表于 2022-4-16 20:16
本帖最后由 大眼pro 于 2022-4-16 20:27 编辑

JAVA获取广西水利各个水文站点水位和流量,各个站点的降雨量并生成Excel保存本地


继上篇 JAVA爬虫获取气象数据 一位朋友联系我帮忙做一个小工具
打开网页 http://slt.gxzf.gov.cn/page/index.html?act=3
点击水情,点击查询
image.png
打开控制台(按F12)找到需要的接口
image.png
写一个水情实体类方便之后使用
[Java] 纯文本查看 复制代码
/**
 * 水情
 */
@Data
public class Water{
    /**编号*/
    private String ADDVCD;
    /**站点编号*/
    private String STCD;
    /**测站名称 */
    private String STNM;
    /**流域名称*/
    private String BSNM;
    /**水系名称*/
    private String HNNM;
    /**经度*/
    private String LGTD;
    /**纬度*/
    private String LTTD;
    /**流量(m3/s) */
    private String Q;
    /**河流名称 */
    private String RVNM;
    /**三聚磷酸钠 */
    private String STTP;
    /**时间*/
    private String TM;
    /**警戒水位(m) */
    private String WRZ;
    /**水位(m) */
    private String Z;
    /**超警戒(m)*/
    private String ZWRNDLT;
}

复制数据包导入到postman中
image.png
不会导入数据包的可以看上一篇
image.png
生成java代码放入项目中
雨情同理
点击雨情,选择条件查询
image.png
找到需要的接口

image.png
雨情实体类
[Java] 纯文本查看 复制代码
/**
* 雨情
*/
@Data
public class Rain {
    /**编号*/
    private String STCD;
    /**测站名称 */
    private String STNM;
    /**雨量(mm) */
    private String ACCP;
    /**站址 */
    private String STLC;
    /**经度 */
    private String LGTD;
    /**纬度 */
    private String LTTD;
    /**查询时间 */
    private String TIME;
}

需要注意的是雨情是需要传入参数
image.png
将数据包复制导入postman
image.png
image.png
java业务代码
[Java] 纯文本查看 复制代码
    @Value("${rain.startTime}")
    String startTime;
    @Value("${rain.endTime}")
    String endTime;
    @Value("${rain.range1}")
    boolean range1;
    @Value("${rain.range2}")
    boolean range2;
    @Value("${rain.range3}")
    boolean range3;
    @Value("${rain.range4}")
    boolean range4;
    @Value("${rain.range5}")
    boolean range5;
    @Value("${rain.range6}")
    boolean range6;
    @Value("${rain.range7}")
    boolean range7;

    /**
     * 雨情执行
     */
    @SneakyThrows
    @Scheduled(cron = "${rain.cron}")
    private void rain(){
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
        System.out.println("执行雨情,时间:"+ sdf.format(d));
        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        MediaType mediaType = MediaType.parse("application/json");
        /** 设置查询参数开始  可在yml文件定义*/
        JSONObject jsonObject = new JSONObject();
        String startTimes;
        String endTimes;
        if (startTime.isEmpty()){
            startTimes = sdf0.format(d);
        }else {
            startTimes = startTime;
        }
        if(endTime.isEmpty()){
            endTimes = sdf.format(d);
        }else {
            endTimes = endTime;
        }
        jsonObject.put("startTime",startTimes);
        jsonObject.put("endTime",endTimes);
        if(range1){
            jsonObject.put("range1","0");
        }
        if(range2){
            jsonObject.put("range2","0.1");
        }
        if(range3){
            jsonObject.put("range3","10");
        }
        if(range4){
            jsonObject.put("range4","25");
        }
        if(range5){
            jsonObject.put("range5","50");
        }
        if(range6){
            jsonObject.put("range6","100");
        }
        if(range7){
            jsonObject.put("range7","250");
        }
        /** 设置查询参数结束*/
        RequestBody body = RequestBody.create(mediaType, jsonObject.toJSONString());
        Request request = new Request.Builder()
                .url("http://slt.gxzf.gov.cn/gxsl/api/sl323/realtime/rain/history")
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .build();
        okhttp3.Response response = client.newCall(request).execute();
        String string = response.body().string();
        JSONObject parseObject = JSONObject.parseObject(string);
        JSONArray result = parseObject.getJSONArray("result");
        //生成EXCEl
        List<Rain> list = new ArrayList<Rain>(JSONArray.parseArray(result.toJSONString(), Rain.class));
        list.stream().forEach(s->s.setTIME(startTimes + "至" + endTimes));
        String[] header = {"编号", "测站名称", "雨量(mm)", "站址", "经度", "纬度", "查询时间"};
        export(list,header,"雨情\\执行雨情,时间:"+ sdf1.format(d),Rain.class);
    }

    /**
     * 水情执行
     */
    @SneakyThrows
    @Scheduled(cron = "${water.cron}")
    private void water(){
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
        System.out.println("执行水情,时间:"+ sdf.format(d));
        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        Request request = new Request.Builder()
                .url("http://slt.gxzf.gov.cn/gxsl/api/sl323/realtime/river/")
                .method("GET", null)
                .build();
        okhttp3.Response response = client.newCall(request).execute();
        String body = response.body().string();
        JSONObject jsonObject = JSONObject.parseObject(body);
        JSONArray result = jsonObject.getJSONArray("result");
        //生成EXCEl
        List<Water> list = new ArrayList<Water>(JSONArray.parseArray(result.toJSONString(), Water.class));
        list.stream().forEach(s->s.setTM(stampToTime(s.getTM())));
        String[] header = {"编号", "站点编号", "测站名称", "流域名称", "水系名称", "经度", "纬度", "流量(m3/s) "
                , "河流名称", "三聚磷酸钠", "时间", "警戒水位(m)", "水位(m)","超警戒(m)"};
        export(list,header,"水情\\执行水情,时间:"+ sdf1.format(d),Water.class);
    }

    /**
     * 将时间戳转换为时间
     * @param s 时间戳
     * @return
     */
    private static String stampToTime(String s){
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = new Long(s);
        //将时间戳转换为时间
        Date date = new Date(lt);
        //将时间调整为yyyy-MM-dd HH:mm:ss时间样式
        res = simpleDateFormat.format(date);
        return res;
    }

    /**
     * 导出
     * @param data list数据
     * @param header 头部
     * @param fileName 文件名
     * @param c 泛型类
     */
    private static void export(List<?> data, String[] header, String fileName, Class c) {
        String[] fieldNames = fieldName(c);
        Workbook wb = new HSSFWorkbook();
        int rowSize = 0;
        Sheet sheet = wb.createSheet();
        for (int i = 0; i < header.length; i++) {
            sheet.setColumnWidth(i,5000);
        }
        Row row = sheet.createRow(rowSize);
        row.setHeight((short)(30*20));
        for (int i = 0; i < header.length; i++) {
            row.createCell(i).setCellValue(header[i]);
        }

        try {
            for (int x = 0; x < data.size(); x++) {
                rowSize = 1;
                Row rowNew = sheet.createRow(rowSize + x);
                rowNew.setHeight((short)(25*20));
                for (int i = 0; i < header.length; i++) {
                    Object o = data.get(x);
                    for (int i1 = 0; i1 < fieldNames.length; i1++) {
                        String methodName = "get" + fieldNames[i].substring(0,             1).toUpperCase() + fieldNames[i].substring(1);//获取属性的get方法名
                        Method method = o.getClass().getMethod(methodName);
                        Object invoke = method.invoke(o);//获取属性值
                        if(invoke != null){
                            rowNew.createCell(i).setCellValue(invoke.toString());
                        }else {
                            rowNew.createCell(i).setCellValue("");
                        }

                    }
                }
            }
        } catch (Exception e) {

        }
        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(fileName+".xls");
            wb.write(outputStream);
        } catch (Exception e) {

        } finally {
            try {
                if (outputStream != null) {
                    outputStream.flush();
                    outputStream.close();
                }
            } catch (Exception e) {

            }
            try{
                if(wb != null){
                    wb.close();
                }
            } catch (Exception e){

            }
        }

    }

    private static String[] fieldName(Class clazz) {
        Field[] declaredFields = clazz.getDeclaredFields();
        String[] fieldNames = new String[declaredFields.length];
        for (int i = 0; i < declaredFields.length; i++) {
            fieldNames[i] = declaredFields[i].getName(); //通过反射获取属性名
        }
        return fieldNames;



    }


配置文件
server:
  port: 8088
rain:
  cron: 0 0 * * * ? #(每小时执行一次)
  startTime: # 格式 2022-04-14 08:00:00(不填默认今日0点)
  endTime: # 格式 2022-04-14 08:00:00(不填默认当前时间)
  range1: false #是否查询 0 (true 查询,false 不查询)
  range2: true #是否查询 0.1(true 查询,false 不查询)
  range3: true #是否查询 10(true 查询,false 不查询)
  range4: true #是否查询 25(true 查询,false 不查询)
  range5: true #是否查询 50(true 查询,false 不查询)
  range6: true #是否查询 100(true 查询,false 不查询)
  range7: true #是否查询 250(true 查询,false 不查询)
water:
  cron: 0 0 * * * ? #(每小时执行一次)
cron表达式是设置定时任务的,不会的可以直接在线生成
一个比较好用的在线在线生成器 https://www.bejson.com/othertools/cron/
image.png
最后生成jar包
image.png
点击开始(这个弹框不要关闭,关闭了说明就不会再执行)
image.png
定时任务默认每小时执行一次,也可以点击执行一次水情
image.png
查看水情目录文件
image.png
打开文件
image.png
点击执行一次雨情
image.png
查看雨情目录文件
image.png
打开文件
image.png
修改雨情查询参数在目录 获取数据\target\classes\application.yml
image.png
可以用记事本打开并进行修改(注意需要关闭并重启开始.bat)
image.png

最后 有需要帮做小工具或者小项目的朋友可以联系我

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sanyuebeichen 发表于 2022-4-17 00:56
来学习一下
无限苦肉盖神 发表于 2022-4-17 13:37
lipr_ren 发表于 2022-4-18 09:41
smallyz 发表于 2023-10-11 14:32
太厉害了 学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表