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 代表从第几行开始创建row
			row6 = 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 中的 data
			if (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));
	// 导出excel
	try {
		return ExcelExportUtil.exportExcel(templatePath, map);
	} catch (Exception e) {
		log.error("ExcelExportUtil.exportExcel", e);
	}
	return null;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么Mendix的OQL比SQL更方便,以及如何实现类似MySQL的workbench?

前言 在当今信息时代&#xff0c;数据的价值变得越来越重要。数据处理是任何软件系统都非常关注的核心功能。无论是电子商务网站、移动应用程序还是企业管理系统&#xff0c;这些系统都需要处理和管理大量的数据。例如&#xff0c;当用户在电子商务网站上搜索特定商品时&#…

无涯教程-Perl - formline函数

描述 格式功能和相关的运算符使用此功能。它根据PICTURE的内容将LIST格式化为输出累加器变量$^ A。写入完成后,该值将写出到文件句柄中。 语法 以下是此函数的简单语法- formline PICTURE, LIST返回值 该函数总是返回1。 Perl 中的 formline函数 - 无涯教程网无涯教程网提…

Octave Conv

Octave ConvOctave Convolution 代码详解_octconv代码_zghydx1924的博客-CSDN博客 def forward(self, x):X_h, X_l xif self.stride 2:X_h, X_l self.h2g_pool(X_h), self.h2g_pool(X_l)X_h2l self.h2g_pool(X_h)# X_h2l指的是对输入进行下采样&#xff0c;下采样的方法时卷…

【云原生】kubernetes在Pod中init容器的作用和使用

目录 Pod 中 init 容器 1 init 容器特点 2 使用 init 容器 Pod 中 init 容器 Init 容器是一种特殊容器&#xff0c;在Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 1 init 容器特点 init 容器与普通的容器非常像&#xf…

【深度学习】Collage Diffusion,拼接扩散,论文,实战

论文&#xff1a;https://arxiv.org/abs/2303.00262 代码&#xff1a;https://github.com/VSAnimator/collage-diffusion 文章目录 AbstractIntroductionProblem Definition and Goals论文其他内容实战 Abstract 基于文本条件的扩散模型能够生成高质量、多样化的图像。然而&a…

【CSS】CSS 选择器

CSS 选择器 1.基础选择器 1.1 元素选择器 语法&#xff1a;标签名{...} 元素选择器会选中对应标签名的HTML元素&#xff0c;例如&#xff1a;p{...}&#xff0c;div{...}&#xff0c;span{...}等 1.2 类选择器 语法&#xff1a;.类名{...} 类选择器会选中class属性为指定…

【vue3-element-admin】ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码

前言 本文介绍 vue3-element-admin 如何通过ESLint 检测 JS/TS 代码、Prettier 格式化代码、Stylelint 检测 CSS/SCSS 代码和配置 EditorConfig 来全方位约束和统一前端代码规范。 ESLint 代码检测 ESLint 可组装的JavaScript和JSX检查工具&#xff0c;目标是保证代码的一致…

Django入门 - Http协议前后端交互

Http协议前后端交互 在前后端交互当中&#xff0c;前端后端用的协议是http协议 先请求后响应&#xff0c;响应完之后连接就会断开我们可以认为它其实是一个短连接 或者 无连接。在它内部其实是基于TCP协议的&#xff0c;它也会有三次握手&#xff0c;但是这是内部的&#xff…

linux umask 详解

1. umask 定义 在 linux 系统中&#xff0c;umask 被定义在 /etc/profile 配置文件中&#xff0c;有一段 shell 脚本对 umask 是这么定义的。在 shell 会话输入命令&#xff1a; $ cat /etc/profile # 查看 /etc/profile 配置文件的内容 if [ $UID -gt 199 ] &&…

预测赢家(力扣)dfs + 备忘录 JAVA

给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。 玩家 1 和玩家 2 轮流进行自己的回合&#xff0c;玩家 1 先手。开始时&#xff0c;两个玩家的初始分值都是 0 。每一回合&#xff0c;玩家从数组的任意一端取一个数字&#xff08;即&#xff0c;nums[0]…

centos 7 系统上重启 mysql 时报错 Failed to restart mysqld.service: Unit not found.

在 centos 7 系统上&#xff0c;使用常规命令&#xff1a;systemctl restart mysql 或 service mysqld restart 重启 mysql 时都会报如下错误&#xff1a; Failed to start mysqld.service: Unit not found. 根据所报错误&#xff0c;在网上搜罗了一圈&#xff0c;未果&#x…

2023-08-05——JVM 栈

栈 stack 栈&#xff1a;数据结构 程序数据结构算法 栈&#xff1a;先进后出&#xff0c;后进先出 好比一个&#xff1a;桶 队列&#xff1a;先进先出&#xff08;FIFO &#xff1a;First Input First Out&#xff09; 好比一个&#xff1a;管道 栈&#xff1a;喝多了吐。队列…

STM32入门学习之独立看门狗(IWDG)

1.STM32的独立看门狗是一个具有独立时钟的片上外设。通常&#xff0c;为了防止程序卡死&#xff0c;可以设置看门狗定时复位。当看看门狗被使能之后&#xff0c;会按初始化时设置的计数值进行计数。当根据计数值计数的倒数时间为0时&#xff0c;便会自动复位程序&#xff0c;即…

STM32F103——GPIO八种工作模式

目录 1、GPIO 基本结构分析 2、GPIO 八种工作模式 2.1 输入浮空 2.2 输入上拉 2.3 输入下拉 2.4 模拟功能 2.5 开漏输出 2.6 开漏式复用功能 2.7 推挽输出 2.8 推挽式复用功能 3、GPIO 八种工作模式特点及应用 1、GPIO 基本结构分析 STM32F103的 GPIO 工作有八种…

iOS 实现图片高斯模糊效果

效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…

自适应变异麻雀搜索算法及其Matlab实现

麻雀搜索算法( sparrow search algorithm&#xff0c;SSA) 是2020 年新提出的一种元启发式算法[1]&#xff0c;它是受麻雀种群的觅食和反捕食行为启发&#xff0c;将搜索群体分为发现者、加入者和侦察者 3 部分&#xff0c;其相互分工寻找最优值&#xff0c;通过 19 个标准测试…

适配器模式:将不兼容的接口转换为可兼容的接口

适配器模式&#xff1a;将不兼容的接口转换为可兼容的接口 什么是适配器模式&#xff1f; 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端所期望的另一个接口。它允许不兼容的类能够合作&#xff0c;使得原本由于接口不匹配而无法工作的类能够一…

计算机网络(8) --- IP与IP协议

计算机网络&#xff08;7&#xff09; --- UDP协议和TCP协议_哈里沃克的博客-CSDN博客UDP协议和TCP协议https://blog.csdn.net/m0_63488627/article/details/132125374?spm1001.2014.3001.5501 目录 1.IP与IP协议 IP作用 协议​编辑 2.网段划分 DHCP划分 CIDR划分 特殊…

Python web实战之细说Django的中间件

&#x1f511; 关键词&#xff1a;Python Web 开发、Django、中间件 今天分享Python Web开发中的一个重要成员&#xff1a;Django的中间件。介绍中间件的概念、作用及其在实战中的应用。 1 什么是中间件 在Python Web开发中&#xff0c;中间件&#xff08;Middleware&#xff…

git使用(常见用法)

一.下载git git官方下载跳转 安装简单,有手就行 二. git的简单使用 1. 连接远程仓库 #初始化 git init #配置账户 git config --global user.name “输入你的用户名” git config --global user.email “输入你的邮箱” git config --list #--q退出 #配置验证邮箱 ssh-key…