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

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

在这里插入图片描述

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

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

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

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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FENDI CLUB精酿啤酒与小麦的不解之缘

FENDI CLUB精酿啤酒与小麦之间这种联系体现在啤酒的酿造原料、口感特色以及文化内涵等多个方面。以下是关于这两者之间关系的详细分析&#xff1a; 一、酿造原料的紧密联系 小麦作为关键原料&#xff1a;FENDI CLUB精酿啤酒在酿造过程中&#xff0c;小麦是不可或缺的原料之一…

压缩包文件密码破解软件 Ziperello 下载及使用教程

使用 Ziperello https://qweree.cn/index.php/416/ 对加了密码的压缩包进行密码破解&#xff0c;教程如下&#xff1a; 第一步&#xff0c;双击运行 Ziperello双击我打开程序.exe&#xff0c;如下图&#xff1a; 第二步&#xff0c;打开一个加了密的 ZIP 压缩包&#xff0c;再…

idea导入项目右侧maven不显示的解决办法

不显示情况&#xff1a; 原因可能是读取项目出错&#xff0c;未正确加载pom文件造成的。 解决方案一&#xff1a; 关闭idea在项目目录中删除.idea文件夹重新打开项目&#xff0c;重新加载。 解决犯案二&#xff1a; 直接在pom文件中右键选择add as maven project。 解决方案三…

【JavaEE】Cookie和Session详解

一.Cookie 首先我们知道HTTP协议本身是’‘无状态’‘的, 这里的’‘无状态’指的是:默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系. 但是在实际的开发过程之中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后,第二次访…

『大模型笔记』如何让小型语言模型发挥作用!

如何让小型语言模型发挥作用! 文章目录 一. 如何让小型语言模型发挥作用!不可能的可能性小模型的潜力创新方法与突破实践与验证过滤系统与数据质量小模型的逐步改进信息理论蒸馏方法(新工作InfoSum)总结与展望Infini-Gram与N-gram模型的新时代后缀数组与高速计算二. 参考文献…

若依框架集成微信支付

1. 添加微信支付相关依赖 <!-- 微信支付 --> <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version> </dependency> <dependency><groupId>com.gi…

免费开源的地图解析工具【快速上手】

视频学习地址 这篇文章和【Nominatim】是相呼应的&#xff0c;在尝试了OSM数据一直有问题之后&#xff0c;通过别人的指点是不是可以换个思路&#xff0c;我的数据只需要精确到市级别&#xff0c;也可以不用OSM这样全的数据&#xff08;主要原因还是OSM太过庞大了&#xff09; …

神经网络学习6-线性层

归一化用的较少 正则化用来解决过拟合&#xff0c;处理最优化问题&#xff0c;批量归一化加快速度 正则化&#xff08;Regularization&#xff09;&#xff1a; 作用&#xff1a;正则化是一种用来防止过拟合的技术&#xff0c;通过向模型的损失函数中添加惩罚项&#xff0c;使…

全网最全!25届最近5年上海理工大学自动化考研院校分析

上海理工大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试…

数据挖掘与分析——数据预处理

数据探索 波士顿房价数据集&#xff1a;卡内基梅隆大学收集&#xff0c;StatLib库&#xff0c;1978年&#xff0c;涵盖了麻省波士顿的506个不同郊区的房屋数据。 一共含有506条数据。每条数据14个字段&#xff0c;包含13个属性&#xff0c;和一个房价的平均值。 数据读取方法…

EOS black灵魂回响黑色无法联机/联机报错/联机失败怎么办

灵魂回响黑色EOS black中的职业系统&#xff0c;自由度非常高。从人物属性的精细调整&#xff0c;到装备属性的独特搭配&#xff0c;再到技能的个性化组合&#xff0c;每一步都充满了无限可能。更为惊喜的是&#xff0c;游戏中的角色职业不是一成不变的&#xff0c;而是随着手中…

基于STM32的智能插座项目

本项目基于stm32f103c8t6芯片通过集成众多模块和元器件&#xff0c;通过ESP01-S和阿里云平台实现智能插座的项目开展。资料获取到咸&#x1f41f;&#xff1a;xy591215295250 \\\或者联系wechat 号&#xff1a;comprehensivable 随着电子科学与技术的快速发展&#xff0c;软硬件…

Linux开发讲课7---Linux sysfs文件系统

一、sysfs文件系统介绍 Sysfs&#xff08;System Filesystem&#xff09;是Linux内核提供的一种虚拟文件系统&#xff0c;用于向用户空间公开有关设备和驱动程序的信息。它类似于/proc文件系统&#xff0c;但是专注于设备和驱动程序信息&#xff0c;而非进程信息。 Sysfs通过文…

安装jfrog container registry(jcr)

1、下载软件 下载地址,本案例下载的是jfrog-artifactory-jcr-7.59.11-linux.tar.gz: https://releases.jfrog.io/artifactory/bintray-artifactory/org/artifactory/jcr/jfrog-artifactory-jcr/ 2、解压下载下来的压缩包 tar zxf jfrog-artifactory-jcr-7.59.11-linux.tar…

双向滑动选择器

插件地址:https://ext.dcloud.net.cn/plugin?id3940 注意: 当改变值是,让滑块自动滑动需要调用: this.$refs.powerSlider.updateValue(that.tempPowerValue[0], that.tempPowerValue[1], false); <view style"width: 90%;margin: 15px"><cj-slider ref…

ffmpeg音视频开发从入门到精通——ffmpeg 视频数据抽取

文章目录 FFmpeg视频处理工具使用总结环境配置主函数与参数处理打开输入文件获取流信息分配输出文件上下文猜测输出文件格式创建视频流并设置参数打开输出文件并写入头信息读取、转换并写入帧数据写入尾信息并释放资源运行程序注意事项源代码 FFmpeg视频处理工具使用总结 环境…

tp5学习基本控制器和视图

1 文件结构 正在上传…重新上传取消 application 主要操作目录 extend 扩展 public 入口文件 runtime 运行时文件 thinkphp 核心代码 vendor 三方扩展 2 public/index.php 解析 正在上传…重新上传取消 .htaccess Apache 可写文件 index.php 主目录 router.php 路由文件 3 inde…

LLC开关电源开发:第四节,LLC软件设计报告

LLC源代码链接 数控全桥LLC开发板软件设计报告  1. LLC硬件及软件框架2. LLC软件设计2.1 工程文件说明2.2 LLC中断设计2.2.1 20us中断2.2.2 5ms中断 2.3 LLC状态机设计2.3.1 初始化状态2.3.2 空闲状态2.3.3 软启动状态2.3.4 正常运行状态2.3.5 故障状态 2.4 环路设计2.4.1 环路…

YOLOv8中的C2f模块

文章目录 一、结构概述二、模块功能 一、结构概述 C2f块:首先由一个卷积块(Conv)组成&#xff0c;该卷积块接收输入特征图并生成中间特征图特征图拆分:生成的中间特征图被拆分成两部分&#xff0c;一部分直接传递到最终的Concat块&#xff0c;另一部分传递到多个Botleneck块进…

three.js 第八节 - gltf加载器、解码器

// ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入hdr加载器&#xff08;专门加载hdr的&#xff09; import { RGBELoader } from three/examples/jsm/loaders…