java动态生成excel并且需要合并单元格

java动态生成excel并且需要合并单元格

先上图看一下预期效果

请添加图片描述

集成poi

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.0.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.0.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.0.0</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version>
</dependency>

通过poi手动制作excel

Workbook workbook = exportMoreSheetByTemplate(request, overviewId);
if (Func.isEmpty(workbook)) {return R.fail("生成清册报告失败");
}
Sheet sheet = workbook.createSheet();
//sheet.setRandomAccessWindowSize(SpreadsheetVersion.EXCEL2007.getMaxRows());
workbook.setSheetName(2, "表3排放量汇总");
sheet.setDefaultRowHeight((short) 380);
//sheet.trackAllColumnsForAutoSizing();
// 手动创建sheet页相关内容
//样式
Font font = workbook.createFont();
font.setBold(true);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
//创建第一行
createRow1(workbook, sheet, cellStyle);
// 保存年限 10年 企业名称    测试企业    盘查时间	填表日期	2023-07-06 09:56:28
createRow2(request, workbook, sheet, cellStyle);
createRow3(workbook, sheet, cellStyle);
createMergeRow(workbook, sheet, cellStyle);List<ConfigSourceDetailDTO> excelInfos = accountingConfigMapper.getExcelInfosByOverviewId(overviewId);
for (ConfigSourceDetailDTO excelInfo : excelInfos) {excelInfo.setGroupKey(excelInfo.getGroupKey(excelInfo.getNameDisplay(), excelInfo.getSourceName(), excelInfo.getFormula()));
}
List<ExcelDataDTO> excelDataDtoS = new ArrayList<>();
Map<String, List<ConfigSourceDetailDTO>> excelInfoMap = excelInfos.stream().collect(Collectors.groupingBy(ConfigSourceDetailDTO::getGroupKey));
Set<Map.Entry<String, List<ConfigSourceDetailDTO>>> excelInfoEntrySets = excelInfoMap.entrySet();for (Map.Entry<String, List<ConfigSourceDetailDTO>> excelInfoEntrySet : excelInfoEntrySets) {String key = excelInfoEntrySet.getKey();List<String> keyList = Splitter.on(",").splitToList(key);List<ConfigSourceDetailDTO> excelInfoEntrySetValues = excelInfoEntrySet.getValue();ExcelDataDTO excelDataDTO = new ExcelDataDTO();excelDataDTO.setNameDisplay(keyList.get(0));excelDataDTO.setSourceName(keyList.get(1));excelDataDTO.setFormula(keyList.get(2));List<String> emissionCodes = new ArrayList<>();List<String> emissionNames = new ArrayList<>();List<String> emissionCodeTypes = new ArrayList<>();List<String> emissionUnits = new ArrayList<>();List<String> dataSources = new ArrayList<>();List<String> datas = new ArrayList<>();List<String> factoryDatas = new ArrayList<>();// todo 风险因子数据取值for (ConfigSourceDetailDTO excelInfoEntrySetValue : excelInfoEntrySetValues) {var emissionCode = excelInfoEntrySetValue.getEmissionCode();var obtainingMethod = excelInfoEntrySetValue.getObtainingMethod();var sourceId = excelInfoEntrySetValue.getSourceId();if ("计算值".equals(obtainingMethod)) {//SELECT * FROM g_Inventory_details d WHERE d.is_deleted =0 AND d.obtaining_method = '计算值' and source_id = 1681199756105396225;List<InventoryDetails> inventoryDetails = inventoryDetailsMapper.selectList(new LambdaQueryWrapper<>(InventoryDetails.class).eq(InventoryDetails::getIsDeleted, 0).eq(InventoryDetails::getObtainingMethod, obtainingMethod).eq(InventoryDetails::getSourceId, sourceId));for (InventoryDetails inventoryDetail : inventoryDetails) {// 计算年月或者季度总和datas.add(Func.toStr(BigDecimalUtils.add(Func.isEmpty(inventoryDetail.getJanuary()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getJanuary()), Func.isEmpty(inventoryDetail.getFebruary()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getFebruary())).add(Func.isEmpty(inventoryDetail.getMarch()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getMarch())).add(Func.isEmpty(inventoryDetail.getApril()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getApril())).add(Func.isEmpty(inventoryDetail.getMay()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getMay())).add(Func.isEmpty(inventoryDetail.getJune()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getJune())).add(Func.isEmpty(inventoryDetail.getJuly()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getJuly())).add(Func.isEmpty(inventoryDetail.getAugust()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getAugust())).add(Func.isEmpty(inventoryDetail.getSeptember()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getSeptember())).add(Func.isEmpty(inventoryDetail.getOctober()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getOctober())).add(Func.isEmpty(inventoryDetail.getNovember()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getNovember())).add(Func.isEmpty(inventoryDetail.getDecember()) ? new BigDecimal(0) : new BigDecimal(inventoryDetail.getDecember()))));}}var formula = excelDataDTO.getFormula();if (Func.isNotEmpty(formula)) {String[] splits = formula.split("=");if (Func.isNotEmpty(emissionCode)) {if (emissionCode.equals(splits[0].replace(" ", ""))) {continue;}}}emissionCodes.add(emissionCode);emissionNames.add(excelInfoEntrySetValue.getEmissionName());emissionCodeTypes.add(excelInfoEntrySetValue.getEmissionCodeType());emissionUnits.add(excelInfoEntrySetValue.getEmissionUnit());dataSources.add(excelInfoEntrySetValue.getDataSource());var factorId = excelInfoEntrySetValue.getFactorId();// 获取公式对应的数据,通过查询风险因子表的JSON字段getFactorDatas(factoryDatas, emissionCode, sourceId, factorId, overviewId);}excelDataDTO.setEmissionCode(emissionCodes);excelDataDTO.setEmissionName(emissionNames);excelDataDTO.setDataSource(dataSources);excelDataDTO.setData(factoryDatas);excelDataDTO.setEmissionUnit(emissionUnits);excelDataDTO.setEmissionCodeType(emissionCodeTypes);excelDataDTO.setTotalData(datas.stream().reduce((d, d1) -> Func.toStr(BigDecimalUtils.add(new BigDecimal(d), new BigDecimal(d)))).orElse("0"));excelDataDtoS.add(excelDataDTO);
}InventoryOverview queryEntity = new InventoryOverview();
queryEntity.setEnterpriseId(Func.toStr(request.getBusinessParam().get("unitId")));
String[] reportYears = Func.toStr(request.getBusinessParam().get("unitReportYear")).split("年");
if (Func.isNotEmpty(reportYears[0])) {queryEntity.setTimeInventory(reportYears[0]);if (reportYears.length > 1) {queryEntity.setTimeUnit(reportYears[1]);}
}
InventoryOverview detail = null;
try {detail = inventoryOverviewMapper.selectById(overviewId);
} catch (Exception e) {log.error("根据inventoryOverviewMapper.selectById查询信息失败" + e);
}
log.info("需要动态生成 excel 的组合对象是:{},传入的参数是:{}", JSONObject.toJSONString(excelDataDtoS), overviewId);
// 动态生成sheet
int tempRow = daynamicCreateRow(workbook, sheet, excelDataDtoS);
Row row7 = this.buildRow(sheet, tempRow, workbook, 12);
CellRangeAddress region7 = new CellRangeAddress(tempRow, tempRow, 0, 9);
sheet.addMergedRegion(region7);
row7.getCell(0).setCellValue("总排放量");
Row row8 = this.buildRow(sheet, tempRow + 1, workbook, 12);
CellRangeAddress region8 = new CellRangeAddress(tempRow + 1, tempRow + 1, 0, 9);
sheet.addMergedRegion(region8);
row8.getCell(0).setCellValue("直接排放量");
CellRangeAddress region9 = new CellRangeAddress(tempRow + 2, tempRow + 2, 0, 9);
sheet.addMergedRegion(region9);
Row row9 = this.buildRow(sheet, tempRow + 2, workbook, 12);
row9.getCell(0).setCellValue("间接排放量");
if (Func.isNotEmpty(detail)) {row7.getCell(10).setCellValue(Func.toStr(detail.getInventoryTotal()));row7.getCell(11).setCellValue(Func.toStr(detail.getInventoryTotal()));row8.getCell(10).setCellValue(Func.toStr(detail.getInventoryFirst()));row8.getCell(11).setCellValue(Func.toStr(detail.getInventoryFirst()));row9.getCell(10).setCellValue(Func.toStr(detail.getInventorySecond()));row9.getCell(11).setCellValue(Func.toStr(detail.getInventorySecond()));
} else {row7.getCell(10).setCellValue(0);row7.getCell(11).setCellValue(0);row8.getCell(10).setCellValue(0);row8.getCell(11).setCellValue(0);row9.getCell(10).setCellValue(0);row9.getCell(11).setCellValue(0);
}
//将sheet写入文件
//将文件保存到指定的位置
try (FileOutputStream outputStream = new FileOutputStream(file)) {workbook.write(outputStream);
}
//上传文件
MultipartFile multipartFile = FileUtil.fileToMultipartFile(file);
GoldNetFileVO goldNetFileVO = fileService.uploadFile(multipartFile);
file.delete();
if (Objects.nonNull(goldNetFileVO)) {log.info("生产文件ID:{},toLink:{}", goldNetFileVO.getFileId(), goldNetFileVO.getFileLink());return R.data(goldNetFileVO.getFileId());
}
/*** 4和5合并单元格** @param workbook* @param sheet* @param cellStyle*/
private void createMergeRow(Workbook workbook, Sheet sheet, CellStyle cellStyle) {Row row4 = this.buildRow(sheet, 3, workbook, 12);Row row5 = this.buildRow(sheet, 4, workbook, 12);CellRangeAddress region4_1 = new CellRangeAddress(3, 4, 0, 0);sheet.addMergedRegion(region4_1);CellRangeAddress region4_2 = new CellRangeAddress(3, 4, 1, 1);sheet.addMergedRegion(region4_2);CellRangeAddress region4_3 = new CellRangeAddress(3, 4, 2, 2);sheet.addMergedRegion(region4_3);// 编号	对应活动/设施	排放源row4.getCell(0).setCellValue("编号");row4.getCell(0).setCellStyle(cellStyle);row4.getCell(1).setCellValue("对应活动/设施");row4.getCell(1).setCellStyle(cellStyle);row4.getCell(2).setCellValue("排放源");row4.getCell(2).setCellStyle(cellStyle);CellRangeAddress region4_4 = new CellRangeAddress(3, 3, 3, 11);sheet.addMergedRegion(region4_4);row4.getCell(3).setCellValue("CO2");row4.getCell(3).setCellStyle(cellStyle);// 计算公式	参数	类别	名称	数值	单位	来源	年排放量	年CO2当量row5.getCell(3).setCellValue("计算公式");row5.getCell(3).setCellStyle(cellStyle);row5.getCell(4).setCellValue("参数");row5.getCell(4).setCellStyle(cellStyle);row5.getCell(5).setCellValue("类别");row5.getCell(5).setCellStyle(cellStyle);row5.getCell(6).setCellValue("名称");row5.getCell(6).setCellStyle(cellStyle);row5.getCell(7).setCellValue("数值");row5.getCell(7).setCellStyle(cellStyle);row5.getCell(8).setCellValue("单位");row5.getCell(8).setCellStyle(cellStyle);row5.getCell(9).setCellValue("来源");row5.getCell(9).setCellStyle(cellStyle);row5.getCell(10).setCellValue("年排放量");row5.getCell(10).setCellStyle(cellStyle);row5.getCell(11).setCellValue("年CO2当量");row5.getCell(11).setCellStyle(cellStyle);
}/*** 创建第三行** @param workbook* @param sheet* @param cellStyle*/
private void createRow3(Workbook workbook, Sheet sheet, CellStyle cellStyle) {Row row3 = this.buildRow(sheet, 2, workbook, 12);CellRangeAddress region3_1 = new CellRangeAddress(2, 2, 0, 2);sheet.addMergedRegion(region3_1);row3.getCell(0).setCellValue("基本数据");row3.getCell(0).setCellStyle(cellStyle);
}/*** 创建第二行** @param request* @param workbook* @param sheet* @param cellStyle*/
private void createRow2(CreateStatementRequest request, Workbook workbook, Sheet sheet, CellStyle cellStyle) {Row row2 = this.buildRow(sheet, 1, workbook, 12);CellRangeAddress region2_1 = new CellRangeAddress(1, 1, 0, 1);sheet.addMergedRegion(region2_1);CellRangeAddress region2_2 = new CellRangeAddress(1, 1, 4, 5);sheet.addMergedRegion(region2_2);CellRangeAddress region2_3 = new CellRangeAddress(1, 1, 6, 7);sheet.addMergedRegion(region2_3);CellRangeAddress region2_4 = new CellRangeAddress(1, 1, 9, 10);sheet.addMergedRegion(region2_4);row2.getCell(0).setCellValue("保存年限");row2.getCell(0).setCellStyle(cellStyle);row2.getCell(2).setCellValue("10年");row2.getCell(2).setCellStyle(cellStyle);row2.getCell(3).setCellValue("企业名称");row2.getCell(3).setCellStyle(cellStyle);row2.getCell(4).setCellValue(Func.toStr(request.getBusinessParam().get("unitName")));row2.getCell(4).setCellStyle(cellStyle);row2.getCell(6).setCellValue("盘查时间");row2.getCell(6).setCellStyle(cellStyle);row2.getCell(8).setCellValue(Func.toStr(request.getBusinessParam().get("timeInventoryText")));row2.getCell(8).setCellStyle(cellStyle);row2.getCell(9).setCellValue("填表日期");row2.getCell(9).setCellStyle(cellStyle);row2.getCell(11).setCellValue(DateUtil.format(new Date(), DateUtil.PATTERN_DATETIME));row2.getCell(11).setCellStyle(cellStyle);
}/*** 动态生成row和col** @param workbook* @param sheet* @param excelDataDTOS*/
private int daynamicCreateRow(Workbook workbook, Sheet sheet, List<ExcelDataDTO> excelDataDTOS) {int temp = 4;// 代表从第几行开始合并int rowTemp = 5;// tempNum 代表序号int tempNum = 1;for (int i = 0; i < excelDataDTOS.size(); i++) {ExcelDataDTO excelDataDTO = excelDataDTOS.get(i);List<String> emissionCodes = excelDataDTO.getEmissionCode();List<String> emissionCodeTypes = excelDataDTO.getEmissionCodeType();List<String> emissionNames = excelDataDTO.getEmissionName();List<String> dataList = excelDataDTO.getData();List<String> emissionUnits = excelDataDTO.getEmissionUnit();List<String> dataSources = excelDataDTO.getDataSource();for (int j = 0; j < emissionCodes.size(); j++) {Row row6 = null;// temp + j + 1 代表从第几行开始创建rowrow6 = this.buildRow(sheet, temp + j + 1, workbook, 12);row6.getCell(0).setCellValue(tempNum + j);row6.getCell(1).setCellValue(excelDataDTO.getNameDisplay());row6.getCell(2).setCellValue(excelDataDTO.getSourceName());String formula = excelDataDTO.getFormula();if (Func.isNotEmpty(formula)) {formula = ExpressParseUtil.parseInLatexExpression(formula);formula = formula.replaceAll("\\{/}", "/");}row6.getCell(3).setCellValue(formula);row6.getCell(4).setCellValue(emissionCodes.get(j));row6.getCell(5).setCellValue(emissionCodeTypes.get(j));row6.getCell(6).setCellValue(emissionNames.get(j));// 这个地方放入 g_emission_factor 的 json 中 的data_content 中的 dataif (j < dataList.size()) {row6.getCell(7).setCellValue(dataList.get(j));} else {row6.getCell(7).setCellValue("0");}row6.getCell(8).setCellValue(emissionUnits.get(j));row6.getCell(9).setCellValue(dataSources.get(j));row6.getCell(10).setCellValue(excelDataDTO.getTotalData());row6.getCell(11).setCellValue(excelDataDTO.getTotalData());}tempNum += 1;temp += emissionCodes.size();if (emissionCodes.size() > 1) {CellRangeAddress region0 = new CellRangeAddress(rowTemp, rowTemp + emissionCodes.size() - 1, 0, 0);CellRangeAddress region1 = new CellRangeAddress(rowTemp, rowTemp + emissionCodes.size() - 1, 1, 1);CellRangeAddress region2 = new CellRangeAddress(rowTemp, rowTemp + emissionCodes.size() - 1, 2, 2);CellRangeAddress region3 = new CellRangeAddress(rowTemp, rowTemp + emissionCodes.size() - 1, 3, 3);CellRangeAddress region10 = new CellRangeAddress(rowTemp, rowTemp + emissionCodes.size() - 1, 10, 10);CellRangeAddress region11 = new CellRangeAddress(rowTemp, rowTemp + emissionCodes.size() - 1, 11, 11);sheet.addMergedRegion(region0);sheet.addMergedRegion(region1);sheet.addMergedRegion(region2);sheet.addMergedRegion(region3);sheet.addMergedRegion(region10);sheet.addMergedRegion(region11);}rowTemp += emissionCodes.size();}return rowTemp;
}/*** 创建第一行** @param workbook* @param sheet* @param cellStyle*/
private void createRow1(Workbook workbook, Sheet sheet, CellStyle cellStyle) {Row row1 = this.buildRow(sheet, 0, workbook, 12);CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, 11);sheet.addMergedRegion(region1);row1.getCell(0).setCellStyle(cellStyle);row1.getCell(0).setCellValue("排放量汇总");
}// 创建行
private Row buildRow(Sheet sheet, int row, Workbook workbook, int rowLength) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);Row row4 = sheet.createRow(row);for (int i = 0; i < rowLength; i++) {row4.createCell(i).setCellStyle(cellStyle);sheet.setColumnWidth(i, 12 * 256);}return row4;
}// 根据模版生成sheet
public Workbook exportMoreSheetByTemplate(CreateStatementRequest request, Long overviewId) throws IOException {// 用这个map填充数据 sheet1 sheet2 sheet3 都会使用这个map进行传递Map<String, Object> map = doEnterpriseInfo(request);List<InventoryReportDTO> inventoryReportDTOList = new ArrayList<>(doInventoryInfo(overviewId));map.put("inventoryReports", inventoryReportDTOList);// 设置导出配置// 获取导出excel指定模版String fileCode = "inventoryTemplateDownload";var vo = new ConfTemplateFileVO();vo.setTenantCode("000000");vo.setTemplateCode(fileCode);var confTemplateFileRet = confTemplateFileClient.getConfTemplateFile(vo);String filePath = "";if (confTemplateFileRet.isSuccess()) {filePath = confTemplateFileRet.getData().getTemplateFileLink();} else {throw new RuntimeException("查询清册模版信息失败");}TemplateExportParams templatePath = new TemplateExportParams(filePath, true);log.info("templatePath" + templatePath + ",map:" + JSONObject.toJSONString(map));// 导出exceltry {return ExcelExportUtil.exportExcel(templatePath, map);} catch (Exception e) {log.error("ExcelExportUtil.exportExcel", e);}return null;
}

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

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

相关文章

c++文件流详细笔记

c++流 IO :向设备输入数据和输出数据 C++的IO流 设备: 文件控制台特定的数据类型(stringstream)c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 文件流 文件流: 对文件进行读写操作 头文件: 类库: ifstream 对文件输入(读文件) ofstream 对文件输出(写…

聪明灵犀:智能AI写作助手

这是一款支持AI写作和AI聊天的智能软件&#xff0c;利用先进的自然语言处理技术&#xff0c;为用户提供个性化、高效的服务和帮助。可以借助该软件轻松完成各类文案创作&#xff0c;提升写作效率&#xff1b;也可以通过AI聊天的方式&#xff0c;来解决各种问题。内置实用AI工具…

常用 JVM 调优工具

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 日常调优总结起来就是&#xff1a;首先通过 jps 命令查看当前进程&#xff0c;然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数&#xff0c;通过 jstat 命令查看 cla…

商品控价的流程有哪些

品牌要做好控价&#xff0c;流程其实不复杂&#xff0c;并且可以形成体系去做&#xff0c;不管针对哪个渠道&#xff0c;用下面这套流程去做&#xff0c;可以降低品牌的控价成本&#xff0c;提长品牌的控价效果。 首先&#xff0c;找一家合适的第三方控价公司 选择有时候比执行…

GD32F103VE串口与DMA传输

GD32F103VE串口与DMA传输&#xff0c;本测试采用的的串口1和DMA0之间的数据传输&#xff0c;然后通过RS485和其它设备进行数据交换&#xff0c;没有采用任何中断参与。 GD32F103VE的DMA0请求映射到串口&#xff1a; 1&#xff0c;USART0_RX映射到DMA0的通道4&#xff0c;USART…

FFmpeg 硬编码VideoToolBox流程

介绍 FFmpeg已经提供对 VideoToolBox 的编解码支持&#xff1b;主要涉及到的文件有videotoolbox.c、videotoolbox.h、videotoolboxenc.c、ffmepg_videotoolbox.c。在编译 FFmpeg 源码时&#xff0c;想要支持VideoToolBox&#xff0c;在 configure 时&#xff0c;需要–enable-…

艺术创作的新纪元:如何训练Lora模型打造令人惊叹的AI绘画

目录 前言一、&#x1f981; 选择合适的云端平台1-1、云端平台的优势1-2、选择适合的云端平台 二、&#x1f981; 账号注册三、&#x1f981; 开始炼丹3-1、购买算力并创建工作空间3-2、启动工作空间3-3、应用市场一键安装 四、&#x1f981; 使用Stable-Diffusion作图4-1、国风…

Flutter系列文章-实战项目

在本篇文章中&#xff0c;我们将通过一个实际的 Flutter 应用来综合运用最近学到的知识&#xff0c;包括保存到数据库、进行 HTTP 请求等。我们将开发一个简单的天气应用&#xff0c;可以根据用户输入的城市名获取该城市的天气信息&#xff0c;并将用户查询的城市列表保存到本地…

【设计模式】责任链的基本概念及使用Predicate灵活构造校验链

文章目录 1. 概述1.1.背景1.2.责任链模式的概念 2.责任链的基本写法2.1.链表实现2.2.数组实现 3.Predicate校验链2.1.使用Predicate改写代码2.1.更丰富的条件拓展 4.总结 1. 概述 1.1.背景 在最近的开发中遇到了这么一个需求&#xff0c;需要对业务流程中的各个参数做前置校验…

python版《羊了个羊》游戏开发第一天

Python小型项目实战教学课《羊了个羊》 一、项目开发大纲&#xff08;初级&#xff09; 版本1.0&#xff1a;基本开发 课次 内容 技术 第一天 基本游戏地图数据 面向过程 第二天 鼠标点击和移动 面向对象 第三天 消除 设计模式&#xff1a;单例模式 第四天 完整…

MyBatis和MyBatis-plus配置多数据源和操作多数据库

一&#xff0c;学习MyBatis和MyBatis-plus&#xff1a; mybatis:官网文档:mybatis – MyBatis 3 | 简介 mybatis-plus:官网文档&#xff1a;MyBatis-Plus 二&#xff0c;MyBatis来实现多数据源的查询&#xff1a; 配置文件的格式&#xff1a; spring:datasource: db1:driv…

【Hystrix技术指南】(4)故障切换的运作流程

[每日一句] 也许你度过了很糟糕的一天&#xff0c;但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被使…

代码随想录算法训练营day60

文章目录 Day60 柱状图中最大的矩形题目思路代码 Day60 柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图…

模拟实现消息队列项目(系列5) -- 服务器模块(虚拟主机)

目录 前言 1. 创建VirtualHost 1.1 定义虚拟主机的相关属性 1.2 VirtualHost 构造方法 1.3 交换机和队列的创建和删除 1.3.1 交换机操作 1.3.2 队列操作 1.4 绑定的创建和删除 1.5 发送消息到指定的队列/交换机 2. 实现路由规则Router 2.1 checkBindingKey() 2.2 checkRoutin…

【Spring Boot】Spring Boot项目的创建和文件配置

目录 一、为什么要学Spring Boot 1、Spring Boot的优点 二、创建Spring Boot项目 1、创建项目之前的准备工作 2、创建Spring Boot项目 3、项目目录的介绍 4、安装Spring Boot快速添加依赖的插件 5、在项目中写一个helloworld 三、Spring Boot的配置文件 1、配置文件的…

TCP/IP四层模型对比OSI七层网络模型的区别是啥?数据传输过程原来是这样的

一、TCP/IP四层模型对比OSI七层模型 它们两个定义的一些功能和协议都是差不多的。TCP/IP四层协议模型比我们的七层少了三层&#xff0c;把我们的数据链路层和物理层放在一层里面了&#xff0c;叫做数据链路层&#xff08;网络接口层&#xff09;&#xff0c;对应网络协议也没有…

本质安全设备标准(IEC60079-11)的理解(六)温度

本质安全设备标准&#xff08;IEC60079-11&#xff09;的理解&#xff08;六&#xff09;温度 本质安全设备的温度要求也是非常复杂的&#xff0c;首先在标准中涉及有3个温度的概念&#xff1a; 环境温度ambient temperature&#xff0c; 工作温度service temperature和最高表…

【Docker】数据库动态授权组件在Kubernetes集群下的测试过程记录

目录 背景 组件原理 测试设计 环境 测试脚本 脚本build为linux可执行文件 镜像构建 Dockerfile Docker build 镜像有效性验证 总结 资料获取方法 背景 我们都知道出于安全性考虑&#xff0c;生产环境的权限一般都是要做最小化控制&#xff0c;尤其是数据库的操作授…

【MFC】05.MFC第一大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…

STM32 低功耗学习

STM32 电源系统结构介绍 电源系统&#xff1a;VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压&#xff08;VDD&#xff09;2.0~3.6V 为了提高转换精度&#xff0c;给模拟外设独立供电。电压调节器为1.8V供电区域供电&#xff0c;且1.8V供电区域是电…