EasyExcel 简单导入/导出 Controller Demo

1、导入EasyExcel依赖
        
        <!--导入EasyExcel依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>
————————————————
 

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.google.common.collect.Lists;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName ExcelController
 * @Descripition EasyExcel导入/导出
 * @Author admin
 * @Date 2023/10/10 15:40
 */
@RestController
@RequestMapping("/excel/test")
public class ExcelController {

    // Excel文件名称
    private static final String FILE_NAME = "订单列表test";

    //一个sheet装100w数据
    private static final Integer PER_SHEET_ROW_COUNT = 30;
    //每次查询20w数据,每次写入20w数据
    private static final Integer PER_WRITE_ROW_COUNT = 10;


    /**
     * 一、EasyExcel简单导入
     *
     * @param file
     * @throws IOException
     */
    @PostMapping("/import")
    public void importExcel(@RequestParam MultipartFile file) throws IOException {

        InputStream inputStream = file.getInputStream();

        List<CustomerImportClass> list = EasyExcel.read(inputStream)
                .head(CustomerImportClass.class)
                // 设置sheet,默认读取第一个
                .sheet()
                // 设置标题所在行数
                .headRowNumber(1)
                .doReadSync();

        for (CustomerImportClass customerImportClass : list) {
            System.out.println(customerImportClass);
        }

        System.out.println("【成功导入Excel数据】条数 : " + list.size());
    }


    /**
     * 二、EasyExcel简单导入
     * 1.1、单sheet导入(读)Excel
     * 1.2、分页(批次)查询数据循环写入Excel表格
     *
     * @param file
     * @throws IOException
     */
    @PostMapping("/importPage")
    public void importPage(@RequestParam MultipartFile file) throws IOException {

        InputStream inputStream = file.getInputStream();

        // 1.1、单sheet导入(读)Excel
        // 1.2、分页(批次)查询数据循环写入Excel表格
        EasyExcel.read(inputStream, new CustomListener())
                // 设置sheet,默认读取第一个
                .sheet()
                // 设置标题所在行数
                .headRowNumber(1)
                .doRead();

    }


    /**
     * 三、EasyExcel简单导入
     * 1.1、多sheet导入(读)Excel
     * 1.2、分页(批次)查询数据循环写入Excel表格
     *
     * @param file
     * @throws IOException
     */
    @PostMapping("/importSheetPage")
    public void importSheetPage(@RequestParam MultipartFile file) throws IOException {

        InputStream inputStream = file.getInputStream();

        // 2.1、多sheet导入(写入)Excel
        // 2.2、分页(批次)查询数据循环写入Excel表格
        EasyExcel.read(inputStream, new CustomListener())
                // 设置标题所在行数
                .headRowNumber(1)
                .doReadAll();

    }


    /**
     * 一、EasyExcel简单导出
     *
     * @param response
     */
    @GetMapping("/export")
    public void exportExcel(HttpServletResponse response) {
        try {
            // 设置响应结果
            this.setExcelResponseProp(response, FILE_NAME);

            // 模拟业务代码,获取数据集
            List<ExcelTemplate> list = this.queryToExcel();

            EasyExcel.write(response.getOutputStream())
                    .head(ExcelTemplate.class)
                    .excelType(ExcelTypeEnum.XLSX)
                    .sheet(FILE_NAME)
                    .doWrite(list);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 二、EasyExcel简单批量导出
     * 1、单sheet导出(写入)Excel
     * 2、分页(批次)查询数据循环写入Excel表格
     *
     * @param response
     */
    @GetMapping("/exportPage")
    public void exportPage(HttpServletResponse response) {
        try {

            // 设置响应结果
            this.setExcelResponseProp(response, FILE_NAME);

            // 单sheet导出(写入)Excel
            exportSheet(response);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 三、EasyExcel简单批量导出
     * 1、多sheet导出(写入)Excel
     * 2、分页(批次)查询数据循环写入Excel表格
     *
     * @param response
     */
    @GetMapping("/exportSheetPage")
    public void exportSheetPage(HttpServletResponse response) {
        try {

            // 设置响应结果
            this.setExcelResponseProp(response, FILE_NAME);

            // 多sheet分页(批)查询数据循环写入Excel表格
            exportMoreSheet(response);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 设置响应结果
     *
     * @param response    响应结果对象
     * @param rawFileName 文件名
     * @throws UnsupportedEncodingException 不支持编码异常
     */
    private void setExcelResponseProp(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {

        // 下载EXCEL
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");

        // 这里URLEncoder.encode可以防止浏览器端导出excel文件名中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode(rawFileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

    }

    /**
     * easyExcel 导出Excel表格简单 : Demo
     */
    public void excelWriteUtil() {
        //1、创建一个文件对象
        File excelFile = new File("D:\\test\\test001\\desktop\\excel_test1001.xlsx");
        //2、判断文件是否存在,不存在则创建一个Excel文件
        if (!excelFile.exists()) {
            try {
                excelFile.createNewFile();//创建一个新的文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //3、指定需要那个class去写。然后写到第一个sheet,名字为模版,然后文件流会自动关闭
        EasyExcel.write(excelFile, ExcelTemplate.class).sheet("订单模版").doWrite(queryToExcel());
    }


    /**
     * 1、查询数据库获取导出的数据集合
     * 2、集合转换导出模版实体集合:ExcelTemplate
     *
     * @return
     */
    public List<ExcelTemplate> queryToExcel() {
        // 1、查询数据库获取导出的数据集合
        // 模拟业务代码,获取数据集
        List<ExcelTemplate> orders = Lists.newArrayList();
        for (int i = 0; i < 115; i++) {
            ExcelTemplate template1 = new ExcelTemplate(1000L + i, "订单01" + i, "商品名称" + i, "sk1001" + i, 36L + i, 50L + i, "收件人" + i, "北京科技园" + i);
            orders.add(template1);
        }

        // 2、集合转换导出模版实体集合:ExcelTemplate
        List<ExcelTemplate> excels = new ArrayList<>();
        //遍历数据集,导出Excel
        for (int i = 0; i < orders.size(); i++) {
            ExcelTemplate order = orders.get(i);
            ExcelTemplate data = new ExcelTemplate();
            data.setOrderNum(order.getOrderNum());
            data.setOrderName(order.getOrderName());
            data.setGoodsName(order.getGoodsName());
            data.setGoodsNum(order.getGoodsNum());
            data.setPrice(order.getPrice());
            data.setNum(order.getNum());
            data.setUserName(order.getUserName());
            data.setAddress(order.getAddress());
            excels.add(data);
        }
        return excels;
    }


    /**
     * EasyExcel简单批量导出
     * 1、单sheet导出(写入)Excel
     * 2、分页(批次)查询数据循环写入Excel表格
     *
     * @param response
     * @throws IOException
     */
    public void exportSheet(HttpServletResponse response) throws IOException {
        OutputStream outputStream = null;
        try {
            //记录总数:实际中需要根据查询条件进行统计即可
            Integer totalCount = queryToExcel().size();
            //每次写入的数据量20w,每页查询20W
            Integer writeDataRows = PER_WRITE_ROW_COUNT;
            //计算sheet需要写入的次数
            Integer lastSheetWriteCount = totalCount % writeDataRows == 0 ? totalCount / writeDataRows : (totalCount / writeDataRows + 1);

            // ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            // HttpServletResponse response = requestAttributes.getResponse();

            outputStream = response.getOutputStream();
            //必须放到循环外,否则会刷新流
            ExcelWriter excelWriter = EasyExcel.write(outputStream).build();

            //创建Sheet
            // WriteSheet sheet = new WriteSheet();
            // sheet.setSheetName("测试Sheet001");
            // sheet.setSheetNo(0);
            //循环写入次数: j的自增条件是当不是最后一个Sheet的时候写入次数为正常的每个Sheet写入的次数,如果是最后一个就需要使用计算的次数lastSheetWriteCount
            for (int j = 0; j < lastSheetWriteCount; j++) {
                //分页查询一次20w
                List<ExcelTemplate> list = Lists.newArrayList();

                // 集合截取起始下标计算
                int startIndex = j * writeDataRows;

                // 判断是否是最后一次写入Excel
                if (j < (lastSheetWriteCount - 1)) {
                    list = queryToExcel().subList(startIndex, writeDataRows * (j + 1));
                }
                // 判断是否是最后一次写入Excel
                if (j == (lastSheetWriteCount - 1)) {
                    // 计算是否是最后一次截取集合
                    int stepValue = queryToExcel().size() - (startIndex) >= writeDataRows ? writeDataRows : queryToExcel().size() - (startIndex);

                    list = queryToExcel().subList(startIndex, startIndex + stepValue);
                }
                // Page<Emp> page = empMapper.selectPage(new Page(j + 1 + oneSheetWriteCount * i, writeDataRows), null);
                // List<Emp> empList = page.getRecords();
                List<ExcelTemplate> empVoList = new ArrayList<>();
                for (ExcelTemplate emp : list) {
                    ExcelTemplate empVo = new ExcelTemplate();
                    BeanUtils.copyProperties(emp, empVo);
                    empVoList.add(empVo);
                }

                WriteSheet writeSheet = EasyExcel.writerSheet(0, FILE_NAME).head(ExcelTemplate.class)
                        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();

                //写数据
                excelWriter.write(empVoList, writeSheet);
            }

            /*// 下载EXCEL
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止浏览器端导出excel文件名中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("员工信息", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");*/

            excelWriter.finish();
            outputStream.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (BeansException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }


    /**
     * EasyExcel简单批量导出
     * 1、多sheet导出(写入)Excel
     * 2、分页(批次)查询数据循环写入Excel表格
     *
     * @param response
     * @throws IOException
     */
    public void exportMoreSheet(HttpServletResponse response) throws IOException {
        OutputStream outputStream = null;
        try {
            //记录总数:实际中需要根据查询条件进行统计即可
            Integer totalCount = queryToExcel().size();
            //每一个Sheet存放100w条数据
            Integer sheetDataRows = PER_SHEET_ROW_COUNT;
            //每次写入的数据量20w,每页查询20W
            Integer writeDataRows = PER_WRITE_ROW_COUNT;
            //计算需要的Sheet数量
            Integer sheetNum = totalCount % sheetDataRows == 0 ? (totalCount / sheetDataRows) : (totalCount / sheetDataRows + 1);
            //计算一般情况下每一个Sheet需要写入的次数(一般情况不包含最后一个sheet,因为最后一个sheet不确定会写入多少条数据)
            Integer oneSheetWriteCount = sheetDataRows / writeDataRows;
            //计算最后一个sheet需要写入的次数
            Integer lastSheetWriteCount = totalCount % sheetDataRows == 0 ? oneSheetWriteCount : (totalCount % sheetDataRows % writeDataRows == 0 ? (totalCount % sheetDataRows / writeDataRows) : (totalCount % sheetDataRows / writeDataRows + 1));

            // 获取响应 response
            // ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            // HttpServletResponse response = requestAttributes.getResponse();

            // 获取输出流
            outputStream = response.getOutputStream();
            //必须放到循环外,否则会刷新流
            ExcelWriter excelWriter = EasyExcel.write(outputStream).build();

            //开始分批查询分次写入
            for (int i = 0; i < sheetNum; i++) {
                //创建Sheet
                WriteSheet sheet = new WriteSheet();
                sheet.setSheetName("测试Sheet001" + i);
                sheet.setSheetNo(i);
                //循环写入次数: j的自增条件是当不是最后一个Sheet的时候写入次数为正常的每个Sheet写入的次数,如果是最后一个就需要使用计算的次数lastSheetWriteCount
                for (int j = 0; j < (i != sheetNum - 1 ? oneSheetWriteCount : lastSheetWriteCount); j++) {
                    //分页查询一次20w
                    List<ExcelTemplate> list = queryToExcel().subList(j * writeDataRows, writeDataRows * (j + 1));
                    if (i > 0) {
                        // 集合截取起始下标计算
                        int startIndex = i * sheetDataRows + writeDataRows * j;

                        // 计算是否是最后一次截取集合
                        int stepValue = queryToExcel().size() - (startIndex) >= writeDataRows ? writeDataRows : queryToExcel().size() - (startIndex);

                        list = queryToExcel().subList(startIndex, startIndex + stepValue);
                    }
                    // Page<Emp> page = empMapper.selectPage(new Page(j + 1 + oneSheetWriteCount * i, writeDataRows), null);
                    // List<Emp> empList = page.getRecords();
                    List<ExcelTemplate> empVoList = new ArrayList<>();
                    for (ExcelTemplate emp : list) {
                        ExcelTemplate empVo = new ExcelTemplate();
                        BeanUtils.copyProperties(emp, empVo);
                        empVoList.add(empVo);
                    }
                    WriteSheet writeSheet = EasyExcel.writerSheet(i, FILE_NAME + (i + 1)).head(ExcelTemplate.class)
                            .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
                    //写数据
                    excelWriter.write(empVoList, writeSheet);
                }
            }

            /*// 下载EXCEL
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止浏览器端导出excel文件名中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("员工信息", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");*/

            excelWriter.finish();
            outputStream.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (BeansException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }

}

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * @ClassName CustomerImportClass
 * @Descripition 导入模版类
 * @Author admin
 * @Date 2023/10/10 15:44
 */
@Data
public class CustomerImportClass {

    @ExcelProperty(index = 0)
    private String column1;

    @ExcelProperty(index = 1)
    private String column2;

    @ExcelProperty(index = 2)
    private String column3;

    @ExcelProperty(index = 3)
    private String column4;

    @ExcelProperty(index = 4)
    private String column6;

    @ExcelProperty(index = 5)
    private String column5;

    @ExcelProperty(index = 6)
    private String column7;
}

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.compress.utils.Lists;

import java.util.List;
import java.util.Map;

/**
 * @ClassName CustomListener
 * @Descripition 导入Excel监听解析表格数据
 * @Author admin
 * @Date 2023/10/9 15:40
 */
@Slf4j
public class CustomListener extends AnalysisEventListener<Map<Integer, String>> {

    // 处理数据: 分批导入阈值
    private static final Long size = 8L;

    // private List<Map<String, String>> list = Lists.newArrayList();
    private List<Object> list = Lists.newArrayList();

    //获取excel表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        log.info("获取excel表头信息 data : {}", JSON.toJSONString(headMap));
        System.out.println(JSON.toJSONString(headMap));
        System.out.println();
        System.out.println();
    }

    // 每解析一行数据,该方法会被调用一次
    @Override
    public void invoke(Map<Integer, String> map, AnalysisContext analysisContext) {
        log.info("Excel每解析一行数据,该方法(invoke)会被调用一次 data : {}", JSON.toJSONString(map));
        // int size = analysisContext.readRowHolder().getCellMap().entrySet().size();
        // System.out.println(size);

        list.add(map);
        if(list.size() >= CustomListener.size){
            for (Object o1 : list) {
                System.out.println(o1);
            }
            System.out.println("处理数据: 分批导入阈值: " + size);
            System.out.println();
            System.out.println();
            list.clear();
        }
    }

    // 全部解析完成被调用
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

        System.out.println("最后剩余数据;不够分割 长度 : " + list.size());
        if(CollectionUtils.isNotEmpty(list)){
            for (Object o : list) {
                System.out.println(o);
            }
            System.out.println();
            list.clear();
        }
        System.out.println("解析数据完成!!!");
        // System.out.println("解析数据完成!!!");
    }
}

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.*;
import com.alibaba.excel.enums.poi.BorderStyleEnum;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @ClassName ExcelTemplate
 * @Descripition 导出模版
 * @Author admin
 * @Date 2023/10/9 18:14
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@HeadRowHeight(value = 50) // 头部行高
@ContentRowHeight(value = 25) // 内容行高
@ColumnWidth(value = 25) // 列宽
// 头背景设置成红色 IndexedColors.RED.getIndex()
// @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
// 头字体设置成20, 字体默认宋体
@HeadFontStyle(fontName = "仿宋", fontHeightInPoints = 20)
// 头部边框实线
@HeadStyle(borderTop = BorderStyleEnum.THICK,
        borderBottom = BorderStyleEnum.THICK,
        borderLeft = BorderStyleEnum.THICK,
        borderRight = BorderStyleEnum.THICK)
// 内容的背景设置成绿色  IndexedColors.GREEN.getIndex()
// @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
// 内容字体设置成20, 字体默认宋体
@ContentFontStyle(fontName = "楷体", fontHeightInPoints = 20)
// Excel设置内容字体是否水平居中、边框实线
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER,
        borderTop = BorderStyleEnum.MEDIUM,
        borderBottom = BorderStyleEnum.MEDIUM,
        borderLeft = BorderStyleEnum.DOUBLE,
        borderRight = BorderStyleEnum.DOUBLE)
public class ExcelTemplate {


    // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
    // @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
    // 字符串的头字体设置成20
    // @HeadFontStyle(fontHeightInPoints = 20)
    // 字符串的内容背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
    // @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
    // 字符串的内容字体设置成20,默认宋体
    // @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
    // 设置是否水平居中
    // @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT)
    @ExcelProperty("订单编码")
    private Long orderNum;

    @ExcelProperty("订单名称")
    private String orderName;

    @ExcelProperty("商品名称")
    private String goodsName;

    @ExcelProperty("商品编码")
    private String goodsNum;

    @ExcelProperty("价格")
    private Long price;

    @ExcelProperty("数量")
    private Long num;

    @ExcelProperty("用户名称")
    private String userName;

    @ColumnWidth(value = 80) // 列宽
    @ExcelProperty("收货地址")
    private String address;


}


 

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

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

相关文章

Laya3.0 入门教程

点击play箭头 点击右边的开发者工具 就会弹出 chrome的调试窗口 然后定位到你自己的ts文件 直接在ts里断点即可 不需要js文件 如何自动生成代码&#xff1f; 比如你打开一个新项目 里面显示的是当前场景 只需要点击 UI运行时 右边的框就可以了 他会自动弹窗提示你 创建一个文…

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南 介绍 冻干周期的工艺开发在冻干中起着至关重要的作用&#xff0c;因为它可以优化关键工艺参数&#xff0c;以实现理想的产品质量和工艺一致性。优化冻干工艺还可以缩短运行时间&#xff0c;尽早发现关键错误&…

Practical Memory Leak Detection using Guarded Value-Flow Analysis 论文阅读

本文于 2007 年投稿于 ACM-SIGPLAN 会议1。 概述 指针在代码编写过程中可能出现以下两种问题&#xff1a; 存在一条执行路径&#xff0c;指针未成功释放&#xff08;内存泄漏&#xff09;&#xff0c;如下面代码中注释部分所表明的&#xff1a; int foo() {int *p malloc(4 …

centos下安装配置redis7

1、找个目录下载安装包 sudo wget https://download.redis.io/release/redis-7.0.0.tar.gz 2、将tar.gz包解压至指定目录下 sudo mkdir /home/redis sudo tar -zxvf redis-7.0.0.tar.gz -C /home/redis 3、安装gcc-c yum install gcc-c 4、切换到redis-7.0.0目录下 5、修改…

解决网页 H5 对接微信 JSSDK 后自定义分享和跳转APP等没效果

导致的原因 在聊天窗口直接点击一个文本链接&#xff0c;现在微信JSSDK已经不支持这样使用。 解决办法1 将文本链接生成一个二维码&#xff0c;然后微信扫码进入这个链接。 解决办法2 将这个文本链接收藏&#xff0c;然后从收藏打开这个链接。

学习记忆——数学篇——案例——代数——方程——一元二次方程

重点记忆法 a x 2 b x c 0 ax^2bxc0 ax2bxc0 整体可以由&#xff1a; 根&#xff08;多少&#xff0c;正负&#xff0c;区间&#xff09; ⟹ \Longrightarrow ⟹ △ △ △ ⟹ \Longrightarrow ⟹ 求根公式 x 1 , 2 x_{1,2} x1,2​ − b △ 2 a \frac{-b\sqrt{△}}{2a} 2…

LaunchView/启动页 的实现

1. 创建启动画板&#xff0c;LaunchScreen.storyboard 添加组件如图: 2. 项目中设置只支持竖屏&#xff0c;添加启动画板&#xff0c;如图: 3. 创建启动画面动画视图&#xff0c;LaunchView.swift import SwiftUI/// 启动视图 struct LaunchView: View {/// 字符串转换为字符串…

SQL获取正数第N个或倒数第N个数据

这里我们使用Order By与Limit的组合&#xff1a; Order By&#xff1a;可以将某个序列值按照从大到小或从小到大排序Limit&#xff1a;如果类似Limit 5表示前5个&#xff0c;Limit 3,5表示从第4个位置&#xff08;以0为开始&#xff09;开始往后取5个 通过这样的组合就可以实…

TensorFlow入门(十六、识别模糊手写图片)

TensorFlow在图像识别方面,提供了多个开源的训练数据集,比如CIFAR-10数据集、FASHION MNIST数据集、MNIST数据集。 CIFAR-10数据集有10个种类,由6万个32x32像素的彩色图像组成,每个类有6千个图像。6万个图像包含5万个训练图像和1万个测试图像。 FASHION MNIST数据集由衣服、鞋子…

社会工程学

1.概述 信息安全分为“硬安全 ”和“软安全 ”两个部分。所谓“硬安全”主要包括具体的IT安全技术&#xff08;比如防火墙、入侵检测、漏洞扫描、拒绝服务攻击、缓冲区溢出攻击、等等&#xff09;&#xff1b;而“软安全”主要涉及管理、心理学、文化、人际交往等方面&#xff…

java - 设计模式 - 状态模式

文章目录 前言java - 设计模式 - 状态模式1. 概述2. 作用3. 示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xf…

ES6之Array.from和Array.of

Array.from 用于将两类对象转为真正的数组&#xff1a; 1、类似数组的对象&#xff08;array-like object&#xff09; 2、可遍历&#xff08;iterable&#xff09;的对象&#xff08;包括 ES6 新增的数据结构 Set 和 Map&#xff09; let arrayLike {0: a,1: b,2: c,leng…

TensorFlow入门(十九、softmax算法处理分类问题)

softmax是什么? Sigmoid、Tanh、ReLU等激活函数,输出值只有两种(0、1,或-1、1或0、x),而实际现实生活中往往需要对某一问题进行多种分类。例如之前识别图片中模糊手写数字的例子,这个时候就需要使用softmax算法。 softmax的算法逻辑 如果判断输入属于某一个类的概率大于属于其…

在SSL中进行交叉熵学习的步骤

在半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;中进行交叉熵学习通常包括以下步骤&#xff1a; 准备标注数据和未标注数据 首先&#xff0c;你需要准备带有标签的标注数据和没有标签的未标注数据。标注数据通常是在任务中手动标记的&#xff…

Android系统定制之监听USB键盘来判断是否弹出软键盘

一.项目背景 在设备上弹出软键盘,会将一大部分UI遮挡起来,造成很多图标无法看到和点击,使用起来不方便,因此通过插入usb键盘输入代替软键盘,但是点击输入框默认会弹出软键盘,因此想要插入USB键盘时,默认关闭软键盘,拔出键盘时再弹出,方便用户使用 二.设计思路 2.1…

CPU型号参数和SAS卡参数说明

CPU型号 2*CPU Intel 4214 (2.2G/17M/12C/24T/85W) 解释&#xff1a; CPU&#xff1a;2颗 Intel Xeon Silver 4214 处理器 频率&#xff1a;2.2 GHz 缓存&#xff1a;17 MB 核心数量&#xff1a;12核心 线程数量&#xff1a;24线程 功耗&#xff1a;85W 1*SAS HBA卡SAS3008…

JavaScript进阶 第一天笔记

JavaScript 进阶 - 第1天 学习作用域、变量提升、闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0c;降低代码的冗余度。 理解作用域对程序执行的影响能够分析程序执行的作用域范围理解闭包本质&#xff0c;利用闭包…

可拓展的低代码全栈框架

尽管现在越来越多的人开始对低代码开发感兴趣&#xff0c;但已有低代码方案的局限性仍然让大家有所保留。其中最常见的担忧莫过于低代码缺乏灵活性以及容易被厂商锁定。 显然这样的担忧是合理的&#xff0c;因为大家都不希望在实现特定功能的时候才发现低代码平台无法支持&…

OpenGL LUT滤镜算法解析

1. 简介 滤镜&#xff1a;一些图像处理软件针对性地提供了一些对传统滤镜效果的模拟功能&#xff0c;使图像达到一种特殊效果。滤镜通常需要同通道、图层、色阶等联合使用&#xff0c;才能使图像取得最佳艺术效果。在软件界面中也直接以“滤镜”&#xff08;Filter&#xff09…

实现一个自己的脚手架教程

前言 脚手架并不实现&#xff0c;难的是最佳实践的整理和沉淀。本文不会涉及到最佳实践方面的内容&#xff0c;只是教会你如何实现一个最基础的脚手架&#xff0c;以此作为展示最佳实践的载体。 如何搭建一个脚手架的工程 如何开发和调试一个脚手架 脚手架中如何接收和处理命…