Java操作excel之poi

news2025/1/18 21:17:27

1. 创建Excel

1.1 创建新Excel工作簿

引入poi依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->          
<dependency>                  
    <groupId>org.apache.poi</groupId>                  
    <artifactId>poi</artifactId>                  
    <version>5.2.3</version>          
</dependency>

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Workbook; 
import java.io.FileOutputStream;  
public class Demo01 {     
    public static void main(String[] args) throws Exception {         
        // 创建一个工作簿         
        Workbook wb = new HSSFWorkbook();         
        // 创建输出流         
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\java\\poi\\poi\\创建一个Excel工作簿.xls");         
        wb.write(fileOutputStream);         
        // 工作簿写出流         
        wb.close();     
    } 
}

运行代码

 1.2 创建新sheet页

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Workbook;   
import java.io.FileOutputStream;   
public class Demo02 {          
    public static void main(String[] args) throws Exception {                  
        // 创建一个工作簿                  
        Workbook wb = new HSSFWorkbook();                  
        // 创建一个sheet页                  
        wb.createSheet("这是第一个sheet的名字");                  
        wb.createSheet("这是第二个sheet的名字");                  
        // 创建输出流                  
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\java\\poi\\poi\\创建sheet.xls");                  
        // 工作簿写出流                  
        wb.write(fileOutputStream);                  
        wb.close();          
    }  
}

运行代码

1.3 创建单元格

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;   
import java.io.FileOutputStream;   
public class Demo03 {          
    public static void main(String[] args) throws Exception {                  
        // 创建一个工作簿                  
        Workbook wb = new HSSFWorkbook();                  
        // 创建一个sheet页                  
        Sheet sheet = wb.createSheet("这是第一个sheet的名字");                  
        // 创建单元格并设置内容                  
        // 创建第一行                  
        Row row = sheet.createRow(0);                  
        row.createCell(0).setCellValue(1); // 第一列          
        row.createCell(1).setCellValue(1.2); // 第二列            
        row.createCell(2).setCellValue("字符串"); // 第三列                
        // 创建输出流                  
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\java\\poi\\poi\\创建sheet.xls");                
        // 工作簿写出流                  
        wb.write(fileOutputStream);               
        wb.close();        
    }  
}

运行代码

2. 创建时间格式单元格

2.1 创建一个时间格式的单元格

Java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.util.Date;

/**
 * @Description: 创建时间格式单元格
 * @author: lh
 */
public class Demo04 {
    public static void main(String[] args) throws Exception {
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(0);
        row.createCell(0).setCellValue(new Date());
        // 设置单元格日期格式
        CreationHelper creationHelper = workbook.getCreationHelper();
        CellStyle cellStyle = workbook.createCellStyle();// 单元格样式
        cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd hh:mm:ss"));
        Cell cell = row.createCell(1);
        cell.setCellValue(new Date());
        cell.setCellStyle(cellStyle);
        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

2.2 遍历工作簿的行和列并获取单元格内容

java代码

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;

/**
 * @Description: 遍历单元格
 * @author: lh
 */
public class Demo05 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        POIFSFileSystem fs = new POIFSFileSystem(fileInputStream);
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fs);
        HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
        if (sheet == null) {
            return;
        }
        // 遍历row
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            HSSFRow row = sheet.getRow(i);
            if (row == null) {
                continue;
            }
            // 遍历cell
            for (int j = 0; j <= row.getLastCellNum(); j++) {
                if (row.getCell(j) == null) {
                    continue;
                }
                System.out.print(" " + getValue(row.getCell(j)));
            }
            System.out.println();
        }
    }

    /**
     * 获取不同类型单元格类型的值 
     * @param cell 单元格
     * @return 单元格内容
     */
    private static String getValue(HSSFCell cell) {
        switch (cell.getCellType()) {
            case NUMERIC:
                return Double.toString(cell.getNumericCellValue());
            case BOOLEAN:
                return Boolean.toString(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            case STRING:
                return cell.getStringCellValue();
            // Add cases for other cell types as needed...
            default:
                System.out.println("Unsupported cell type");
                return "";
        }
    }
}

运行结果

2.4 文本提取

Java代码

import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;

/**
 * @Description: 文本提取
 * @author: lh
 */
public class Demo06 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        POIFSFileSystem fs = new POIFSFileSystem(fileInputStream);
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fs);

        ExcelExtractor excelExtractor = new ExcelExtractor(hssfWorkbook);
        excelExtractor.setIncludeSheetNames(false); //不需要sheet页
        System.out.println(excelExtractor.getText());
        fileInputStream.close();
        fs.close();
    }
}

运行结果 

3. 单元格处理

3.1 单元格对齐方式

Java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;

/**
 * @Description: 单元格对齐方式
 * @author: lh
 */
public class Demo07 {
    public static void main(String[] args) throws Exception {
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(0);
        row.setHeightInPoints(30);

        // 创建单元格对齐方式
        createCell(workbook, row, (short) 0, HorizontalAlignment.CENTER,  VerticalAlignment.CENTER, "单元格对齐方式1");
        createCell(workbook, row, (short) 1, HorizontalAlignment.LEFT, VerticalAlignment.BOTTOM,  "单元格对齐方式2");
        createCell(workbook, row, (short) 2, HorizontalAlignment.RIGHT, VerticalAlignment.TOP,  "单元格对齐方式3");

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }


    private static void createCell(Workbook workbook, Row row, short column, HorizontalAlignment align, VerticalAlignment valign, String value) {
        Cell cell = row.createCell(column);
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(align);
        cellStyle.setVerticalAlignment(valign);
        cell.setCellValue(value);
        cell.setCellStyle(cellStyle);
    }
}

运行结果

3.2 单元格边框处理

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;

/**
 * @Description: 单元格边框处理
 * @author: lh
 */
public class Demo08 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);
        Cell cell = row.createCell(1);
        cell.setCellValue("单元格边框处理");

        // 单元格边框处理
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setBorderTop(BorderStyle.THIN); // 顶部边框样式
        cellStyle.setTopBorderColor(IndexedColors.RED.getIndex()); // 顶部边框颜色

        cellStyle.setBorderLeft(BorderStyle.MEDIUM); // 左边边框样式
        cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex()); // 左边边框颜色

        cellStyle.setBorderRight(BorderStyle.MEDIUM); // 右边边框样式
        cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex()); // 右边边框颜色

        cellStyle.setBorderBottom(BorderStyle.MEDIUM); // 底部边框样式
        cellStyle.setBottomBorderColor(IndexedColors.BROWN.getIndex()); // 底部边框颜色
        cell.setCellStyle(cellStyle);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

3.3 单元格填充色和颜色操作

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;

/**
 * @Description: 设置单元格颜色
 * @author: lh
 */
public class Demo09 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        // 设置单元格颜色
        Cell cell = row.createCell(1);
        cell.setCellValue("单元格边框处理");
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); //背景色
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell.setCellStyle(cellStyle);

        Cell cell1 = row.createCell(2);
        cell1.setCellValue("单元格边框处理1");
        CellStyle cellStyle1 = workbook.createCellStyle();
        cellStyle1.setFillForegroundColor(IndexedColors.RED.getIndex()); //前景色
        cellStyle1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell1.setCellStyle(cellStyle1);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

3.4 单元格合并

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileOutputStream;

/**
 * @Description: 单元格合并
 * @author: lh
 */
public class Demo10 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        // 合并单元格
        Cell cell = row.createCell(1);
        cell.setCellValue("合并单元格");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 3));

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

4. 字体处理

4.1 字体处理

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;

/**
 * @Description: 字体处理
 * @author: lh
 */
public class Demo11 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        // 创建一个字体处理类
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 24);
        font.setFontName("宋体");
        font.setItalic(true);

        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);
        Cell cell = row.createCell((short) 1);
        cell.setCellValue("hello world");
        cell.setCellStyle(cellStyle);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

4.2 单元格中使用换行

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;

/**
 * @Description: 单元格换行
 * @author: lh
 */
public class Demo12 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        Cell cell = row.createCell(2);
        cell.setCellValue("我要换行 \n 成功了吗?");
        CellStyle cellStyle = workbook.createCellStyle();
        // 设置可以换行
        cellStyle.setWrapText(true);
        cell.setCellStyle(cellStyle);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

5. 综合示例

// excel导入	
@Transactional
public Result<?> import(Model model) throws IOException
{
    // 获取上传附件
    String attId = attachFileAppService.handleAttFiles(Collections.singletonList(model));
    if (StringUtil.isEmpty(attId))
    {
        throw new NormalRuntimeException(ModelCodeConstants.ATTACHMENT_LOST);
    }
    Workbook workbook = null;
    InputStream data = null;
    try
    {
        // 获取Excel文件流
        UploadAttachFileInfo uploadAttachFileInfo = attachFileAppService.downloadFile(attId);
        // 文件格式校验
        checkType(uploadAttachFileInfo);
        data = uploadAttachFileInfo.getData();
        workbook = ExcelUtils.getExcelWorkbook(data);
        Sheet sheet = workbook.getSheet(ModelCodeConstants."读取sheet的名字");
        if (CommonUtil.isEmpty(sheet))
        {
            return Result.fail(ModelCodeConstants.ERROR_TITLE);
        }
        // 表头检验
        checkTitle(sheet);
        // 空表检验
        if (sheet.getLastRowNum() == 0 && sheet.getPhysicalNumberOfRows() == 1)
        {
            return Result.fail(ModelCodeConstants.EMPTY_FILE);
        }
        // 数据导入- 从第四行开始
        int startRowIndex = 4;
        Iterator<Row> iterator = sheet.iterator();
        for (int i = 0; i < startRowIndex; i++)
        {
            iterator.next();
        }
        List<XXX> list = new ArrayList<>();
        List<XXX> errList = new ArrayList<>();
        while (iterator.hasNext())
        {
            Row row = iterator.next();
            String xxx = getValue(row.getCell(0));
            String yyy = getValue(row.getCell(1));
            String zzz = getValue(row.getCell(2));
            String aaa = getValue(row.getCell(3));
     
            // 导入数据规则校验
            StringJoiner joiner = new StringJoiner(",");
            checkBody(xxx, yyy, zzz, aaa, joiner);
            XXX err = new XXX();
            if (joiner.length() != 0)
            {
                err.setErrMsg(joiner);
             	// 错误信息添加
                errList.add(err);
            } else
            {
                XXX x = new XXX();
               	// 入库信息添加
                list.add(x);
                // 数据入库
                service.add();
            }
        }
        if (CommonUtil.isNotEmpty(errList))
        {
            //把原信息和错误信息写回去
            String uuid = writeErrExcel(errList);
            return Result.fail("数据导入不成功,点击下载错误信息!").setData(uuid);
        }
    } catch (Exception e)
    {
        e.printStackTrace();
        return Result.fail(e.getMessage());
    } finally
    {
        assert workbook != null;
        workbook.close();
        data.close();
    }
    return Result.success();
}

/**
* 文件格式校验 以xls或者xlsx结尾
*/
private static void checkType(UploadAttachFileInfo uploadAttachFileInfo)
{
    AttachFileInfo fileInfo;
    fileInfo = uploadAttachFileInfo.getFileInfo();
    if (!fileInfo.getFileName().endsWith(ModelCodeConstants.EXCEL_SUFFIX_XLS)
        && !fileInfo.getFileName().endsWith(ModelCodeConstants.EXCEL_SUFFIX_XLSX))
    {
        throw new NormalRuntimeException("文件格式有误!");
    }
}

/**
* 校验表头是否正确
*/
private static void checkTitle(Iterator<Row> rowIterator)
{
    Row headerRow = rowIterator.next();
    Cell xxxx = headerRow.getCell(0);
    Cell yyyy = headerRow.getCell(1);
    if (!"xxxx".equals(xxxx.getStringCellValue()) || !"yyyy".equals(yyyy.getStringCellValue()))
    {
        throw new NormalRuntimeException(ModelCodeConstants.ERROR_TITLE);
    }
}

/**
* 填写错误信息excel
*/
private String writeErrExcel(List<XXX> errList) throws Exception
{
    // 读取错误信息模板
    String rootPath = SpringContextConfig.getOptRootPath();
    String filePath = rootPath + FilePathConst.TEMPLATE_FILE_PATH + FileNameConst.WBS_CODE_ERROR_FILE_NAME;
    File file = ResourceUtils.getFile(filePath);
    InputStream inputStream = Files.newInputStream(file.toPath());

    // 处理导入错误信息数据
    Workbook workbook = ExcelUtils.getExcelWorkbook(inputStream);
    Sheet sheet = workbook.getSheet(ModelCodeConstants.TEMPLATE_ESTIMATE_DETAILS);
    int startRow = 4; // 从第五行开始写入数据
    CellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setWrapText(true); // 自动换行
    for (int i = startRow; i < errList.size() + startRow; i++)
    {
        Row row = sheet.createRow(i);
        XXX rowData = errList.get(i - startRow); // 获取当前行数据
        String xxx = rowData.getLevel();
        String yyy = rowData.getWbsCode();
        String zzz = rowData.getWbsDescribe();
        String aaa = rowData.getWbsAmount();
        String errMsg = rowData.getErrMsg();
        row.createCell(0).setCellValue(xxx);
        row.createCell(1).setCellValue(yyy);
        row.createCell(2).setCellValue(zzz);
        row.getCell(2).setCellStyle(cellStyle);
        row.createCell(3).setCellValue(aaa);
        row.createCell(4).setCellValue(errMsg);
        row.getCell(4).setCellStyle(cellStyle);
    }
    // Excel文件写到目标路径下
    String uuid = CommonUtil.getUUID();
    String distPath = AttachServerConfig.AttachServerTempPath + "/" + FilePathConst.ERROR_FILE_PATH + "/" + uuid
        + "/" + FileNameConst.WBS_CODE_ERROR_FILE_NAME;
    ExcelWriter write = new ExcelWriter(sheet);
    write.setDestFile(new File(distPath));
    write.flush();
    write.close();
    InputStream distStream = new FileInputStream(distPath);
    uuid = attachFileAppService.uploadFile(distStream, FileNameConst.WBS_CODE_ERROR_FILE_NAME,
                                               FileModelTypeEnum.导入失败信息.getModel(), uuid, "xlsx");
    return uuid;
}

// 枚举常量类
public interface ModelCodeConstants
{
	public final String ATTACHMENT_LOST = "导入附件丢失或未找到,请重新上传!";
	
    public final String ERROR_TITLE = "表头信息错误,请使用标准模板文件导入!";
    
    public final String EMPTY_FILE = "上传文件内容为空,请确认!";
	
}
// excel工具类
public class ExcelUtils
{	
    /**
     * 读取工作区域,传入流文件
     * @param input
     * @return
     */
    public static Workbook getExcelWorkbook(InputStream input)
    {
        Workbook workbook = null;
        try
        {
            workbook = WorkbookFactory.create(input);
        } catch (EncryptedDocumentException | InvalidFormatException | IOException e)
        {
            e.printStackTrace();
        }
        return workbook;
    }
    
     /**
     * 获取不同类型单元格类型的值 
     * @param cell 单元格
     * @return 单元格内容
     */
    private static String getValue(HSSFCell cell) {
        switch (cell.getCellType()) {
            case NUMERIC:
                return Double.toString(cell.getNumericCellValue());
            case BOOLEAN:
                return Boolean.toString(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            case STRING:
                return cell.getStringCellValue();
            // Add cases for other cell types as needed...
            default:
                System.out.println("Unsupported cell type");
                return "";
        }
    }
}

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

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

相关文章

AI原生应用为百度带来新增量

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; AI将彻底改变每一个行业!得益于AI和基础模型的驱动&#xff0c;百度在AI原生应用领域厚积薄发。 11月21日&#xff0c;百度Q3财报发布&#xff0c;数据显示&#xff1a;三季度营收达344.47亿元&…

Verilog开源项目——百兆以太网交换机(三)Hash模块设计

Verilog开源项目——百兆以太网交换机&#xff08;三&#xff09;Hash模块设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦整体架…

福州大学《嵌入式系统综合设计》实验三:多媒体开发基础编程

一、实验目的 本实验基于搭建好的开发环境和硬件环境&#xff0c;通过编写简单的通信实验&#xff0c;验证开发环境&#xff0c;掌握多媒体开发编程基础&#xff0c;包括SOCKET编程、多线程编程和线程同步知识。 二、实验内容 基于套接字、多线程、同步锁机制实现多媒体文件…

经典中的经典之字符串

前言&#xff1a;前段时间发烧了&#xff0c;所以耽误了很多事情&#xff0c;一直没有更新&#xff0c;多穿点衣服&#xff0c;感冒不好受。 接下来有时间就会陆续更新一些基础的算法题&#xff0c;题目都很经典&#xff0c;大家可以先尝试着做&#xff0c;再看 解析。 第一…

Live800:企业提升客户互动体验,有哪些关键因素?

如今&#xff0c;随着信息时代的不断发展&#xff0c;企业已经不再是单向的商业机构&#xff0c;他们需要与客户进行及时的沟通与反馈&#xff0c;从而更好地提升客户互动体验&#xff0c;达到营销和用户体验的双赢局面。那么&#xff0c;企业如何提升客户互动体验呢&#xff1…

从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP

Github于2023-03-09推出一项提高软件安全标准的措施&#xff0c;所有在Github上贡献过代码的开发人员在年底前必须完成 2FA&#xff08;Two-factory authentication&#xff0c;双因子认证&#xff09;。初听此事之时&#xff0c;不以为意&#xff0c;因为自己之前就知道双因子…

java创建指定分辨率的图片或修改图片的分辨率(DPI)

因为java默认的图片像素分辨率DPI72&#xff0c;分辨率有点低。所以研究了一下如何创建指定DPI的方案。 DPI&#xff1a; 指的是每英尺的像素点(dots per inch) JPEG图片 JPEG图片的元数据定义参看oracle官网。 https://docs.oracle.com/javase/8/docs/api/javax/imageio/me…

YOLO目标检测——卫星遥感舰船检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;卫星遥感舰船检测数据集说明&#xff1a;卫星遥感舰船检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含船一个类别标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xm…

代码随想录Day51 完结篇 LeetCode T84 柱状图的最大矩形

前言 今天代码随想录一刷也告一段落了,没想到我居然坚持下来了,一节都没有落下,学习到了很多种不同的解题思路,也和大家一块交流了很多,哈哈也许不久以后我还得再次二刷代码随想录,希望这一系列的题解能给大家带来帮助,如想要系统学习,请参照代码随想录网站的题解以及b站的配套…

对接苹果支付退款退单接口

前言 一般而言&#xff0c;我们其实很少对接退款接口&#xff0c;因为退款基本都是商家自己决定后进行操作的&#xff0c;但是苹果比较特殊&#xff0c;用户可以直接向苹果发起退款请求&#xff0c;苹果觉得合理会退给用户&#xff0c;但是目前公司业务还是需要对接这个接口&am…

2022年06月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 角色初始位置如图所示,下面哪个选项能让角色移到舞台的左下角? A: B: C: D: </

opencv-2D直方图

cv2.calcHist() 是 OpenCV 中用于计算直方图的函数。它可以计算一维或多维直方图&#xff0c;用于分析图像中像素值的分布。 基本的语法如下&#xff1a; hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数说明&#xff1a; images:…

10月起个税系统升级,3个月个税零申报将收到提示

近日&#xff0c;自然人电子税务局扣缴端升级了&#xff0c;升级后对于工资薪金收入连续三个月为零的纳税人&#xff0c;系统会自动出现以下提示。这个提示主要为了避免企业长期对已经离职的员工进行零申报&#xff0c;导致数据不准确和资源浪费。HR在申报个税时&#xff0c;一…

自动化测试学习指南

软件自动化测试的学习步骤 大概步骤如下&#xff1a; 1. 做好手工测试&#xff08;了解各种测试的知识&#xff09;-> 2. 学习编程语言-> 3. 学习Web基础&#xff08;HTML,HTTP,CSS,DOM,Javascript&#xff09;或者 学习Winform -> 4. 学习自动化测试工具 ->5.…

矩阵知识补充

正交矩阵 定义&#xff1a; 正交矩阵是一种满足 A T A E A^{T}AE ATAE的方阵 正交矩阵具有以下几个重要性质&#xff1a; A的逆等于A的转置&#xff0c;即 A − 1 A T A^{-1}A^{T} A−1AT**A的行列式的绝对值等于1&#xff0c;即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

关于ego-planner里面的GridMap

浙大这套开源的代码写得很nice 很值得借鉴 &#xff0c; 对于 GridMap 类的实现。该类通过智能指针的封装简化了 GridMap 实例的创建和管理过程。一旦通过 GridMap::initMap(ros::NodeHandle &nh) 方法初始化&#xff0c;就可以方便地调用 GridMap 及其所有相关功能 它主要…

cocos2dx ​​Animate3D (一)

3D相关的动画都是继承Grid3DAction 本质上是用GirdBase进行创建动画的小块。 Shaky3D 晃动特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 晃动的范围 // z轴是否晃动 static Shaky3D* create(float initWithDuration, const Size& …

Centos7安装Cesi(Supervisor集中管理工具)

Background CeSi 是 Supervisor 官方推荐的集中化管理 Supervisor 实例的 Web UI&#xff0c;该工具是用 Python 编写&#xff0c;基于 Flask Web 框架 。Superviosr 自带的 Web UI 不支持跨机器管理Supervisor 进程&#xff0c;功能比较简单&#xff0c;通过 CeSi 可以集中管理…

对线程的创建

一&#xff0c;概括 二&#xff0c;线程构建方式一&#xff08;继承Thread类&#xff09; 三&#xff0c;案例 父类&#xff1a; package Duoxiancheng;public abstract class Name {public static void main(String[] args) {//3&#xff0c;创建一个Thread线程类对象Thr…

python-opencv划痕检测-续

python-opencv划痕检测-续 这次划痕检测&#xff0c;是上一次划痕检测的续集。 处理的图像如下&#xff1a; 这次划痕检测&#xff0c;我们经过如下几步: 第一步&#xff1a;读取灰度图像 第二步&#xff1a;进行均值滤波 第三步&#xff1a;进行图像差分 第四步&#xff1…