poi模板动态导出,下拉框联动,公式设置
背景:有一个动态导出模板的需求,根据页面维护的数据比如模板名称,模板的sheet
名称,列名称宽度高度等,导出excel
文件。打破以往把excel
上传到代码的resource
中,或者文件服务中,再下载出来导入。这样的弊端显而易见不易维护,在做导入的时候必须技术去修改xlsx
文件然后发版,非常不方便。至此我们想要动态去识别列以及列中的字段,做一个通用的导出和导入功能。当然导入我已经用设计模式做完了可以参考 通用导入下面就重点说一下导出模板的维护实现。
- 根据
模板编码
和sheet编码
查询配置信息 - 生成
数据源sheet
比如行政区划,设置为隐藏 - 生成
业务sheet
其中包含下拉框,以及下拉框
联动比如省市区联动
公式设置,联动效果展示
添加依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency>
整体代码
@Slf4j
@RestController
public class CreateXlsxController {static Map<String,String> colMap;static {colMap = new HashMap<>();colMap.put("0","A");colMap.put("1","B");colMap.put("2","C");colMap.put("3","D");colMap.put("4","E");colMap.put("5","F");colMap.put("6","G");colMap.put("7","H");colMap.put("8","I");colMap.put("9","J");colMap.put("10","K");colMap.put("11","L");colMap.put("12","M");colMap.put("13","N");colMap.put("14","O");colMap.put("15","P");colMap.put("16","Q");colMap.put("17","R");colMap.put("18","S");colMap.put("19","T");colMap.put("20","U");colMap.put("21","V");colMap.put("22","W");colMap.put("23","X");colMap.put("24","Y");colMap.put("25","Z");}@PostMapping("/generate-excel")public ResponseEntity<byte[]> generateExcel(@RequestBody List<TemplateDO> data) throws IOException {Assert.isTrue(data.size()!=0, "data is empty");Map<String,String> proviceCityCountryMap = new HashMap<>();Workbook workbook = new XSSFWorkbook();int fillRow = 1000;//生成省市区的基础数据String hiddenSheetName = "area";createArea(workbook,hiddenSheetName);for (TemplateDO templateDO : data) {// Create a workbook and sheetfor (TemplateSheet templateSheet : templateDO.getSheetList()) {Sheet sheet = workbook.createSheet(templateSheet.getSheetName());//在第一行创建Row row1 = sheet.createRow(0);row1.setHeight((short) templateSheet.getTitleHeight());//标明是第一行Cell titleCell = row1.createCell(0);//创建了一个新的单元格样式对象CellStyle titleStyle = workbook.createCellStyle();// 设置文本左对齐titleStyle.setAlignment(HorizontalAlignment.LEFT);// 垂直居中titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);titleStyle.setWrapText(true);titleCell.setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, templateSheet.getTitleWidth()));titleCell.setCellValue(templateSheet.getTitleContext());//下面生成列信息int rowNum = 1;Row row = sheet.createRow(rowNum);int colNum = 0;for (TemplateSheetCol sheetCol : templateSheet.getColumnList()) {sheet.setColumnWidth(colNum,sheetCol.getColumnWidth());Cell cell = row.createCell(colNum);//必输字段颜色展示+*号if(("Y").equalsIgnoreCase(sheetCol.getNullableFlag())){// 创建一个单元格样式并设置背景颜色CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(style);cell.setCellValue("*"+sheetCol.getColumnName());}else{cell.setCellValue(sheetCol.getColumnName());}if(StringUtils.isNotBlank(sheetCol.getChangeDataFlag()) && "Y".equalsIgnoreCase(sheetCol.getChangeDataFlag()) && StringUtils.isNotBlank(sheetCol.getValidateSet()) ){//配置的值集代码是省侧的设置下拉框if("province_code".equalsIgnoreCase(sheetCol.getValidateSet())){CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(style);int rowIndex = cell.getRowIndex();int columnIndex = cell.getColumnIndex();proviceCityCountryMap.put("province_code",rowIndex+2+","+columnIndex);XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);StringBuffer listFormula = new StringBuffer();listFormula.append("=INDIRECT(").append(hiddenSheetName).append("!$A$1)");XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(listFormula.toString());//从第3行开始往下填充 第1行是说明 第2行是标题CellRangeAddressList regions = new CellRangeAddressList(2,fillRow, colNum, colNum);XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);data_validation_list.setSuppressDropDownArrow(true);data_validation_list.setShowErrorBox(true);sheet.addValidationData(data_validation_list);}else if("city_code".equalsIgnoreCase(sheetCol.getValidateSet())){CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(style);int rowIndex = cell.getRowIndex();int columnIndex = cell.getColumnIndex();proviceCityCountryMap.put("city_code",rowIndex+2+","+columnIndex);XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);Integer provinceRow = Integer.parseInt(proviceCityCountryMap.get("province_code").split(",")[0]);String provinceCol = proviceCityCountryMap.get("province_code").split(",")[1];for (int i = 0; i < fillRow; i++) {StringBuffer listFormula = new StringBuffer();listFormula.append("=INDIRECT(").append("$").append(colMap.get(provinceCol)).append("$").append(provinceRow).append(")");XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(listFormula.toString());CellRangeAddressList regions = new CellRangeAddressList(provinceRow-1,provinceRow-1, colNum, colNum);provinceRow++;XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);data_validation_list.setSuppressDropDownArrow(true);data_validation_list.setShowErrorBox(true);sheet.addValidationData(data_validation_list);}}else if("country_code".equalsIgnoreCase(sheetCol.getValidateSet())){CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.CORAL.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(style);int rowIndex = cell.getRowIndex();int columnIndex = cell.getColumnIndex();proviceCityCountryMap.put("country_code",rowIndex+","+columnIndex);XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);Integer cityRow = Integer.parseInt(proviceCityCountryMap.get("city_code").split(",")[0]);String cityCol = proviceCityCountryMap.get("city_code").split(",")[1];for (int i = 0; i < fillRow; i++) {StringBuffer listFormula = new StringBuffer();listFormula.append("=INDIRECT(").append("$").append(colMap.get(cityCol)).append("$").append(cityRow).append(")");XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(listFormula.toString());CellRangeAddressList regions = new CellRangeAddressList(cityRow-1,cityRow-1, colNum, colNum);cityRow++;XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);data_validation_list.setSuppressDropDownArrow(true);data_validation_list.setShowErrorBox(true);sheet.addValidationData(data_validation_list);}}else if("gender_code".equalsIgnoreCase(sheetCol.getValidateSet())){DataValidationHelper validationHelper = sheet.getDataValidationHelper();//根据validateSet去数据库查DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(new String[]{"M-男","W-女"});CellRangeAddressList addressList = new CellRangeAddressList(rowNum+1, 100000, colNum, colNum);DataValidation dataValidation = validationHelper.createValidation(constraint, addressList);dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);sheet.addValidationData(dataValidation);}}colNum++;}}}// Write the output to a byte arrayByteArrayOutputStream out = new ByteArrayOutputStream();workbook.write(out);workbook.close();// Set response headersHttpHeaders headers = new HttpHeaders();String headerValue = "attachment; filename="+data.get(0).getTemplateName()+".xlsx";headers.add(HttpHeaders.CONTENT_DISPOSITION, headerValue);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);return ResponseEntity.ok().headers(headers).body(out.toByteArray());}public void createArea(Workbook workbook,String sheetName) throws IOException {// 创建工作簿和工作表String[] provinceArr = {"江苏省","安徽省"};//依次列出各省的市、各市的县String[] cityJiangSu = {"南京市","苏州市","盐城市"};String[] cityAnHui = {"合肥市","安庆市"};//将有子区域的父区域放到一个数组中String[] areaFatherNameArr ={"江苏省","安徽省"};Map<String,String[]> areaMap = new HashMap<>();areaMap.put("江苏省", cityJiangSu);areaMap.put("安徽省",cityAnHui);Map<String,List<String>> countryMap = new HashMap<String,List<String>>(){{put("南京市",Arrays.asList("南京区1","南京区2"));put("苏州市",Arrays.asList("苏州区1","苏州区2"));put("盐城市",Arrays.asList("盐城市区1","盐城市区2"));put("合肥市",Arrays.asList("合肥市区1","合肥市区2"));put("安庆市",Arrays.asList("安庆市区1","安庆市区2"));}};//创建一个专门用来存放地区信息的隐藏sheet页//因此也不能在现实页之前创建,否则无法隐藏。Sheet hideSheet = workbook.createSheet(sheetName);//这一行作用是将此sheet隐藏,功能未完成时注释此行,可以查看隐藏sheet中信息是否正确workbook.setSheetHidden(workbook.getSheetIndex(hideSheet), true);//整个sheet页的colNum 持续递增int colNum = 0;int procinceRowNum = 0;// 设置第一行,存省的信息Row zeroRow = hideSheet.createRow(procinceRowNum++);String procinceTitle = "省列表";zeroRow.createCell(0).setCellValue(procinceTitle);for(int i = 0; i < provinceArr.length; i ++){Row row1 = hideSheet.createRow(procinceRowNum++);Cell cell = row1.createCell(colNum);cell.setCellValue(provinceArr[i]);}// 添加名称管理器String rangeProvice = getRange(colNum, procinceRowNum);Name nameProvice = workbook.createName();//key不可重复,将父区域名作为keynameProvice.setNameName(procinceTitle);String formulaProvice = sheetName +"!" + rangeProvice;nameProvice.setRefersToFormula(formulaProvice);colNum++;for (int i = 0; i < areaFatherNameArr.length; i++) {Cell cell = zeroRow.createCell(colNum);cell.setCellValue(areaFatherNameArr[i]);String[] cityArr = areaMap.get(areaFatherNameArr[i]);int rowNum =1;for (int j = 0; j < cityArr.length; j++) {Row tmpRow = hideSheet.getRow(rowNum);if(tmpRow == null){Row row = hideSheet.createRow(rowNum);Cell cell1 = row.createCell(colNum);cell1.setCellValue(cityArr[j]);}else {Cell cell1 = tmpRow.createCell(colNum);cell1.setCellValue(cityArr[j]);}rowNum++;}// 添加名称管理器String rangeCity = getRange(colNum, rowNum);Name nameCity = workbook.createName();//key不可重复,将父区域名作为keynameCity.setNameName(areaFatherNameArr[i]);String formula = sheetName +"!" + rangeCity;nameCity.setRefersToFormula(formula);colNum++;}for (Map.Entry<String, List<String>> entry : countryMap.entrySet()) {//市区String key = entry.getKey();Cell cell = zeroRow.createCell(colNum);cell.setCellValue(key);List<String> countryList = entry.getValue();int rowNum =1;for (int j = 0; j < countryList.size(); j++) {Row tmpRow = hideSheet.getRow(rowNum);if(tmpRow == null){Row row = hideSheet.createRow(rowNum);Cell cell1 = row.createCell(colNum);cell1.setCellValue(countryList.get(j));}else {Cell cell1 = tmpRow.createCell(colNum);cell1.setCellValue(countryList.get(j));}rowNum++;}// 添加名称管理器String rangeCountry = getRange(colNum, rowNum);Name nameCountry = workbook.createName();//key不可重复,将父区域名作为keynameCountry.setNameName(key);String formula = sheetName +"!" + rangeCountry;nameCountry.setRefersToFormula(formula);colNum++;}}/*** 计算formula* @param colNum 代表A B C D E F G ......* @param rowNum* @return 如果给入参 1,1,10. 表示从B1-K1。最终返回 $B$1:$K$1** */public String getRange(int colNum, int rowNum) {String abc = colMap.get(String.valueOf(colNum));//默认都是从第二行开始return "$" + abc + "$" + 2 + ":$" + abc + "$" + rowNum;}
}
入参模拟查询配置信息
[{"templateName": "people_base_info","sheetList": [{"sheetName": "sheet1","titleContext": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\njjjjjjjjjjjjjjjjjjjjjjjjjjj\n","titleWidth": 8,"titleHeight": 1000,"columnList": [{"columnName": "序号","columnCode": "number","columnWidth": 2000,"columnHeight": 20,"nullableFlag": "N"},{"columnName": "年龄","columnCode": "age","columnWidth": 5000,"columnHeight": 20,"nullableFlag": "N"},{"columnName": "性别","columnCode": "gender","columnWidth": 5000,"columnHeight": 20,"nullableFlag": "Y","changeDataFlag": "Y","validateSet": "gender_code"},{"columnName": "省份","columnCode": "province","columnWidth": 5000,"columnHeight": 20,"nullableFlag": "Y","changeDataFlag": "Y","validateSet": "province_code"},{"columnName": "城市","columnCode": "city","columnWidth": 5000,"columnHeight": 20,"nullableFlag": "Y","changeDataFlag": "Y","validateSet": "city_code"},{"columnName": "区县","columnCode": "country","columnWidth": 5000,"columnHeight": 20,"nullableFlag": "Y","changeDataFlag": "Y","validateSet": "country_code"}]}]}
]
下面拆解代码,重点代码展示
代码拆解
设置样式
//创建了一个新的单元格样式对象
CellStyle titleStyle = workbook.createCellStyle();
// 设置文本左对齐
titleStyle.setAlignment(HorizontalAlignment.LEFT);
// 垂直居中
titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
titleStyle.setWrapText(true);
titleCell.setCellStyle(titleStyle);
合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, templateSheet.getTitleWidth()));
设置颜色
// 创建一个单元格样式并设置背景颜色
CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);
cell.setCellValue("*"+sheetCol.getColumnName());
设置INDIRECT
公式
INDIRECT
嵌套名称管理器可以生成下拉框
下拉框嵌套INDIRECT
引用前面的下拉框
参考下面的xlsx
文件,查看名称管理器
,公式有效性的序列
属性
链接: https://pan.baidu.com/s/1zz4q0B3jfeybsSB4MrOMdA?pwd=qt5u 提取码: qt5u 复制这段内容后打开百度网盘手机App,操作更方便哦
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);
StringBuffer listFormula = new StringBuffer();
listFormula.append("=INDIRECT(").append(hiddenSheetName).append("!$A$1)");
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(listFormula.toString());
//从第3行开始往下填充 第1行是说明 第2行是标题
CellRangeAddressList regions = new CellRangeAddressList(2,fillRow, colNum, colNum);
XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
data_validation_list.setSuppressDropDownArrow(true);
data_validation_list.setShowErrorBox(true);
sheet.addValidationData(data_validation_list);
隐藏sheet页
//这一行作用是将此sheet隐藏,功能未完成时注释此行,可以查看隐藏sheet中信息是否正确
workbook.setSheetHidden(workbook.getSheetIndex(hideSheet), true);
添加名称管理器,给下拉框用
// 添加名称管理器String rangeCity = getRange(colNum, rowNum);Name nameCity = workbook.createName();//key不可重复,将父区域名作为keynameCity.setNameName(areaFatherNameArr[i]);String formula = sheetName +"!" + rangeCity;nameCity.setRefersToFormula(formula);public String getRange(int colNum, int rowNum) {String abc = colMap.get(String.valueOf(colNum));//默认都是从第二行开始return "$" + abc + "$" + 2 + ":$" + abc + "$" + rowNum;
}
判断row是否为空,不为空再创建,否则会覆盖之前的
Row tmpRow = hideSheet.getRow(rowNum);if(tmpRow == null){Row row = hideSheet.createRow(rowNum);Cell cell1 = row.createCell(colNum);cell1.setCellValue(countryList.get(j));}else {Cell cell1 = tmpRow.createCell(colNum);cell1.setCellValue(countryList.get(j));}
相关文章:
poi模板动态导出,下拉框联动,公式设置
背景:有一个动态导出模板的需求,根据页面维护的数据比如模板名称,模板的sheet名称,列名称宽度高度等,导出excel文件。打破以往把excel上传到代码的resource中,或者文件服务中,再下载出来导入。这…...
string的实际应用 -- 大数相加 、大数相乘
前言:哎,做题好难o(╥﹏╥)o,有时候想不到,而有时候则是想到了却没办法理清思路,转化为代码。有必要反思了┓(;_`)┏,是否是做的太少了,或是自己的基础欠缺。 大学总是有些迷茫~ …...
16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗
使用外部触发启动ADC 1、外部中断线EXTI11触发ADC2、外部定时器TIM2_CH2触发ADC3、ADC中模拟看门狗的使用 1、外部中断线EXTI11触发ADC ADC的触发方式有很多,一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。如下图所…...
前端框架 react 性能优化
目录 一、不使用任何性能优化API进行优化 二、通过性能优化API优化 1、React.memo 2、useCallback 3、useMemo 4、PureComponent 三、总结 总览:react的优化核心思想就是让react跳过重新渲染那个些没有改变的Component,而只重新渲染发生变化的C…...
一加ACE 3 Pro手机无法连接电脑传输文件问题
先说结论:OnePlus手机无法连接电脑传输数据的原因,大概率是一加数据线的问题。尝试其他手机品牌的数据线(比如华为),再次尝试。 连接电脑方法: 1 打开开发者模式(非必要操作) 进入…...
✅ Qt流式布局
Qt流式布局 前段时间,曾经对某个软件的一个“流式布局”有点感兴趣,什么叫“流式布局”呢?请看下图: 简而言之,流式布局就是布局应能够根据界面尺寸的变化自动调整其内部控件的位置。然而,Qt 提供的标准布局ÿ…...
【微服务】RabbitMQ与SpringAMQP消息队列
一、初识MQ 1. 同步通讯 同步通讯就好比双方打电话,可以实时响应,但只能一对一,只能同时和一个人聊天。 异步通讯就好比两个人发信息,你发信息给对方,对方不一定给你回复,但是可以一对多,可…...
C++设计模式-中介者模式
动机(Motivation) 多个对象相互关联的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,可以使用一种”中介对象“来管理对象间的关联关系,避免…...
js实现分页效果
分页总结: 先写好html格式和css样式 再写js时先将他们都获取过来,设置一个k为页数的下标,num为每页的数据数量,pages为页数,并且获取json数据,再将data获取到全局 写for循环,设置一个变量为i…...
【WRF-Urban】多层建筑能源参数化模型概述:原理
【WRF-Urban】多层建筑能源参数化模型概述:原理 1 概述1.1 原理1.2 使用步骤 2参考 多层建筑能源参数化(Multi-layer Building Energy Parameterization, BEP)模型是一种用于模拟城市环境中多层建筑群的能量交换和微气候影响的参数化模型。该…...
ShuffleNet V2:高效卷积神经网络架构设计的实用指南
摘要 https://arxiv.org/pdf/1807.11164 当前,神经网络架构设计大多以计算复杂度的间接指标,即浮点运算数(FLOPs)为指导。然而,直接指标(例如速度)还取决于其他因素,如内存访问成本…...
1123--collection接口,list接口,set接口
目录 一 java 1. 集合 2. 集合框架图--remember 3. collection接口 3.1 collection接口的常用方法 3.1.1 add() 3.1.2 remove()-返回删除后的对象 3.1.3 contains()--返回布尔值 3.1.4 size&…...
基于BindingList的WinForm数据绑定机制与DataGridView动态刷新技术
前言: 本文以连接SQLite为例进行代码演示 一、首先建立里一个模型类 public class MyData{public int id { get; set; }public string name { get; set; }public int age { get; set; }public string sex { get; set; }public string address { get; set; }} 二、…...
大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
对于相对速度的重新理解 - 插一句
因为发了太多的公式,系统提示插入图片太频繁,下一个部分稍后再写。 这里要强调一下: 狭义相对论的平方和形式,其实就是因为分不清虚数单位的大小才写成这个样子。或者用物理语言来说,就是认为所有惯性系的“光速”都…...
css基础(27)_行内、行内块元素之间的空白问题
行内、行内块元素之间的空白问题 产生的原因:行内元素、行内块元素,彼此之间的换行会被浏览器解析为一个空白字符。 案例一: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8">&…...
如果接口返回值图片有很长一串码,需要添加前缀
需要在前面添加前缀:data:image/jpeg;base64,然后将值赋值给<img :src"originalImage" /> this.tableLists.map((item)>{item.originalImage "data:image/jpeg;base64,"item.originalImage})以上方法会导致出现一个小bug,…...
《AI大模型开发笔记》——ollama应用全面解析
入门篇 1 ollama是什么? Ollama 是一个支持在本地运行大语言模型的工具,兼容 Windows、Linux 和 MacOS 操作系统。使用 Ollama,您仅需一行命令即可启动模型。 2 如何安装? Windows和MacOS用户,从下面链接下载安装即可: 下载地址:https://ollama.com/download Linux系…...
Paddle Inference部署推理(三)
三:Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理,您可以通过以下两种方式获取静态图模型: (1)飞桨框架导出推理模型 飞桨框架在训练模型过程中,会在本地存储最终训练…...
CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes
CSP/信奥赛C语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 …...
《跨越语言壁垒:Python 人工智能原型到 C++可执行程序的转型之路》
在人工智能的广阔天地里,Python 以其简洁易用和丰富的库资源成为众多开发者快速搭建人工智能原型的首选语言。然而,在一些对性能和资源控制要求极高的场景下,C则展现出无可比拟的优势。那么,如何将 Python 中开发的人工智能原型代…...
flowable流程图详细绘制教程
文章目录 前言一、flowable是什么?回答下之前的问题 二、flowable-modeler使用1. 使用步骤2.开始绘制弄一个请假的流程 三 加载该流程总结 前言 flowable有些晦涩难懂的东西: 我最开始接触的时候,还是用的activity,当时觉得好复杂,那么这次经过我自己在…...
Figma入门-基本操作制作登录页
Figma入门-基本操作制作登录页 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的&am…...
在windows操作系统上,用git与github账户连接
一、环境准备 1.1 git软件 1.2 github账号 1.3 创建一个项目目录,比如 D:\project\gitproject 二、开始操作 1. 进入项目目录下,右键,如图,打开git bash命令行 2. 在命令行输入以下三个命令 $ git config --global user.name &quo…...
springboot系列--拦截器执行原理
一、拦截器核心概念 一、定义 拦截器(Interceptor)是框架级别的组件,用于在请求的不同阶段(如到达控制器之前(也就是接口)、处理完成之后)动态地拦截和处理 HTTP 请求。 二、使用场景 一、用户…...
数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
目录 目录 一、绘制折线图 1.使用pyplot 2.使用numpy 编辑 3.使用DataFrame 编辑 二、绘制条形图(柱状图) 1.简单条形图 2.绘制叠加条形图 3.绘制并列条形图 4.水平条形图 编辑 三、绘制饼状图 四、绘制散点图和直方图 1.散点图 2…...
STM32F10x 定时器
使用定时器实现:B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…...
VBA技术资料MF230:展开所有折叠视图并恢复
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...
【数据结构OJ】【图论】图综合练习--拓扑排序
题目描述 已知有向图,顶点从0开始编号,求它的求拓扑有序序列。 拓扑排序算法:给出有向图邻接矩阵 1.逐列扫描矩阵,找出入度为0且编号最小的顶点v 2.输出v,并标识v已访问 3.把矩阵第v行全清0 重复上述步骤࿰…...
网络安全防范
网络安全防范技术 所属课程网络攻防实践作业要求第六次作业 实践内容 学习总结 PDR,$$P^2$$DR安全模型。 防火墙(Firewall): 网络访问控制机制,布置在网际间通信的唯一通道上。 不足:无法防护内部威胁&…...
Linux nc 命令详解
简介 nc 全称 netcat,是一个在 Linux 中多功能的网络工具,通常用于通过 TCP 或 UDP 读取和写入网络连接,也能作为客户端或服务端用来 debug,测试,网络问题分析。 常用示例 检查端口是否是打开的 nc -zv <hostna…...
解决 Gradle 报错:`Plugin with id ‘maven‘ not found` 在 SDK 开发中的问题
在 SDK 开发过程中,使用 Gradle 构建和发布 SDK 是常见的任务。在将 SDK 发布为 AAR 或 JAR 包时,你可能会使用 apply plugin: maven 来发布到本地或远程的 Maven 仓库。但是,随着 Gradle 版本的更新,特别是从 Gradle 7 版本开始&…...
stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...
postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)
一、 psycopg2简介 psycopg2库是python的一个可直接操作postgresql数据库的类库,是一个用于Python编程语言的PostgreSQL数据库适配器。它允许开发人员使用Python语言与PostgreSQL数据库进行交互和操作,不同于java,需要专用的一个驱动&#…...
学习ASP.NET Core的身份认证(基于Cookie的身份认证3)
用户通过验证后调用HttpContext.SignInAsync函数将用户的身份信息保存在认证Cookie中,以便后续的请求可以验证用户的身份,该函数原型如下所示,其中properties参数的主要属性已在前篇文章中学习,本文学习scheme和principal的意义及用法。 public static …...
Java 中的 HashMap 原理详解:底层结构与实现机制
HashMap 是 Java 中最常用的数据结构之一,它以其高效的存取速度在众多应用场景中被广泛使用。理解 HashMap 的底层实现原理,对提升开发效率、优化性能以及编写高效的代码都至关重要。本文将深入探讨 HashMap 的数据结构、存储机制、解决冲突的策略、扩容…...
数据库MYSQL——表的设计
文章目录 前言三大范式:几种实体间的关系:一对一关系:一对多关系:多对多关系: 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作, 是在已经创建数据库,表之上的操作。 在实…...
CUDA补充笔记
文章目录 一、不同核函数前缀二、指定kernel要执行的线程数量三、线程需要两个内置坐标变量来唯一标识线程四、不是blocksize越大越好,上限一般是1024个blocksize 一、不同核函数前缀 二、指定kernel要执行的线程数量 总共需要线程数是: 1 * N N个线程…...
OSI七层模型和TCP/IP五层模型详细介绍
这里写目录标题 一.OSI含义二.OSI七层模型1.应用层2.表示层3.会话层4.传输层5.网络层6.数据链路层7.物理层 TCP/IP五层协议1.应用层2.运输层运行在TCP上的协议运行在UDP上的协议 3.网络层IP协议配套使用的协议 4.数据链路层 四.网络协议分层的好处 一.OSI含义 OSI即是开放式通…...
mac安装Pytest、Allure、brew
安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…...
Linux/Windows/OSX 上面应用程序重新启动运行。
1、Linux/OSX 上面重新运行程序,直接使用 execvp 函数就可以了,把main 函数传递来的 argv 二维数组(命令行参数)传进去就可以,注意不要在 fork 出来的子进程搞。 2、Windows 平台可以通过 CreateProcess 函数来创建新的…...
自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
Odoo :免费且开源的农牧行业ERP管理系统
文 / 开源智造Odoo亚太金牌服务 引言 提供农牧企业数字化、智能化、无人化产品服务及全产业链高度协同的一体化解决方案,提升企业智慧种养、成本领先、产业互联的核心竞争力。 行业典型痛点 一、成本管理粗放,效率低、管控弱 产品研发过程缺少体系化…...
AI的自我陷阱:大型神经网络训练中的模型崩溃现象
10月7日,发布在arxiv上的一篇名为Strong Model Collapse的论文,由Meta 、纽约大学和加州大学洛杉矶分校的研究人员共同发表的研究表明在训练大型神经网络(如 ChatGPT 和 Llama)时,由于训练语料库中包含合成数据而导致的…...
Python(下载安装)
简介 开发工具:pycharm, VS Code 1. 下载(解释器程序) Download Python | Python.org 2. 安装(解释器程序) 双击下载后的exe文件 查看版本:python(并可以执行python代码) 3. 下载…...
记录一种在内核空间向用户空间通知中断的方法
记录一种在内核空间向用户空间通知中断的方法 0.前言1.代码实现1)内核设备驱动实现2)消息通知实现3)测试程序 2.解析 参考文章:Linux驱动实践:中断处理函数如何【发送信号】给应用层? 0.前言 最近在项目中遇到一个需求,需要将一个…...
Apache Maven 标准文件目录布局
Apache Maven 采用了一套标准的目录布局来组织项目文件。这种布局提供了一种结构化和一致的方式来管理项目资源,使得开发者更容易导航和维护项目。理解和使用标准目录布局对于有效的Maven项目管理至关重要。本文将探讨Maven标准目录布局的关键组成部分,并…...
【vim】使用 gn 组合命令实现搜索选中功能
gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。 具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例…...
解决登录Google账号遇到手机上Google账号无法验证的问题
文章目录 场景小插曲解决方案总结 场景 Google账号在新的设备上登录的时候,会要求在手机的Google上进行确认验证,而如果没有安装Google play就可能出现像我一样没有任何弹框,无法实现验证 小插曲 去年,我在笔记本上登录了Googl…...
基于YOLOv10深度学习的公共安全持刀行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
随着社会的不断进步和城市化进程的加快,人口密度的增加和社会结构的复杂化使得公共安全问题日益凸显。近年来,各类公共安全事件频发,其中持刀行为作为一种典型的暴力行为,已成为威胁公共安全的严重因素之一。这种行为在公共场所发…...