getPhysicalNumberOfCells获取列数不是合并前实际列数

news2024/10/7 2:29:47

问题就是:有的导入复杂表头被合并的单元格有默认空字符串,有的直接不存在这个单元格

在这里插入图片描述

在这里插入图片描述
实际我需要下面这种情况
在这里插入图片描述
断点可以看到这个导入第一行合并了,被合并单元格还有默认的空字符串
在这里插入图片描述

解决办法就是在合并单元格里面判断,不是第一行第一列都设置空字符串
在这里插入图片描述

之前贴过导入复杂表头,这里再贴一边

package com.njry.modules.system.rest;


import com.njry.exception.BadRequestException;
import com.njry.modules.tools.domain.vo.HeaderCell;
import com.njry.modules.tools.domain.vo.HeaderRegion;
import com.njry.modules.system.domain.SysTest;
import com.njry.modules.system.service.SysTestService;
import com.njry.utils.SecurityUtils;
import com.njry.utils.excel.ExcelColorHelper;
import com.njry.utils.excel.HssfHelper;
import com.njry.utils.excel.XssfHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

@RestController
@RequiredArgsConstructor
@Api(tags = "工具:本地存储管理")
@RequestMapping("/api/localStorageExcel")
public class testExcelController {

    private final SysTestService sysTestService;

    @PostMapping
    @ApiOperation("上传文件")
    public ResponseEntity<Object> createFile(@RequestParam String name, @RequestParam("file") MultipartFile file){
//        保存导入表头配置
        Map<String, String> mp = new HashMap<String, String>();
        int res = 1;

        try {
            if (file == null || file.isEmpty()) {
                res = -1;
            }
            HeaderCell[][] headerCells = null;
            int typeNumber = checkFile(file);
            if(typeNumber == 1){
                headerCells = readXLSX(file);
            }
            if(typeNumber == 2){
                headerCells = readXLS(file);
            }
            if(typeNumber == 0 || typeNumber == 3){
                throw new BadRequestException("上传文件格式不正确");
            }
            Map cellMap = getHtmlStr(headerCells, 1);//传1 正序
//            获取表头的后处理父子级关系
            List cellList = (List)cellMap.get("cellList");
            int rowNum = (int)cellMap.get("rowNum");

//            只有正序的时候才能这样使用
            for(int i = 0; i < cellList.size(); i++){
                HashMap<String,Object> hashMap = (HashMap)cellList.get(i);
                if(hashMap.get("rowfrom").equals(0)){
                    hashMap.put("parentLevel",null);
//                    hashMap.put("leafFlag",0);
                }else{
//                    判断不是第一行起的父级是谁
                    int rowfrom = convertObjectToInt(hashMap.get("rowfrom")) - 1;
                    int colfrom = convertObjectToInt(hashMap.get("colfrom"));
                    for (int j = 0; j < cellList.size(); j++) {
                        HashMap<String,Object> hashMapInner = (HashMap)cellList.get(j);
                        int rowfrom1 = convertObjectToInt(hashMapInner.get("rowfrom"));
                        int rowto = convertObjectToInt(hashMapInner.get("rowto"));
                        int colfrom1 = convertObjectToInt(hashMapInner.get("colfrom"));
                        int colto = convertObjectToInt(hashMapInner.get("colto"));
                        if(rowfrom >= rowfrom1 && rowfrom <= rowto && colfrom >= colfrom1 && colfrom <= colto){
                            hashMap.put("parentLevel",hashMapInner.get("headid"));
//                            hashMap.put("leafFlag",1);
                        }
                    }
                }
//                处理leafFlag是最后一行表示叶子节点
                int rowto = convertObjectToInt(hashMap.get("rowto"));
                if(rowto == rowNum - 1){
                    hashMap.put("leafFlag",1);
                }else{
                    hashMap.put("leafFlag",0);
                }
            }
            System.out.println(cellList);
            for (int k = 0; k < cellList.size(); k++) {
                HashMap<String,Object> hashMap = (HashMap)cellList.get(k);
                SysTest resources =  new SysTest();
                resources.setColfrom((Integer) hashMap.get("colfrom"));
                resources.setColto((Integer) hashMap.get("colto"));
                resources.setColspan((Integer) hashMap.get("colspan"));
                resources.setRowfrom((Integer) hashMap.get("rowfrom"));
                resources.setRowto((Integer) hashMap.get("rowto"));
                resources.setRowspan((Integer) hashMap.get("rowspan"));
//                数据库不允许title在插入的时候是null(表头传入有的是空)---修改数据表为null
                resources.setTitle((String) hashMap.get("title"));
                resources.setHeadid((String) hashMap.get("headid"));
                resources.setParentlevel((String) hashMap.get("parentLevel"));
                resources.setHeight((Float) hashMap.get("height"));
                resources.setBgColor((String) hashMap.get("bg_color"));
                resources.setFontColor((String) hashMap.get("font_color"));
                resources.setFontHeight((String) hashMap.get("font_height"));
                resources.setLeafFlag((Integer) hashMap.get("leafFlag"));
                sysTestService.create(resources);
            }
        }catch (Exception e)
            {
                throw e;
//                res = 0;
            }
            mp.put("res", res + "");
        return new ResponseEntity<>(HttpStatus.CREATED);
    }


    public int convertObjectToInt(Object obj) {
        if (obj instanceof String) {
            return Integer.parseInt((String) obj);
        } else if (obj instanceof Integer) {
            return (Integer) obj;
        } else {
            throw new IllegalArgumentException("Object cannot be converted to int");
        }
    }

    public HeaderCell[][] readXLS(MultipartFile file){
        Workbook wb = null;
        try
        {
            wb = new HSSFWorkbook(file.getInputStream());
        }
        catch (Exception ex)
        {
        }
        Sheet sheet = wb.getSheetAt(0);
        return excelToHtml(sheet,wb,1);
    }

    public HeaderCell[][] readXLSX(MultipartFile file){
        Workbook wb = null;
        try
        {
            wb = new XSSFWorkbook(file.getInputStream());
        }
        catch (Exception ex)
        {
        }
        Sheet sheet = wb.getSheetAt(0);
        return excelToHtml(sheet,wb,2);
    }

    /**
     * 判断File文件的类型
     * @param file 传入的文件
     * @return 0-文件为空,1-XLSX文件,2-XLS文件,3-其他文件
     */
    public int checkFile(MultipartFile file) {
        if (file == null) {
            return 0;
        }
        String filename = file.getOriginalFilename();
        String fileSuffix= filename.substring(filename.lastIndexOf("."));
        if (fileSuffix.endsWith("xlsx")) {
            return 1;
        }
        if (fileSuffix.endsWith("xls")) {
            return 2;
        }
        return 3;
    }

    /**
     * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)
     *来转换成16进制字符串。
     * @param src 传入的rbg
     * @return @return hex string
     */
    public static String bytesToHexString(byte[] src){
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }


    /**
     * @description 解析表头
     * @author 
     * @param sheet
     * @param wb
     * @param type 1是 HSSFWorkbook 2 是XSSFWorkbook
     * @return
     */
    @SuppressWarnings({"deprecation", "unchecked", "static-access"})
    public HeaderCell[][] excelToHtml(Sheet sheet, Workbook wb,int type)
    {
        //开始解析excel
        HssfHelper hssfHelper = null;
        XssfHelper xssfHelper = null;
        if(type == 1){
            hssfHelper= new HssfHelper();
        }
        if(type == 2){
            xssfHelper = new XssfHelper();
        }
        ExcelColorHelper colorHelper = new ExcelColorHelper();
        Font headFont;
        CellStyle headStyle;


        //获取Sheet中的合并单元格信息(为下文HeaderCell下属性判断使用)
        HeaderRegion[] headerRegions = new HeaderRegion[sheet.getNumMergedRegions()];
        for(int k = 0; k < sheet.getNumMergedRegions(); k++)
        {
            HeaderRegion headerRegion = null;
            CellRangeAddress region = sheet.getMergedRegion(k);
            headerRegion = new HeaderRegion();
            int firstRow = region.getFirstRow();
            int lastRow = region.getLastRow();
            int firstColumn = region.getFirstColumn();
            int lastColumn = region.getLastColumn();
            headerRegion.setTargetRowFrom(firstRow);
            headerRegion.setTargetRowTo(lastRow);
            headerRegion.setTargetColumnFrom(firstColumn);
            headerRegion.setTargetColumnTo(lastColumn);
            if(type == 1){
                HSSFCell cell = (HSSFCell)sheet.getRow(firstRow).getCell(firstColumn);
                headerRegion.setText(hssfHelper.getCellStringValue(cell));
            }
            if(type == 2){
                XSSFCell cell = (XSSFCell)sheet.getRow(firstRow).getCell(firstColumn);
                headerRegion.setText(xssfHelper.getCellStringValue(cell));
            }
            headerRegion.setColLength(1 + (lastColumn - firstColumn));
            headerRegion.setRowLength(1 + (lastRow - firstRow));
//            当前合并单元的合并的列数
//            int numberOfCells = region.getNumberOfCells();
//            System.out.println(numberOfCells);
//            合并单元格,被合并单元格没数据设置成默认空字符----getPhysicalNumberOfCells获取不到存在合并行(合并前的)实际列数
            for (int i = firstRow; i <= lastRow; i++) {
                for (int j = firstColumn; j <= lastColumn; j++) {
//                    除去第一行一列默认有值,其余全部设置为空字符串
                    if(i == firstRow && j == firstColumn){
//                        第一行第一列啥也不处理
                    }else{
//                        被合并但是有数据默认空字符串不处理
                        Cell cell = sheet.getRow(i).getCell(j);
                        if(cell == null){
                            cell = sheet.getRow(i).createCell(j);
                            cell.setCellValue(""); // 设置单元格为空字符串
                        }
                    }
                }
            }
            headerRegions[k] = headerRegion;
        }

        //获取Sheet中的单元格信息
        int rowNum = sheet.getPhysicalNumberOfRows();
//        获取第一行,得到第一行有多少列,就是excel有多少列(有的第一行合并后,获取是合并的列数,不是合并前实际列数)
        Row rowFirst = sheet.getRow(0);
        int cellNum = rowFirst.getPhysicalNumberOfCells();

//        short firstCellNum = rowFirst.getFirstCellNum();
//        System.out.println(firstCellNum);
//        short lastCellNum = rowFirst.getLastCellNum();
//        System.out.println(lastCellNum);
        HeaderCell[][] headerCells = new HeaderCell[rowNum][cellNum];
        Iterator iter = sheet.rowIterator();
        for(int i = 0; iter.hasNext(); i++)
        {
            HeaderCell headerCell = null;
            if(type == 1){
                HSSFRow row = (HSSFRow) iter.next();
//            获取每一行高度
                float heightInPoints = row.getHeightInPoints();
//            获取每一行有多少列 physical物理的
                int cellNums = row.getPhysicalNumberOfCells();

                for(int j = 0; j < cellNums; j++)
                {
                    headerCell = new HeaderCell();
//                获取到每一行下每一列
                    HSSFCell cell = row.getCell((short) j);
                    headStyle = cell.getCellStyle();
                    headFont = wb.getFontAt(cell.getCellStyle().getFontIndex());//得到单元格的字体
                    headerCell.setRowIndex(i);
                    headerCell.setColIndex(j);
                    headerCell.setText(hssfHelper.getCellStringValue(cell));
                    headerCell.setHeight(heightInPoints);
                    headerCell.setWidth(sheet.getColumnWidth((short) j) / 32);


                    HSSFCellStyle cellStyle = cell.getCellStyle();
                    HSSFColor fillForegroundColorColor1 = cellStyle.getFillForegroundColorColor();
                    String foregroundColorHexString = fillForegroundColorColor1.getHexString();
                    HSSFFont font = cellStyle.getFont(wb);
                    HSSFWorkbook tempTransport = (HSSFWorkbook) wb;
                    HSSFColor hssfColor = font.getHSSFColor(tempTransport);
                    if(hssfColor == null){
                        String colorHexString = "#000000";
                        headerCell.setFontColor(colorHexString);
                    }else{
                        String colorHexString = hssfColor.getHexString();
                        headerCell.setFontColor(colorHexString);
                    }
                    headerCell.setBgcolor(foregroundColorHexString);

                    headerCell.setFontHeight(String.valueOf(headFont.getFontHeight()/20));

                    boolean hasRegion = false;
                    for(int k = 0; k < headerRegions.length; k++)
                    {
//                    判断当前cell是否属于合并单元格 i 在合并单元格之内 同时 j 在合并单元格内(上文headerRegions使用)
                        if(i >= headerRegions[k].getTargetRowFrom() && i <= headerRegions[k].getTargetRowTo()
                                && j >= headerRegions[k].getTargetColumnFrom() && j <= headerRegions[k].getTargetColumnTo())
                        {
                            headerCell.setHeaderRegion(headerRegions[k]);
                            hasRegion = true;
                        }
                    }

                    if(!hasRegion)
                    {
                        HeaderRegion headerRegion2 = new HeaderRegion();
                        headerRegion2.setTargetRowFrom(i);
                        headerRegion2.setTargetRowTo(i);
                        headerRegion2.setTargetColumnFrom(j);
                        headerRegion2.setTargetColumnTo(j);
                        HSSFCell cell1 = (HSSFCell)sheet.getRow(i).getCell((short) j);
                        headerRegion2.setText(hssfHelper.getCellStringValue(cell1));
                        headerRegion2.setColLength(1);
                        headerRegion2.setRowLength(1);
                        headerCell.setHeaderRegion(headerRegion2);
                    }
//                通过!hasRegion将没有合并的单元格都也有headerRegion,就是自己本身,本身的话下面设置两个变量都是true
//                合并区域的开始行i 和开始列 j 是否是当前单元格的开始行和列
                    headerCell.setAscDisplay((i == headerCell.getHeaderRegion().getTargetRowFrom() && j == headerCell.getHeaderRegion().getTargetColumnFrom()) ? true : false);
//                合并区域的结束行i 和开始列 j 是否是当前单元格的开始行和列
                    headerCell.setDescDisplay((i == headerCell.getHeaderRegion().getTargetRowTo() && j == headerCell.getHeaderRegion().getTargetColumnFrom()) ? true : false);
                    headerCells[i][j] = headerCell;
                }
            }
            if(type == 2){
                XSSFRow row = (XSSFRow) iter.next();
//            获取每一行高度
                float heightInPoints = row.getHeightInPoints();
//            获取每一行有多少列 physical物理的
                int cellNums = row.getPhysicalNumberOfCells();

                for(int j = 0; j < cellNums; j++)
                {
                    headerCell = new HeaderCell();
//                获取到每一行下每一列
                    XSSFCell cell = row.getCell(j);
                    headFont = wb.getFontAt(cell.getCellStyle().getFontIndex());//得到单元格的字体
                    headerCell.setRowIndex(i);
                    headerCell.setColIndex(j);
                    headerCell.setText(xssfHelper.getCellStringValue(cell));
                    headerCell.setHeight(heightInPoints);
                    headerCell.setWidth(sheet.getColumnWidth((short) j) / 32);


                    XSSFCellStyle cellStyle = cell.getCellStyle();
                    XSSFColor fillForegroundColorColor = cellStyle.getFillForegroundColorColor();
                    if(fillForegroundColorColor == null){
                        String foregroundColorHexString = "#ffffff";
                        headerCell.setBgcolor(foregroundColorHexString);
                    }else{
                        byte[] argb = fillForegroundColorColor.getARGB();
                        String tempString = bytesToHexString(argb);
                        headerCell.setBgcolor(tempString);
                    }
                    XSSFFont font = cellStyle.getFont();
                    XSSFColor xssfColor = font.getXSSFColor();
                    if(xssfColor == null){
                        String colorHexString = "#000000";
                        headerCell.setFontColor(colorHexString);
                    }else{
                        byte[] argb = xssfColor.getARGB();
                        String tempString = bytesToHexString(argb);
                        headerCell.setFontColor(tempString);
                    }

                    headerCell.setFontHeight(String.valueOf(headFont.getFontHeight()/20));

                    boolean hasRegion = false;
                    for(int k = 0; k < headerRegions.length; k++)
                    {
//                    判断当前cell是否属于合并单元格 i 在合并单元格之内 同时 j 在合并单元格内(上文headerRegions使用)
                        if(i >= headerRegions[k].getTargetRowFrom() && i <= headerRegions[k].getTargetRowTo()
                                && j >= headerRegions[k].getTargetColumnFrom() && j <= headerRegions[k].getTargetColumnTo())
                        {
                            headerCell.setHeaderRegion(headerRegions[k]);
                            hasRegion = true;
                        }
                    }

                    if(!hasRegion)
                    {
                        HeaderRegion headerRegion2 = new HeaderRegion();
                        headerRegion2.setTargetRowFrom(i);
                        headerRegion2.setTargetRowTo(i);
                        headerRegion2.setTargetColumnFrom(j);
                        headerRegion2.setTargetColumnTo(j);
                        XSSFCell cell1 = (XSSFCell)sheet.getRow(i).getCell((short) j);
                        headerRegion2.setText(xssfHelper.getCellStringValue(cell1));
                        headerRegion2.setColLength(1);
                        headerRegion2.setRowLength(1);
                        headerCell.setHeaderRegion(headerRegion2);
                    }
//                通过!hasRegion将没有合并的单元格都也有headerRegion,就是自己本身,本身的话下面设置两个变量都是true
//                合并区域的开始行i 和开始列 j 是否是当前单元格的开始行和列
                    headerCell.setAscDisplay((i == headerCell.getHeaderRegion().getTargetRowFrom() && j == headerCell.getHeaderRegion().getTargetColumnFrom()) ? true : false);
//                合并区域的结束行i 和开始列 j 是否是当前单元格的开始行和列
                    headerCell.setDescDisplay((i == headerCell.getHeaderRegion().getTargetRowTo() && j == headerCell.getHeaderRegion().getTargetColumnFrom()) ? true : false);
                    headerCells[i][j] = headerCell;
                }
            }
        }
        return headerCells;
    }

    /**
     * @description 拼接表头样式(报表表头导入)
     * @author 
     * @param headerCells
     * @param flag
     * @return
     */
    @SuppressWarnings("unchecked")
    public Map getHtmlStr(HeaderCell[][] headerCells, int flag) {

        if(headerCells == null || headerCells.length == 0) {
            return null;
        }
        Map map = new HashMap();
        int rowNum = headerCells.length;
        int cellNum = headerCells[0].length;
        String htmlStr = "";
        String cellStr = "";
        List cellList = new ArrayList();
        int width = 0;
        Map cellMap = null;
        int i = 0;
        boolean bool = i < rowNum;
        if(flag == -1)
        {
            i = rowNum - 1;
            bool = i >= 0;
        }
        while(bool)
        {
            for(int j = 0; j < cellNum; j++)
            {
//                通过是否是正序(合并单元格开始行,限制列仅为开始)或者倒序,可以排除合并中不是开始的单元格(不必要的循环)
                boolean bool_tem = flag == -1 ? headerCells[i][j].isDescDisplay(): headerCells[i][j].isAscDisplay();
                if(bool_tem)
                {
                    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
                    cellMap = new HashMap();
                    cellMap.put("title", headerCells[i][j].getText());                                  //标题
                    cellMap.put("headid", uuid);                                                        //唯一id
                    cellMap.put("rowfrom", headerCells[i][j].getHeaderRegion().getTargetRowFrom());     //起始行
                    cellMap.put("colfrom", headerCells[i][j].getHeaderRegion().getTargetColumnFrom());  //起始列
                    cellMap.put("rowto", headerCells[i][j].getHeaderRegion().getTargetRowTo());         //目标行
                    cellMap.put("colto", headerCells[i][j].getHeaderRegion().getTargetColumnTo());      //目标列
                    cellMap.put("colspan", headerCells[i][j].getHeaderRegion().getColLength());         //合并列
                    cellMap.put("rowspan", headerCells[i][j].getHeaderRegion().getRowLength());         //合并行
                    cellMap.put("width", headerCells[i][j].getWidth());         //宽度
                    cellMap.put("height", headerCells[i][j].getHeight());         //高度
                    cellMap.put("bg_color", headerCells[i][j].getBgcolor());         //背景色
                    cellMap.put("font_color", headerCells[i][j].getFontColor());         //字体颜色
                    cellMap.put("font_height", headerCells[i][j].getFontHeight());         //字体大小
                    cellList.add(cellMap);

/*//                    不是倒数第一和第二行循环
//                    添加随机id,方便后面建立父子级关系
                    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
                    if((i != rowNum - 2) && (i != rowNum - 1))
                    {
                        cellMap = new HashMap();
                        cellMap.put("title", headerCells[i][j].getText());                                  //标题
                        cellMap.put("headid", uuid);                                                        //唯一id
                        cellMap.put("rowfrom", headerCells[i][j].getHeaderRegion().getTargetRowFrom());     //起始行
                        cellMap.put("colfrom", headerCells[i][j].getHeaderRegion().getTargetColumnFrom());  //起始列
                        cellMap.put("rowto", headerCells[i][j].getHeaderRegion().getTargetRowTo());         //目标行
                        cellMap.put("colto", headerCells[i][j].getHeaderRegion().getTargetColumnTo());      //目标列
                        cellMap.put("colspan", headerCells[i][j].getHeaderRegion().getColLength());         //合并列
                        cellMap.put("rowspan", headerCells[i][j].getHeaderRegion().getRowLength());         //合并行
                        cellMap.put("width", headerCells[i][j].getWidth());         //宽度
                        cellMap.put("height", headerCells[i][j].getHeight());         //高度
                        cellMap.put("bg_color", headerCells[i][j].getBgcolor());         //背景色
                        cellMap.put("font_color", headerCells[i][j].getFontColor());         //字体颜色
                        cellMap.put("font_height", headerCells[i][j].getFontHeight());         //字体大小
                        cellList.add(cellMap);
                    }
                    if(i == rowNum - 2) //标题对应英文字段(总行数rowNum不变,i变化,总函数减去2就是倒数第二行)
                    {
                        htmlStr +=  "#" + headerCells[i][j].getHeaderRegion().getText() + ">>" + j;
                        width += new Float(headerCells[i][j].getWidth()).intValue() + 20;
                    }
                    else if(i == rowNum - 1)  //英文字段类型
                    {
                        cellStr += "#" + headerCells[i][j].getHeaderRegion().getText() + ">>" + j;
                    }*/
                }
            }
            if(flag == -1)
            {
                i--;
                bool = i >= 0;
            }
            else
            {
                i++;
                bool = i < rowNum;
            }
        }
//        map.put("htmlStr", htmlStr.substring(1));
//        map.put("cellStr", cellStr.substring(1));
        map.put("cellList", cellList);
        map.put("rowNum", rowNum);
//        map.put("width", width);
        return map;
    }
}

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

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

相关文章

软件培训方案(Word原件)

1. 培训目的 2. 培训方式 3. 培训内容 4. 培训讲师 5. 培训教材 6. 培训质量保证 软件全套资料&#xff1a;本文末个人名片直接获取或者进主页。

利用定时器1产生全双工软件串口

代码; /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;使用AVR定时器1和外中断实现全双工软件串口文件&#xff1a;softuart.c说明&#xff1a;软件串口驱动文件作者&#xff1a;邵子扬时间&#xff1a;2012年12月16日*/ #include "softuart.h"// 内部…

数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员

一、数据库&#xff08;DB&#xff09; 1、数据库就是存储数据的仓库&#xff0c;只不过这个仓库是在计算机存储设备上 2、严格的说&#xff0c;数据库是长期存储在计算机内、有组织的、统一管理的、可共享的相关数据的集合 3、数据库应是为一个特定目标而设计、构建并装入数…

阅读笔记:明朝那些事儿妖孽横行的宫廷

明朝那些事儿第四部看完了&#xff0c;合上书本给我印象比较深刻的文臣要数王守仁&#xff0c;不愧为明朝的军事家&#xff0c;思想家&#xff0c;文学家&#xff0c;教育家&#xff0c;他经过多年的思索、磨难、追求&#xff0c;终于有一天&#xff0c;在穷乡僻壤&#xff0c;…

PBR网络数据流量分流+NQA联动静态路由

一、实验目的&#xff1a; 企业有两个网段&#xff0c;业务1网段和业务2网段&#xff0c;拓扑图如下&#xff0c; 二、实验要求 pc1报文走左侧链路到达ar1&#xff0c;pc2报文走右侧链路到达ar1&#xff0c;且当ar2或者ar3发生故障时候&#xff0c;可以通过另一个设备到达ar1…

终极解决方案,传统极速方案,下载软件的双雄对决!

在数字资源日益丰富的今天&#xff0c;下载管理器成为了我们日常生活中不可或缺的工具。市场上两款备受欢迎的下载管理软件——Internet Download Manager&#xff08;IDM&#xff09;和迅雷11&#xff0c;它们以各自的特色和优势&#xff0c;满足了不同用户群体的需求。 软件…

应届毕业之本科简历制作

因为毕设以及编制岗位面试&#xff0c;最近好久没有更新了&#xff0c;刚好有同学问如何制作简历&#xff0c;我就准备将我自己制作简历的流程分享给各位&#xff0c;到此也算是一个小的结束&#xff0c;拿了工科学位证书毕业去做&#x1f402;&#x1f40e;了。 简历主要包含内…

Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol

Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol 0. 版本0.1 Proxy.sol 1. 目标合约2. 代码精读2.1 _delegate(address implementation) internal2.2 _implementation() internal && _beforeFallback() internal2.3 fallback() && receive() 0. 版本…

大电流一体成型电感CSEB1350系列,助力实现DC-DC转换器小尺寸、高效率

DC-DC转换器 , 转换器 , 科达嘉 DC-DC转换器作为一种电压转换装置&#xff0c;在电子产品、电源系统、工业控制、新能源等领域广泛应用。。。 DC-DC转换器作为一种电压转换装置&#xff0c;在电子产品、电源系统、工业控制、新能源等领域广泛应用。随着各行业用户对DC-DC转换器…

Mybatis plus:Wrapper接口

一、介绍 MyBatis-Plus 提供了一套强大的条件构造器&#xff08;Wrapper&#xff09;&#xff0c;用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件&#xff0c;无需编写繁琐的 SQL 语句&#xff0c;从而提高开发效率并减少 SQL 注入的风险。 …

【MySQL】Linux中MySQL的使用及配置

一、字符集修改 1、MySQL8.0之前&#xff0c;字符集都默认是latin1&#xff0c;从MySQL8.0开始&#xff0c;字符集utf8mb4&#xff0c;这意味着&#xff0c;在默认情况下&#xff0c;MySQL8.0之前都是不支持中文的 # 查看字符集信息&#xff0c;主要是character_set_server和…

2024全国各地高考录取分数线一览表(含一本、二本、专科)

2024年高考录取分数线陆续公布&#xff0c;上大学网(www.sdaxue.com)为大家整理全国31个省市高考录取分数线汇总&#xff0c;包括本科批、专科批和特殊类招生控制分数线汇总&#xff0c;来看看你的省份多少分能上大学吧。 一、2024年全国高考录取线一览表 1、宁夏 一本线&…

3d隐藏模型为什么就不见了?---模大狮模型网

在3D建模和设计过程中&#xff0c;经常会遇到需要隐藏某些模型的情况。然而&#xff0c;有时候隐藏之后再也找不到这些模型了。这种情况可能让人感到困惑和沮丧。本文将探讨3D隐藏模型后“消失”的原因&#xff0c;并提供一些解决方法&#xff0c;帮助您更好地管理和查找隐藏的…

Vue的Router?一个小demo秒了

效果展示 正文 登录页 <template><div><div class"login"><h3>图书管理系统</h3><div class"user"><span>账号&#xff1a;</span><input type"text" v-model"user" /></…

监控 Promethus的监控告警Alertmanager、Grafana

Promethus的监控告警Alertmanager Alertmanager 介绍 Prometheus的一个组件&#xff0c;用于定义和发送告警通知&#xff0c;内置多种第三方告警通知方式&#xff0c;同时还提供了对Webhook通知的支持基于警报规则对规则产生的警报进行分组、抑制和路由&#xff0c;并把告警发…

Nginx基础概念和常用操作

文章目录 1. 安装、启动、连接2. 快速尝试部署网站3. 配置文件1. nginx.conf全局配置事件模块HTTP 模块性能优化建议 2. default.confserver 块基本设置日志设置根路径设置 4. 反向代理1. 模拟3个Web2. 链接 5. 负载均衡1. 加权轮询&#xff0c;Weighted Round Robin2. 最少连接…

【LeetCode刷题】232.用栈实现队列

目录 题目链接 图解思路 整体结构 实现过程 入队列 出队列 实现代码 MyQueue.h MyQueue.c stack.h stack.c test.c 题目链接 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 图解思路 整体结构 实现过程 入队列 插入数据时&#xff0c;插入到ist。…

SpringBoot使用AutoConfigure实现依赖库自动导入配置

我们知道导入配置有两种&#xff0c;一种是Value&#xff0c;一种是ConfigurationProperties&#xff0c;将对应的类标记为Component即可导入。但是被注解标识的类创建Bean有一个前提&#xff0c;只对启动类所在的包路径下的所有带有Component等注解的类才会创建Bean。如果我们…

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理,与一线生产过程相融合,集成数据后台,统一前端入口,呈现多方项目信息;

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理&#xff0c;与一线生产过程相融合&#xff0c;集成数据后台&#xff0c;统一前端入口&#xff0c;呈现多方项目信息; 智慧工地是指运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工…

Java程序之素数问题

题目&#xff1a; 判断101-200之间有多少个素数&#xff0c;并输出所有素数。 程序分析&#xff1a; 判断素数的方法&#xff1a;用一个数分别去除2到sqrt(这个数)&#xff0c;如果能被整除&#xff0c;则表明此数不是素数&#xff0c;反之是素数。素数被利用在密码学上&#…