java导出Excel增加下拉框选项,解决小数据量和大数据量下拉框选项的问题

2023-10-27

java导出Excel增加下拉框选项

这篇文章主要介绍了Java 导出Excel增加下拉框选项,excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项,下文具体的操作详情,需要的小伙伴可以参考一下!

excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项

一、小数据量情况

选项较少(一般少于5个):

private static DataValidation setFewDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {
    DataValidationHelper helper = sheet.getDataValidationHelper();
    //加载下拉列表内容
    DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
    constraint.setExplicitListValues(textList);
    //设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
    CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
    //数据有效性对象
    return helper.createValidation(constraint, regions);
}

二、大数据量情况

选项较多

创建隐藏工作簿:

Sheet sheetHidden = wb.createSheet("Sheet2");
wb.setSheetHidden(1, true);

每一个列表占用一列

当然也可以每个列表使用一张工作簿,只用第一列。 这里是使用一个工作簿使用每个列,先26个字母,一般够用了

String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
for (int j = 0; j < dataList.size(); j++) {
    if (index == 0) { //第1个下拉选项,直接创建行、列
        row = sheetHidden.createRow(j); //创建数据行
        //      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
        row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值
    } else { //非第1个下拉选项
        int rowCount = sheetHidden.getLastRowNum();
        if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
            //获取行,创建列
            sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值

        } else { //未创建过的行,直接创建行、创建列
            //  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
            //创建行、创建列
            sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
        }
    }
}

index 代表第几个下拉框,也就是在隐藏工作簿的第几列,dataList表示下拉框的内容

创建公式:

String strFormula = “Sheet2!$” + arr[index] + “ 1 : 1: 1:” + arr[index] + “$” + dataList.size();

Sheet2第A1到A5000作为下拉列表来源数据

xls和xlsx生成下拉框的选项不一样

private static DataValidation setMoreDataValidation(Workbook wb, Sheet sheet, String strFormula, int startRow, int endRow, int startColumn, int endColumn) {

    DataValidation dataValidation;
    // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
    CellRangeAddressList regions = new CellRangeAddressList(startRow, endRow, startColumn, endColumn);
    if (wb instanceof XSSFWorkbook) {
        //获取新sheet页内容
        XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        // 数据有效性对象
        DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
        dataValidation = help.createValidation(constraint, regions);
        dataValidation.setSuppressDropDownArrow(true);
        dataValidation.setShowErrorBox(true);
    } else {
        // 设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);
        dataValidation = new HSSFDataValidation(regions, constraint);
        dataValidation.setSuppressDropDownArrow(false);
    }
    dataValidation.setEmptyCellAllowed(true);
    dataValidation.setShowPromptBox(true);
    dataValidation.createErrorBox("Error", "请选择下拉框中的数据");
    dataValidation.createPromptBox("提示", "只能选择下拉框里面的数据");
    return dataValidation;

}

加入工作簿:

sheet.addValidationData()

完整代码:

private static void setValidationDate(Workbook wb, Sheet sheet, List<DataValidationCell> dataValidationCellList) {
    if (dataValidationCellList.isEmpty()) {
        return;
    }
    String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
    int index = 0;
    Row row;
    Sheet sheetHidden = wb.createSheet("Sheet2");
    wb.setSheetHidden(1, true);
    for (DataValidationCell dataValidationCell : dataValidationCellList) {
        List<String> dataList = dataValidationCell.getDataList();
        if (CollectionUtils.isEmpty(dataList)) {
            continue;
        }
        if (dataList.size() <= 5) {
            sheet.addValidationData(setFewDataValidation(sheet, dataList.toArray(new String[0]),
                    dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),
                    dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //超过255个报错
        } else {
            //String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据
            String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$" + dataList.size(); //Sheet2第A1到A5000作为下拉列表来源数据
            sheet.addValidationData(setMoreDataValidation(wb, sheet, strFormula,
                    dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),
                    dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //下拉列表元素很多的情况
            //2、生成sheet2内容
            for (int j = 0; j < dataList.size(); j++) {
                if (index == 0) { //第1个下拉选项,直接创建行、列
                    row = sheetHidden.createRow(j); //创建数据行
                    //      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
                    row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值
                } else { //非第1个下拉选项
                    int rowCount = sheetHidden.getLastRowNum();
                    if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
                        //获取行,创建列
                        sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
                    } else { //未创建过的行,直接创建行、创建列
                        //  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽
                        //创建行、创建列
                        sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值
                    }
                }
            }
            index++;
        }
    }
}

java导出Excel增加下拉框选项(java结合easyExcel)

excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项

添加传参模型ConsumablesAddDTO

/**
 * 描述:添加传参模型ConsumablesAddDTO
 */
@Data
@ApiModel(value = "ConsumablesAddDTO", description = "耗材表AddDTO")
public class ConsumablesAddDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "仓库名称", required = true)
    @Excel(name = "*仓库名称", orderNum = "5", width = 20)
    @NotBlank(message = "仓库名称必填", groups = {Default.class})
    private String wareHouseName;

    @ApiModelProperty(value = "是否启用 0:否 1:是")
    @Excel(name = "是否启用", orderNum = "13",addressList = true,replace = {"否_0","是_1"})
    private Integer isEnable;

    @ApiModelProperty(value = "单位id")
    private String unitId;

    @ApiModelProperty(value = "单位名称", required = true)
    @Excel(name = "*单位", orderNum = "14", addressList = true, replace = {"瓶"}, width = 10)
    @NotBlank(message = "单位名称不能为空", groups = {Default.class})
    private String unitName;

}

仓库名称(wareHouseName)为大数据量,单位名称(unitName)为小数据量

一、小数据量情况(仅供参考)

选项较少(一般少于5个):

    /**
     * 生成excel下拉框(适用于下拉框选项的数量较少的情况)
     *
     * @param pojoClass
     */
    public void replaceHandel(Class<?> pojoClass, String[] List) {
        Field[] fields = pojoClass.getDeclaredFields();
        try {
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                String name = field.getName();
                if (name.equals("unitName")) {
                    // 这里可以加上指定字段做处理,也可以将需要的字段枚举或者是字段存到redis
                    Excel annotation = field.getAnnotation(Excel.class);
                    if (annotation != null && annotation.replace().length > 0) {
                        InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
                        Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
                        memberValues.setAccessible(true);
                        Map map = (Map) memberValues.get(invocationHandler);
                        // replace 的值是字符串数组,自定义的时候记得数据格式
                        map.put("replace", List);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

二、大数据量情况(推荐)

适用于下拉框选项较多情况

下拉框核心代码

/**
     * 使用createFormulaListConstraint生成excel下拉框(适用于下拉框选项的数量较多的情况)
     *
     * @param workbook
     * @param formulaString
     */
    public void setDropDownAndHidden( Workbook workbook, String[] formulaString) {
        // 获取工作表
        // 注意:不管exel中有多少个下拉框,这里都是固定的getSheetAt(0)
		Sheet sheet = workbook.getSheetAt(0);
	    //Sheet sheet = workbook.getSheet("sheet1");
		
        // 创建隐藏sheet
        Sheet hideSheet = workbook.createSheet("hiddenSheet");
        for (int i = 0; i < formulaString.length; i++) {
        // 这里面是下拉框的内容
            hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);
        }
        // 创建名称,可被其他单元格引用
        Name categoryName = workbook.createName();
        categoryName.setNameName("hidden");
        // 设置名称引用的公式
        // 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动,
        // 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。

        categoryName.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length);
        // 获取上文名称内数据
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");
        // 设置下拉框位置
        // 在第3行第5列位置处生成下拉框(下标从0开始):firstCol = lastCol = orderNum - 1;
        CellRangeAddressList addressList = new CellRangeAddressList(2, 4000, 4, 4);
        DataValidation dataValidation = helper.createValidation(constraint, addressList);
        // 处理Excel兼容性问题
        if (dataValidation instanceof XSSFDataValidation) {
            // 数据校验
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        } else {
            dataValidation.setSuppressDropDownArrow(false);
        }
        // 作用在目标sheet上
        sheet.addValidationData(dataValidation);
        // 设置hiddenSheet隐藏
        workbook.setSheetHidden(1, true);
    }

注意

如果exel中有多个下拉框,则只需多次调用setDropDownAndHidden这个方法,修改hiddenSheet字符串、hidden字符串、new CellRangeAddressList(2, 4000, 4, 4) 中的数值 、workbook.setSheetHidden(1, true)中有1个下拉框就是 (1,true) ,有两个下拉框就是 (2,true) ,以此类推…只需要修改这几个地方即可!

// 创建隐藏sheet
Sheet hideSheet = workbook.createSheet("hiddenSheet");
categoryName.setNameName("hidden");
categoryName.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length);
DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");
// 设置下拉框位置
// 在第3行第5列位置处生成下拉框(下标从0开始):firstCol = lastCol = orderNum - 1;
CellRangeAddressList addressList = new CellRangeAddressList(2, 4000, 4, 4);
// 设置hiddenSheet隐藏
workbook.setSheetHidden(1, true);

完整代码

Controller层

@GetMapping(value = "/template")
@ApiOperation(value = "获取耗材批量导入模板")
@LogAnnotation(operation = "获取耗材批量导入模板")
public void getTemplate(HttpServletResponse response) {
        try {
            baseService.template(response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Service层

/**
* 获取导入模板
*
* @param response
**/
void template(HttpServletResponse response) throws IOException;

ServiceImpl层

@Override
    public void template(HttpServletResponse response) throws IOException {

        String companyId = SecurityUtils.getCompanyId();

        // 导入模板下载
        List<String> unitList = unitMapper.findAllUnit(companyId).stream()
                .map(t -> t.getString("unitName") + "_" + t.getString("id"))
                .collect(Collectors.toList());
        Map<String,List<String>> map = new HashMap<>(2);
        map.put("unitId",unitList);

        // 单位名称集合
        LbqWrapper<Unit> unitLbqWrapper = Wraps.<Unit>lbQ();
        unitLbqWrapper.eq(Unit::getCompanyId, companyId);
        List<Unit> units = unitMapper.selectList(unitLbqWrapper);
        List<String> unitNames = units.stream().map(Unit::getUnitName).collect(Collectors.toList());
        // list转String数组
        String[] unitNameList = unitNames.toArray(new String[unitNames.size()]);

        // 仓库名称集合
        LbqWrapper<WareHouse> wareHouseWrapper = Wraps.lbQ();
        wareHouseWrapper.eq(WareHouse::getCompanyId, companyId);
        List<WareHouse> wareHouseList = wareHouseMapper.selectList(wareHouseWrapper);
        List<String> wareHouseNames = wareHouseList.stream().map(WareHouse::getWareHouseName).collect(Collectors.toList());
        // list转String数组
        String[] wareHouseNameList = wareHouseNames.toArray(new String[wareHouseNames.size()]);

        try {
            ReplaceValue.replace(ConsumablesAddDTO.class,map);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            throw new BizException("获取导入模板失败");
        }

        ExportParams params = new ExportParams("注:\n" +
                "1、物料编码具有唯一性,若重复会导入失败。若导入物料有对应编码则沿用,若无编码则系统随机生成;\n" +
                "2、物料分类、存放仓库、品牌、供应商请填物料分类编码、仓库名称、品牌编码、供应商编码,不能填写物料分类名称;\n" +
                "3、若存在多个采购员请使用英文逗号分隔;\n" +
                "4、安全库存和预留库存请填写正整数;\n" +
                "5、不允许对表头字段进行增删改。\n", ConsumableConstant.SHEET_NAME, ExcelType.XSSF);

        params.setTitleHeight((short) 30);
        params.setCreateHeadRows(true);
        params.setStyle(ExcelExportStyleImpl.class);

        // 生成带模板数据的workbook
        Workbook workbook = ExcelExportUtil.exportExcel(params, ConsumablesAddDTO.class, new ArrayList<ConsumablesAddDTO>());
        // 生成excel下拉框(适用于下拉框选项的数量较多的情况)
        // 这里excel中有两处要生成下拉框,所以调用了2次生成下拉框的方法
        setDropDownAndHidden1(workbook, wareHouseNameList);
        setDropDownAndHidden2(workbook, unitNameList);
        // replaceHandel(workbook, unitNameList);// 这个方法不推荐(适用于下拉框选项的数量较少的情况),仅供参考
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("耗材导入模板" + ".xlsx", "UTF-8"));
            response.flushBuffer();
            workbook.write(response.getOutputStream());
            workbook.close();
        } catch (IOException var4) {
            var4.printStackTrace();
            throw new BizException(var4.getMessage());
        }

    }

    /**
     * 使用createFormulaListConstraint生成excel下拉框(适用于下拉框选项的数量较多的情况)
     *
     * @param workbook
     * @param formulaString
     */
    public void setDropDownAndHidden1( Workbook workbook, String[] formulaString) {
        // 获取工作表
        // 注意:不管exel中有多少个下拉框,这里都是固定的getSheetAt(0)
        Sheet sheet = workbook.getSheetAt(0);
        // 创建隐藏sheet
        Sheet hideSheet = workbook.createSheet("hiddenSheet1");
        for (int i = 0; i < formulaString.length; i++) {
            // 这里面是下拉框的内容
            hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);
        }
        // 创建名称,可被其他单元格引用
        Name categoryName = workbook.createName();
        categoryName.setNameName("hidden1");
        // 设置名称引用的公式
        // 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动,
        // 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。
        categoryName.setRefersToFormula("hiddenSheet1!" + "$A$1:$A$" + formulaString.length);
        // 获取上文名称内数据
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden1");
        // 设置下拉框位置
        // 在第3行第5列位置处生成下拉框(下标从0开始):firstCol = lastCol = orderNum - 1;
        CellRangeAddressList addressList = new CellRangeAddressList(2, 4000, 4, 4);
        DataValidation dataValidation = helper.createValidation(constraint, addressList);
        // 处理Excel兼容性问题
        if (dataValidation instanceof XSSFDataValidation) {
            // 数据校验
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        } else {
            dataValidation.setSuppressDropDownArrow(false);
        }
        // 作用在目标sheet上
        sheet.addValidationData(dataValidation);
        // 设置hiddenSheet隐藏
        workbook.setSheetHidden(1, true);
    }

    /**
     * 使用createFormulaListConstraint生成excel下拉框(适用于下拉框选项的数量较多的情况)
     *
     * @param workbook
     * @param formulaString
     */
    public void setDropDownAndHidden2( Workbook workbook, String[] formulaString) {
        // 获取工作表
        // 注意:不管exel中有多少个下拉框,这里都是固定的getSheetAt(0)
        Sheet sheet = workbook.getSheetAt(0);
        // 创建隐藏sheet
        Sheet hideSheet = workbook.createSheet("hiddenSheet2");
        for (int i = 0; i < formulaString.length; i++) {
            // 这里面是下拉框的内容
            hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);
        }
        // 创建名称,可被其他单元格引用
        Name categoryName = workbook.createName();
        categoryName.setNameName("hidden2");
        // 设置名称引用的公式
        // 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动,
        // 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。
        categoryName.setRefersToFormula("hiddenSheet2!" + "$A$1:$A$" + formulaString.length);
        // 获取上文名称内数据
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden2");
        // 设置下拉框位置
        // 在第3行第14列位置处生成下拉框(下标从0开始):firstCol = lastCol = orderNum - 1;
        CellRangeAddressList addressList = new CellRangeAddressList(2, 4000, 13, 13);
        DataValidation dataValidation = helper.createValidation(constraint, addressList);
        // 处理Excel兼容性问题
        if (dataValidation instanceof XSSFDataValidation) {
            // 数据校验
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        } else {
            dataValidation.setSuppressDropDownArrow(false);
        }
        // 作用在目标sheet上
        sheet.addValidationData(dataValidation);
        // 设置hiddenSheet隐藏
        workbook.setSheetHidden(2, true);
    }

    /**
     * 生成excel下拉框(适用于下拉框选项的数量较少的情况)
     *
     * @param pojoClass
     */
    public void replaceHandel(Class<?> pojoClass, String[] List) {
        Field[] fields = pojoClass.getDeclaredFields();
        try {
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                String name = field.getName();
                if (name.equals(CommonConstant.UNIT_NAME)) {
                    // 这里可以加上指定字段做处理,也可以将需要的字段枚举或者是字段存到redis
                    Excel annotation = field.getAnnotation(Excel.class);
                    if (annotation != null && annotation.replace().length > 0) {
                        InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
                        Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
                        memberValues.setAccessible(true);
                        Map map = (Map) memberValues.get(invocationHandler);
                        // replace 的值是字符串数组,自定义的时候记得数据格式
                        map.put("replace", List);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

到此这篇关于Java 导出Excel增加下拉框选项的文章就介绍到这了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java导出Excel增加下拉框选项,解决小数据量和大数据量下拉框选项的问题 的相关文章

随机推荐

  • Python + Pyqt5 使用listWidget设置Item的两种方法

    方法一 addItems 不用分别设置每个Item的显示样式 self ui listWidget pdfList addItems list pdfList DF 文件名 添加Item 列表中有多少个数据 就有多少个Item self u
  • java使用world模板动态生成PDF文件

    根据项目需求 需要用到一个功能 根据页面参数需要动态的生成一个world 并将world生成两份PDF文件 一份正式文件 一份临时的电子文件 带有二维码 扫描可以下载正式文件的电子版本 同时上传到文件存储服务器minio上 下面介绍具体的实
  • Python 生成器原理详解

    点击上方蓝字 快速关注我们 翻译 你逗比 segmentfault com a 1190000011330511 如有好文章投稿 请点击 这里了解详情 这篇文章是对 500 Lines or Less 一书中高效爬虫一章的部分翻译 原文 H
  • 旋转数组的最小值(二分法)

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾 我们称之为数组的旋转 输入一个非减排序的数组的一个旋转 输出旋转数组的最小元素 例如数组 3 4 5 1 2 为 1 2 3 4 5 的一个旋转 该数组的最小值为1 NOTE 给出的所有
  • 一个抓取阿里云GEOJSON地图区域数据的NODEJS脚本

    中国的区域划分大致是这么个结构 中国 gt 省 gt 市 gt 区 gt 县 gt 镇 gt 乡 对于我们一般的开发者或者中小型企业 要我们自己来收集这些区域信息 显然是不可能的 这个时候我们就得借助一些成熟的地图数据 比如百度地图 高德地
  • 增强现实python

    本博文用来记录使用python实现增强现实 增强现实技术 即实时地计算摄影机影像的位置及角度并加上相应图像 视频 3D模型的技术 这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动 主要工作 实现动态的放置虚拟模型 本文实现了在自己上
  • IHS 禁用SSLV2 启用SSLV3

    昨天完成了PCI第二季度的ASV扫描 也扫出几个问题 主是IHS SSL加密比较弱 1 PCI ASV扫描出来的两个问题 1 38140 SSL Server Supports Weak Encryption Vulnerability 2
  • FastReport VCL 6.7.6 For Delphi10.4.2 安装图解教程

    FastReport VCL 6 7 6 For Delphi10 4 2 安装图解教程 Fastreport控件的安装 一步一步按说明来 不难搞 1 先关闭Delphi 2 右键 以管理员身份运行 对应版本的recompile exe 2
  • 图片情感分析(2):图像情感分析模型

    图像情感分析模型是基于卷积神经网络建立的 卷积神经网络的构建用了keras库 具体代码实现以及代码运行在下一篇贴出 模型包括3个卷积层 2个池化层 4个激活函数层 2个Dropout层 2个全连接层 1个Flatten层和最终分类层 图片初
  • Java创建数组的四种方式

    1 使用默认值来初始化 语法 数组元素类型 数组名称 new 数组元素类型 数组长度 EG int nums new int 5 创建了一个类型为int 名字为nums 长度为5的数组 2 先声明一个数组 再给值 语法 数据元素类型 数组名
  • 37 年来首次 FSF 允许非正式会员提名董事会候选人;Linux RamFS 文件系统移植到 Rust;Git 2.35 发布

    整理 宋彤彤 责编 屠敏 开源吞噬世界的趋势下 借助开源软件 基于开源协议 任何人都可以得到项目的源代码 加以学习 修改 甚至是重新分发 关注 开源日报 一文速览国内外今日的开源大事件吧 一分钟速览新闻点 成立 37 年来首次 FSF 允许
  • Spring boot配置logback日志打印到指定路径文件

    在实际项目开发中 一般都是使用log打印日志到指定路径 生成文件 而平时使用的System out pring 只能输出日志到控制台 当我们把项目打成war包部署到服务器上 会有不用的用户使用我们的应用 这个时候如果一个客户端出现了问题 那
  • 断弧图片数据集 数据集扩充 增强

    图像处理可以用到的数据 这是原始图像总共1356张 对应的XML文件是它的标签 此数据可以用来做图像目标检测 YOLOv4 v3 SSD faster rcnn 数据集增广 数据集扩充 数据集增强的常用方法与软件 https blog cs
  • 修改pycharm缓存文件路径

    Pycharm在使用过程中 Pycharm会生成大量缓存文件 而这些缓存文件默认存储在C盘的用户目录里面 导致C盘空间被占用 目标 将C盘用户目录下的 Pycharm2019转移到D盘 D cache pycharm 文件夹下 如下图 解决
  • div设置边角小三角形

    div class leftmsg div div class rightmsg div
  • 使用NCNN的INT8量化方式进行推理

    本文以NCNN框架为例 实践量化在推理中的巨大作用 加深对神经网络量化的理解 NCNN当前版本只支对称量化 下面以INT8精度为例介绍NCNN的量化使用方式 编译NCNN mkdir build cd build cmake 进入到buil
  • Java面试--常见集合

    Java面试 基础 ArrayList ArrayList的扩容机制 FailFast和FailSafe ArrayList和LinkedList HashMap 介绍一下put方法流程 1 7和1 8有何不同 负载因子默认值为何是0 75
  • CSDN编程竞赛 ——— 第六期之python

    CSDN编程竞赛报名地址 https edu csdn net contest detail 16 请不要删掉此地址 目录 前言 背景 大赛简介 参赛流程 参赛经历 解题思路 经验心得 资料分享 前言 背景 目前为止共参加过三次 不过没拿到
  • 20201013 矩阵2范数matlab求解

    这里是引用n norm X 返回矩阵 X 的 2 范数或最大奇异值 该值近似于 max svd X 示例 n norm X p 返回矩阵 X 的 p 范数 其中 p 为 1 2 或 Inf https ww2 mathworks cn he
  • java导出Excel增加下拉框选项,解决小数据量和大数据量下拉框选项的问题

    文章目录 java导出Excel增加下拉框选项 一 小数据量情况 二 大数据量情况 java导出Excel增加下拉框选项 java结合easyExcel 添加传参模型ConsumablesAddDTO 一 小数据量情况 仅供参考 二 大数据