使用POI将excel文件导入到数据库

news2025/7/10 22:03:36

概要

随着时代变化,有的需求也会越来越多,例如:有的文件上千条数据需要导入数据库不可能手动一条条导入吧?太浪费时间了!所以需要编写程序让程序来导入

整体架构流程

我这里使用的是springboot+mybatis+MVC的项目架构使用的poi实现的导入功能

技术细节

前端代码:

        // //选完文件后不自动上传
        var fileListView= $('#fileList')
            ,uploadListIns = upload.render({
            elem: '#selectFile'
            ,url: 'companyManage/uploadFiles'//上传的接口
            ,data: {'regionlId':comId ? comId : regionlId}
            ,size: 1024*10
            ,auto: false
            ,accept: 'file'
            ,exts:'xls|xlsx'
            ,multiple: false
            ,number:1
            ,bindAction: '#uploadFile'//上传按钮
            ,choose: function(obj){
                var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
                //读取本地文件
                obj.preview(function(index, file, result){
                    var tr = $(['<tr id="upload-'+ index +'">'
                        ,'<td>'+ file.name +'</td>'
                        ,'<td>'+ (file.size/1024).toFixed(1) +'kb</td>'
                        ,'<td>等待上传</td>'
                        ,'<td>'
                        ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>'
                        ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>'
                        ,'</td>'
                        ,'</tr>'].join(''));

                    //单个重传
                    tr.find('.demo-reload').on('click', function(){
                        obj.upload(index, file);
                    });

                    //删除
                    tr.find('.demo-delete').on('click', function(){
                        delete files[index]; //删除对应的文件
                        tr.remove();
                        uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
                    });

                    fileListView.append(tr);
                });
            }
            ,progress: function(n, elem){
                loading = layer.msg('正在上传文件,并检查数据格式!!!', {icon: 16, shade: 0.3, time:0});
            }
            ,done: function(res, index, upload){
                console.log(res);
                layer.close(loading);
                // if(res.code==200){ //上传成功
                var tr = fileListView.find('tr#upload-'+ index)
                    ,tds = tr.children();
                tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
                tds.eq(3).html(''); //清空操作

                $('#save').css("display","block");
                $('#del').css("display","block");
                console.log(res)
                return delete this.files[index]; //删除文件队列已经上传成功的文件
                this.error(index, upload);
            }
            ,error: function(index, upload){
                var tr = fileListView.find('tr#upload-'+ index)
                    ,tds = tr.children();
                tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
                tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
            }
        });

后端代码:

这是接收创建临时表然后先将前端的数据存入到临时表内然后比对临时表中有无相同的数据,有的话将一个字段设为标识字段然后对此条数据进行标识,点击保存的时候比对完的临时表再去和实体的表再次比对将共同数据排除将新数据存入实际的表内

@RequestMapping("/uploadFiles")
    @ResponseBody
    public JsonTableResult importExcel(MultipartFile file, HttpServletRequest request,Integer regionlId) throws Exception {
        System.err.println("123456");
//        HttpSession session = MyHttpServletRequest.getSession(request);
        if (regionlId == null) {
            throw new NoLoginException("未登录");
        }
        Integer companyId = regionlId;
        //添加临时表
        testmapper.dropTable("house"+companyId);
        //添加临时表
        testmapper.createTable("house"+companyId);
        //将Excel导入进去
        testservice.importExcel(file,"house"+companyId,companyId);

        return new JsonTableResult("删除成功");

    }

这是创建临时表之前先删除临时表,两条sql可以写成一条的但是MariaDB的写法比较严谨我尝试了但是不行就分开写了,创建临时表时要多写两个字段用于进行数据的标识,标识完成就可以在临时表里导入了
以下代码是导入临时表,这里是在实体类的pom文件内导入了poi的依赖引用poi的方法进行获取文件判断类型获取数据对数据进行各种操作

   <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
            <scope>compile</scope>
        </dependency>

 @Override
    public void importExcel(MultipartFile file, String s, Integer companyId) throws Exception {
        List<LPGcylinderVO> list = new ArrayList<LPGcylinderVO>();
        String name = file.getOriginalFilename();//获取到文件的名称
//        s="##"+s;
        if (file.isEmpty()) {//判断是否是个空文件

            throw new Exception("文件内容为空,请检查后重新上传!") ;
        }
        if (name.endsWith(".xls") || name.endsWith(".xlsx")) {//判断是什么结尾的,如果不是这两种的其中一种那就是文件上传类型是错误的
            //查看文件是以什么结尾的,再去进行解析
            Workbook workbook= WorkbookFactory.create(file.getInputStream());
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
            //Sheet sheet = workbook.getSheet("瓶装气基本信息");//读取上传表格中下标名为Sheet的表格
            int num = sheet.getLastRowNum();//获取最后一行行标,行标是从0开始,所以比实际行数小1
            for (Row row : sheet) {
                if (row.getRowNum() == 0) {
                    //判断列名是否是样表列名,不允许修改列名
                    String[] header = {"钢瓶企业名称", "钢瓶制造单位", "制造日期", "钢瓶标签号", "容积", "最大充装量", "上次检验时间", "下次检验时间", "技防设施配备情况", "备注信息"};
                    for (int i = 0; i < header.length; i++) {
                        if (!header[i].equals(row.getCell(i).toString().trim())) {
                            throw new Exception("表格不匹配,请严格按照样表格式填写!!!");
                        }
                    }
                    continue;
                }
            }

           //5.遍历excel每一行
            //不能j等于0,等于0相当于是从你的表头开始添加,所以不能是0,应该为1
            for (int j = 1; j <= num; j++) {
                Row row1 = sheet.getRow(j);
                // 如果单元格中有数字或者其他格式的数据,则调用setCellType()转换为string类型
                Cell cell1 = row1.getCell(0);
                cell1.getStringCellValue();
                //获取表中第i行,第2列的单元格
                Cell cell2 = row1.getCell(1);
                cell2.getStringCellValue();
                //获取excel表的第i行,第3列的单元格
                Cell cell3 = row1.getCell(2);
                cell3.setCellType(Cell.CELL_TYPE_STRING);
                cell3.getStringCellValue();
                Cell cell4 = row1.getCell(3);
                cell4.setCellType(Cell.CELL_TYPE_STRING);
                cell4.getStringCellValue();
                Cell cell5 = row1.getCell(4);
                cell5.setCellType(Cell.CELL_TYPE_STRING);
                cell5.getStringCellValue();
                Cell cell6 = row1.getCell(5);
                cell6.setCellType(Cell.CELL_TYPE_STRING);
                Cell cell7 = row1.getCell(6);
                cell7.setCellType(Cell.CELL_TYPE_STRING);
                cell7.getStringCellValue();
                Cell cell8 = row1.getCell(7);
                cell8.setCellType(Cell.CELL_TYPE_STRING);
                cell8.getStringCellValue();
                Cell cell9 = row1.getCell(8);
                cell9.getStringCellValue();
                Cell cell10 = row1.getCell(9);
                cell10.getStringCellValue();


                //这里new 一个对象,用来装填从页面上传的Excel数据,字段根据上传的excel决定
                LPGcylinderVO excel= new LPGcylinderVO();
                excel.setProductionName(cell1.getStringCellValue());
                excel.setProductionUnit(cell2.getStringCellValue());
                excel.setProductionDate(cell3.getStringCellValue());
                excel.setCylinderLabelNum(cell4.getStringCellValue());
                excel.setVolume(cell5.getStringCellValue());
                excel.setMaxVolume(cell6.getStringCellValue());
                excel.setLastInspectionTime(cell7.getStringCellValue());
                excel.setNextInspectionTime(cell8.getStringCellValue());
                excel.setPressureNum(cell9.getStringCellValue());
                excel.setRemark(cell10.getStringCellValue());

                list.add(excel);
//                System.out.println("excel: "+excel);
//                System.out.println("excel: "+excel);
            }
        } else {
            throw new Exception( "文件类型错误,请重新上传!");
        }

        try {
            //把账号密码以及连接字符串都配置到配置文件中,然后在这直接调用
            Class.forName("org.mariadb.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mariadb://43.138.122.70:3586/dkgovtgassystem?characterEncoding=utf-8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8", "dkgasmsql2023", "xlrq*73218$ukxhi82");
//            String sql = "insert into "+s+"(productionName) VALUES(?)";
            String sql = "insert into temporary."+s+"(productionName,productionUnit,productionDate,cylinderLabelNum,volume,maxVolume,lastInspectionTime,nextInspectionTime," +
                    "pressureNum,remark,companyId,countyID,cityID) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)";
            pstm = conn.prepareStatement(sql);
            System.err.println(pstm);
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).getProductionName()==null||"".equals(list.get(i).getProductionName())){
                    pstm.setString(1,null);
                }else {
                    String nameID = importHouseAndUnitInformationMapper.selectnameID(list.get(i).getProductionName().trim());
                    System.err.println(list.get(i).getProductionName().trim());
                    System.err.println("nameID "+nameID);
                    pstm.setString(1,nameID);
                }
                if (list.get(i).getProductionUnit()==null||"".equals(list.get(i).getProductionUnit())){
                    pstm.setString(2,null);
                }else {
                    pstm.setString(2,list.get(i).getProductionUnit().trim());
                }
                if (list.get(i).getProductionDate()==null||"".equals(list.get(i).getProductionDate())){
                    pstm.setBigDecimal(3,null);
                }else{

//                    String timestampString = list.get(i).getProductionDate().trim();
//                    Calendar calendar = new GregorianCalendar(1900, 0, -1);
//                    Date date = DateUtils.addDays(calendar.getTime(), Integer.parseInt(timestampString));
//
//                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//                    String formattedDate = formatter.format(date);
//
//                    System.err.println("formattedDate: " + formattedDate);
//                    pstm.setString(3, formattedDate);
                    String timestampString = list.get(i).getProductionDate().trim();
                    Date date = DateUtil.getJavaDate(Double.parseDouble(timestampString));

                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                    String formattedDate = formatter.format(date);

                    System.err.println("formattedDate: " + formattedDate);
                    pstm.setString(3, formattedDate);


                }
                if (list.get(i).getCylinderLabelNum()==null||"".equals(list.get(i).getCylinderLabelNum())){
                    pstm.setString(4,null);
                }else{
                    pstm.setString(4,list.get(i).getCylinderLabelNum());
                }
                if (list.get(i).getVolume()==null||"".equals(list.get(i).getVolume())){
                    pstm.setString(5,null);
                }else{
                    pstm.setString(5,list.get(i).getVolume());
                }
                if (list.get(i).getMaxVolume()==null||"".equals(list.get(i).getMaxVolume())){
                    pstm.setString(6,null);
                }else{
                    pstm.setString(6,list.get(i).getMaxVolume());
                }
                if (list.get(i).getLastInspectionTime()==null||"".equals(list.get(i).getLastInspectionTime())){
                    pstm.setString(7,null);
                }else{

//                    String timestampString = list.get(i).getLastInspectionTime().trim();
//                    Calendar calendar = new GregorianCalendar(1900, 0, -1);
//                    Date date = DateUtils.addDays(calendar.getTime(), Integer.parseInt(timestampString));
//
//                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//                    String formattedDate = formatter.format(date);
//
//                    System.err.println("formattedDate: " + formattedDate);
//                    pstm.setString(7, formattedDate);
                    String timestampString = list.get(i).getLastInspectionTime().trim();
                    Date date = DateUtil.getJavaDate(Double.parseDouble(timestampString));

                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                    String formattedDate = formatter.format(date);

                    System.err.println("formattedDate: " + formattedDate);
                    pstm.setString(7, formattedDate);


                }
                if (list.get(i).getNextInspectionTime()==null||"".equals(list.get(i).getNextInspectionTime())){
                    pstm.setString(8,null);
                }else{
//                    String timestampString = list.get(i).getNextInspectionTime().trim();
//                    Calendar calendar = new GregorianCalendar(1900, 0, -1);
//                    Date date = DateUtils.addDays(calendar.getTime(), Integer.parseInt(timestampString));
//
//                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
//                    String formattedDate = formatter.format(date);
//
//                    System.err.println("formattedDate: " + formattedDate);
//                    pstm.setString(8, formattedDate);
                    String timestampString = list.get(i).getNextInspectionTime().trim();
                    Date date = DateUtil.getJavaDate(Double.parseDouble(timestampString));

                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                    String formattedDate = formatter.format(date);

                    System.err.println("formattedDate: " + formattedDate);
                    pstm.setString(8, formattedDate);
                }
                if (list.get(i).getPressureNum()==null||"".equals(list.get(i).getPressureNum())){
                    pstm.setString(9,null);
                }else{
                    pstm.setString(9,list.get(i).getPressureNum());
                }
                if (list.get(i).getRemark()==null||"".equals(list.get(i).getRemark())){
                    pstm.setString(10,null);
                }else{
                    pstm.setString(10,list.get(i).getRemark());
                }
                System.err.println("companyId++"+companyId);
                pstm.setInt(11,companyId);
                int countyID =  importHouseAndUnitInformationMapper.selectCitylevel();
                pstm.setInt(12,countyID);
                int cityID =  importHouseAndUnitInformationMapper.selectparentID();
                System.err.println(cityID);
                System.err.println(cityID);
                pstm.setInt(13,cityID);
                pstm.addBatch();
                pstm.executeBatch();
                pstm.clearBatch();
            }
        } catch (Exception e) {
            throw  new Exception("出现错误请联系管理员");
        }
    }

这是保存的前端,保存完之后需要查询 我这里没有这个业务所以后面代码注释掉了

   //
        $('#save').on('click', function(){
            // 	let saveHouseLoading = layer.msg('正在保存房屋信息,请不要关闭浏览器!!!', {icon: 16, shade: 0.3, time:0});
            $.ajax({
                url:'companyManage/addSave',
                type:'post',
                data: {'regionlId':comId ? comId : regionlId},
                success:function (res) {
                    alert(res)
                    // if (res=="导入成功!"){
                    //     alert(res)
                    //     admin.closeDialog('#improtHousePage');
                    //     $.ajax({
                    //         url: '/heatUser/importInformation/findProblemInformation',
                    //         type: 'post',
                    //         success: function (res) {
                    //             console.log(res)
                    //             console.log(res.length)
                    //             // if (res.length>0){
                    //             //     var data = res;
                    //             //     data = excel.filterExportData(res, [
                    //             //         'villageName',
                    //             //         'buildingName',
                    //             //         'unitName',
                    //             //         'house',
                    //             //         'alipayConsNo',
                    //             //         'location',
                    //             //         'floor',
                    //             //         'holder',
                    //             //         'idCard',
                    //             //         'holdPhone',
                    //             //         'houseType',
                    //             //         'isElevator',
                    //             //         'heatMode',
                    //             //         'householdType',
                    //             //         'buildingArea',
                    //             //         'publicArea',
                    //             //         'insideArea',
                    //             //         'areaAdjust',
                    //             //         'adjustReason',
                    //             //         'zhdwnhenergy',
                    //             //         'zhcrxsHeat',
                    //             //         'zhgswdtemperature',
                    //             //         'zhhswdtemperature',
                    //             //         'cases',
                    //             //     ]);
                    //             //     data.unshift({
                    //             //         villageName: '小区名称'
                    //             //         , buildingName: '楼号'
                    //             //         , unitName: '单元'
                    //             //         , house: '室号'
                    //             //         , alipayConsNo: '住户卡号'
                    //             //         , location: '位置'
                    //             //         , floor: '所在楼层'
                    //             //         , holder: '户主姓名'
                    //             //         , idCard: '身份证号'
                    //             //         , holdPhone: '联系电话'
                    //             //         , houseType: '房屋类别'
                    //             //         , isElevator: '是否电梯楼'
                    //             //         , heatMode: '采暖方式'
                    //             //         , householdType: '房屋属性'
                    //             //         , buildingArea: '建筑面积'
                    //             //         , publicArea: '公摊面积'
                    //             //         , insideArea: '套内面积'
                    //             //         , areaAdjust: '面积修正'
                    //             //         , adjustReason: '修正原因'
                    //             //         , zhdwnhenergy: '单位能耗w/㎡'
                    //             //         , zhcrxsHeat: '传热系数w/(㎡·k)'
                    //             //         , zhgswdtemperature: '供水温度℃'
                    //             //         , zhhswdtemperature: '回水温度℃'
                    //             //         , cases: '失败原因'
                    //             //
                    //             //     });
                    //             //     excel.exportExcel(data, '问题房屋信息' + '.xlsx', 'xlsx');
                    //             // }else {
                    //             //     return;
                    //             // }
                    //         },
                    //         error: function () {
                    //             alert("报错!");
                    //         }
                    //     });
                    // }else {
                    //     alert("出现问题,请联系管理员!")
                    // }



                }
            });
        });
//将导入的信息进行保存
	@RequestMapping("/addSave")
	public String addSave(HttpServletRequest request,Integer regionlId) throws NoLoginException {
//		HttpSession session = MyHttpServletRequest.getSession(request);
		if (regionlId == null) {
			throw new NoLoginException("未登录");
		}
		Integer companyId = regionlId;
		String com= "house"+companyId;
		String ins= "inspect"+companyId;
		String returns=testservice.isOverImport(com,ins,companyId);
		return returns;
	}
    String isOverImport(String com, String ins, Integer companyId);
 @Override
    public String isOverImport(String com, String ins, Integer companyId) {
       int countyID =  importHouseAndUnitInformationMapper.selectCitylevel();
        importHouseAndUnitInformationMapper.updateOnlyOne(com);//查看当前表格是否存在重复的房屋信息,并进行标识
        importHouseAndUnitInformationMapper.updateHaving(com);//查看houseDeatil表中是否存在数据,如果没有就把临时表中的isHaving改为0
        importHouseAndUnitInformationMapper.insertTestHavingIs0(com);//将确认好的数据导入到houseDetail中
        return "导入成功!";
    }
 /**
     * 当信息表中只有这一条数据,没有重复的相同数据则进行标识
     */
    @Update(value = "UPDATE temporary.`${name}` a\n" +
            "LEFT JOIN (\n" +
            "    SELECT cylinderLabelNum, COUNT(*) AS count\n" +
            "    FROM temporary.`${name}`\n" +
            "    WHERE cylinderLabelNum IS NOT NULL\n" +
            "    GROUP BY cylinderLabelNum\n" +
            ") b ON a.cylinderLabelNum = b.cylinderLabelNum\n" +
            "SET a.count = b.count;")
    void updateOnlyOne (@Param("name") String name);
 /**
     * 将没有信息的标识为0,代表房屋信息里边没有,接下来导入的就是这些
     */
    @Update(value = " UPDATE temporary.`${name}` AS a\n" +
            "LEFT JOIN dkgovtgassystem.`lpgcylinder` b ON a.cylinderLabelNum = b.cylinderLabelNum\n" +
            "SET a.isHaving = CASE WHEN b.cylinderLabelNum IS NULL THEN 0 ELSE 1 END; ")
    void updateHaving (@Param("name") String com);
    //查询ishaving=0的信息,这些信息是可以导入到房屋信息表中的
    @Insert(value = " INSERT INTO dkgovtgassystem.`lpgcylinder` (productionName, productionUnit, productionDate, cylinderLabelNum, volume, maxVolume, lastInspectionTime, nextInspectionTime, pressureNum, remark, companyID,countyID,cityID ) SELECT\n" +
            "productionName,\n" +
            "productionUnit,\n" +
            "productionDate,\n" +
            "cylinderLabelNum,\n" +
            "volume,\n" +
            "maxVolume,\n" +
            "lastInspectionTime,\n" +
            "nextInspectionTime,\n" +
            "pressureNum,\n" +
            "remark, \n" +
            "companyId, \n" +
            "countyID, \n" +
            "cityID \n" +
            "FROM\n" +
            "\t temporary.`${name}` B \n" +
            "WHERE\n" +
            "\tB.isHaving = 0 \n" +
            "\tAND B.cylinderLabelNum IS NOT NULL \n" +
            "\tAND B.count = 1; ")
    void insertTestHavingIs0 (@Param("name") String name);

这三条sql分别就是第一次标识临时表相同的数据,第二次临时表和实际表再次进行比对和标识有无相同数据,第三条是将临时表都处理好的数据查询出来并新增到实际表中

小结

文章比较粗糙,这是MariaDB里面的sql的写法,我仿照别人的代码写的,仅供参考但是业务大致是这样只是sql语法不一样,参考时注意即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口测试流程、测试点和测试工具

目录 前言&#xff1a; 一、什么情况下开展接口测试&#xff1f; 二、如何进行接口测试 三、接口测试用例设计 四、接口测试工具 前言&#xff1a; 接口测试是一种重要的测试类型&#xff0c;用于验证应用程序接口的功能、性能和可靠性。 一、什么情况下开展接口测试&am…

AtomicInteger源码

介绍 Atomic包是java.util.concurrent下的另一个专门为线程安全设计的Java包&#xff0c;包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下&#xff0c;当有多个线程同时执行这些类的实例包含的方法时&#xff0c;具有排他性&#xff0c;…

大坝渗流监测的目的和意义

​  大坝渗流监测是对坝体内渗流场进行的监测&#xff0c;是确保大坝安全运行的重要手段。通过监测&#xff0c;可以掌握渗流场的变化规律&#xff0c;并根据渗流场的变化趋势预测坝体、坝基可能出现的问题。通常根据渗漏量与渗流量两个指标来进行监测&#xff0c;即渗漏量小…

【ndarry的基本操作】——numpy03

目录索引 基本索引和切片&#xff1a;普通索引&#xff1a;省略索引&#xff1a;多省略索引&#xff1a;间隔索引&#xff1a; 形态变换操作&#xff1a;reshape()&#xff1a;resize()&#xff1a;transpose()&#xff1a;*通过参数进行转置&#xff1a;* flatten()&#xff1…

usb转8路串口模块

开源USB转8路串口PCB设计 文章目录 开源USB转8路串口PCB设计1. 简介2. 说明3. 一种跨电脑跨USB口的端口号自动识别方法4.开源地址 今天给大家介绍一款USB转8路串口的PCB设计&#xff0c;并提供一种跨电脑跨USB口的端口号自动识别方法。 1. 简介 芯片采用沁恒的CH348Q&#xff…

Kotlin Jetpack Compose - 实现Tab布局

Tab布局是一种常见的UI设计&#xff0c;它允许用户在不同的视图或数据集之间切换。我们将使用Jetpack Compose的 TabRow 和 ScrollableTabRow 组件来实现这个布局。 一、基本的Tab布局——TabRow 二、滚动的Tab布局——ScrollableTabRow 组件 三、自定义Tab组件 一、基本的T…

音视频数据处理-H265/HEVC视频码流分析

一、H265概述 H265/HEVC&#xff08;Hight Efficiency Video Coding&#xff09;是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准&#xff0c;主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行…

chatgpt赋能python:Python自动化定位元素的方法详解

Python自动化定位元素的方法详解 作为一名Python编程经验丰富的工程师&#xff0c;我经常需要用到自动化定位元素的方法。今天&#xff0c;我想与大家分享一下在Python中如何自动化定位元素&#xff0c;以帮助那些想要进行Web自动化测试的开发者们。 什么是自动化定位元素 在…

chatgpt赋能python:Python聊天界面:开发高效且易于使用的消息应用

Python聊天界面&#xff1a;开发高效且易于使用的消息应用 Python是一种十分流行的编程语言&#xff0c;最近几年来&#xff0c;这种语言在GUI应用程序开发方面也越来越受欢迎。在本篇文章中&#xff0c;我们将介绍如何使用Python开发一个高效且易于使用的消息应用程序——聊天…

chatgpt赋能python:Python自动化定位——解放SEO员工的双手

Python自动化定位——解放SEO员工的双手 SEO&#xff08;Search Engine Optimization&#xff09;是现代数字营销中必不可少的一环。面对庞大的网络世界&#xff0c;SEO员工们日复一日地进行着关键词排名、页面跳转、链接检测等重复且繁琐的工作。而Python作为一种功能强大、易…

chatgpt赋能python:Python自动执行:提高效率,增强灵活性

Python自动执行&#xff1a; 提高效率&#xff0c;增强灵活性 随着时代进步&#xff0c;人们日常生活中越来越依赖计算机和网络技术&#xff0c;而在编程领域&#xff0c;Python语言作为一种高效、可读性好、易学易用的语言&#xff0c;得到了广泛应用。其中&#xff0c;Pytho…

【算法之栈与队列I】leetcode239. 滑动窗口最大值

232.用栈实现队列 力扣题目链接 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并…

使用netwox 的实例进行ARP地址解析协议分析【网络工程】(保姆级图文)

目录 1. netwox 构造 ARP 报文使用 netwox 工具构造 ARP 包。1) 查看 netwox 所在主机默认的 ARP 包的相关信息&#xff0c;执行命令如下&#xff1a;2) 构造 ARP 请求包&#xff0c;请求目标主机 192.168.43.95&#xff0c;执行命令如下&#xff1a;3) 为了验证构造的 ARP 请求…

IDEA(2021.3.3) 登录Github copilot最新版本报错解决

"Request sign ln Initiate failed with message:read ECONNRESET, request id: 6, error code:-32603 " .在获得github认证后的登录设备验证阶段弹出。此处应该为login 弹出异常&#xff0c;方法一&#xff1a;先使用Github 520进行动态替换&#xff0c;打开自己hos…

霍夫变换椭圆检测(matlab仿真与图像处理系列第2期)

概述 椭圆检测是图像处理中的一个重要问题,其目的是从图像中检测出可能存在的椭圆。在实际的应用中,椭圆常常被用来描述物体的形状或者得到物体的尺寸信息。 传统的椭圆检测方法通常采用二维Hough变换,在求解过程中需要处理大量的数据,并且计算复杂度高,导致速度较慢,…

linux系统grep文本三剑客之一

文章目录 一、grep常用选项二、正则表达式三、sort命令四、tr命令五、cut命令六、split命令七、paste命令八、正则表达式总结 一、grep常用选项 grep&#xff1a;文本三剑客之一&#xff0c;对文本内容进行过滤&#xff0c;支持正则表达式&#xff0c;针对行来进行处理。 -m&a…

【C++】 Qt-信号与槽

文章目录 基本概念添加信号与槽方法一方法二 自定义信号与槽CheckBox自定义QMessageBox自定义信号 信号与槽多对多一个信号连接多个槽多个信号连接一个槽一个信号连接一个信号连接一个槽 断开连接方法一方法二判断是否连接成功 基本概念 信号&#xff08;signal&#xff09;和…

chatgpt赋能python:Python自动执行函数——提高生产力的利器

Python自动执行函数 —— 提高生产力的利器 Python作为一种高级编程语言&#xff0c;具有强大的自动化能力&#xff0c;可以轻松实现多种任务的自动执行&#xff0c;从而提高生产力和效率。这篇文章将介绍如何使用Python自动执行函数&#xff0c;以及它对于SEO的重要意义。 什…

Flutter Dart类

目录 类 构造函数 命名构造函数 重定向构造函数 常量构造函数 工厂构造函数 Getters 和 Setters 初始化列表 可覆写的操作符 类 创建一个dart文件&#xff0c;名称全小写&#xff0c;里面的类可以按照驼峰命名法。文件名和类名可以不保持统一&#xff0c;这个跟Java有明…

Scrapy: 一个强大的 Python 爬虫框架--介绍--下载--启动!!

目录 Scrapy 影响力 介绍 主要特点 架构 运行流程 基本使用 安装 创建 Scrapy 项目 创建爬虫 爬虫包含的内容 运行爬虫 Scrapy 影响力 作为目前爬虫主流框架之一&#xff0c;Scrapy的影响力和应用范围非常广泛&#xff1a; 根据GitHub上的数据&#xff0c;Scrapy是一…