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

news2024/12/27 11:43:50

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;
}

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

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

相关文章

实践分享:小程序事件系统设计

微信小程序官方文档中解释说&#xff1a;事件是用于子组件向父组件传递数据&#xff0c;可以传递任意数据。 小程序开发中的事件是指视图层到逻辑层的通讯方式&#xff0c;主要是可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上&#xff0c;当达到触发事件&#…

java面向对象查缺

匿名对象 匿名对象只能使用一次 public class Test1 {public static void main(String[] args) {PhoneFactory p1 new PhoneFactory();p1.show(new Phone(1000,"black"));} } class PhoneFactory{public void show(Phone p){p.send();} } class Phone{private int…

Nginx代理接口访问返回404

Nginx代理接口访问返回404 一、背景 因为不同业务系统间有接口调用&#xff0c;存在跨域问题&#xff0c;为了解决同源策略&#xff0c;需要将接口通过nginx去转发&#xff0c;但是配置完后通过postman请求一直存在访问404的问题。 访问地址&#xff1a;https://a.test.com/n…

无代码集成明道云与更多应用连接

明道云是一个APaaS平台&#xff0c;可以帮助用户快速搭建个性化企业应用&#xff0c;用户不需要代码开发就能够搭建出用户体验上佳的销售、运营、人事、采购等核心业务应用&#xff0c;打通企业内部数据&#xff0c;也能够通过API和Webhook和其他系统对接。 场景描述&#xff…

Vue实战技巧:从零开始封装全局防抖和节流函数

前言 你是否曾经遇到过用户频繁点击按钮或滚动页面导致反应迟钝的问题&#xff1f;这是因为事件被连续触发&#xff0c;导致性能下降。在本文中&#xff0c;我将为大家介绍 vue 中的防抖和节流策略&#xff0c;并展示如何封装全局的防抖节流函数&#xff0c;以避免频繁触发事件…

酷开系统丨加入酷开会员,体验有趣的云逛荷兰海牙市立博物馆

夏日炎炎&#xff0c;出门是不可能的&#xff0c;还是宅在家里享受空调的吹拂吧&#xff01;如果想足不出户看展览&#xff0c;感受文化的熏陶&#xff0c;那就打开酷开系统&#xff0c;加入酷开会员&#xff0c;在云端逛逛荷兰海牙市立博物馆吧&#xff01; 荷兰海牙市立博物…

格式化后数据恢复,教你3个实用方法!

“格式化后数据还能恢复吗&#xff1f;前几天因为我的电脑中了病毒&#xff0c;我不得不将它进行格式化操作。但是我电脑里有很多比较重要的文件&#xff0c;有什么方法可以帮我恢复电脑中的文件吗&#xff1f;求解答&#xff01;” 格式化是一种比较常见的数据清除方法&#x…

低代码平台:初创公司的理想选择

对于初创公司而言&#xff0c;时间和资源是宝贵的。他们需要快速构建和部署应用程序&#xff0c;以满足业务需求&#xff0c;提高效率&#xff0c;并保持竞争优势。在这个背景下&#xff0c;低代码平台成为了初创公司的一个理想选择。而Zoho Creator作为一款出色的低代码平台&a…

node 报错:tagOffsetsMap[tag] ??= [];...SyntaxError: Unexpected token ,‘??=‘,亲测解决

安装的 node 版本不支持空值赋值运算符(??) 更换合适的 node 版本就行&#xff0c;如图 看看版本对应支持的 更多支持请在 node.green 上查看各种语法支持的版本

计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D

《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis》 摘要 我们见证了3D感知图像合成的快速进展&#xff0c;利用了生成视觉模型和神经渲染的最新进展。然而&#xff0c;现有的方法在两方面存在不足&#xff1a;首先&#xff0c;它们…

ELK 将数据流转换回常规索引

ELK 将数据流转换回常规索引 现象&#xff1a;创建索引模板是打开了数据流&#xff0c;导致不能创建常规索引&#xff0c;并且手动修改、删除索引模板失败 "reason" : "composable template [logs_template] with index patterns [new-pattern*], priority [2…

SAP中采购文档出现定价转换因子字段溢出是何原因?

近期处理了一笔用户反馈的主题问题。这个问题有意思的地方地于&#xff0c;多重错误的叠加&#xff0c;导致了问题在开始就暴露出来&#xff0c;可以将隐患消除在萌芽状态。 在公司的应用中&#xff0c;会由采购创建价格合同&#xff0c;物流参照价格合同创建计划协议。但采购…

聊聊JDK动态代理原理

1. 示例 首先&#xff0c;定义一个接口&#xff1a; public interface Staff {void work(); }然后&#xff0c;新增一个类并实现上面的接口&#xff1a; public class Coder implements Staff {Overridepublic void work() {System.out.println("认真写bug……");…

为什么说用C端产品的思维做B端产品就是死路一条?

经常听行业大佬说起&#xff1a;如果用C端产品的思维做B端产品就是死路一条&#xff0c;那原因究竟是什么呢&#xff1f; 首先&#xff0c;需要明确的是C端产品和B端产品的用户群体和需求存在很大差异。C端产品的用户主要是消费者&#xff0c;更多的是被情感驱动。而B端产品的…

Visual Studio 2022安装教程(英文版)

文章目录 1.下载安装 1.下载 官网地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 选择第一个社区版本&#xff1a;Community 2022 安装 1.将下载好的文件保存到桌面&#xff0c;双击点开 2.等待visual studio installer配置好 3.点击安装后会来到配件选…

消息队列(3) -封装数据库的操作

前言 上一篇博客我们写了, 关于交换机, 队列,绑定, 写入数据库的一些建库建表的操作 这一篇博客中,我们将建库建表操作,封装一下实现层一个类来供上层服务的调用 , 并在写完该类之后, 测试代码是否完整 实现封装 在写完上述的接口类 与 xml 后, 我们想要 创建一个类 ,来调用…

使用OpenCV进行目标提取详细教程(附python代码演练)

今天的文章将讨论并指导你识别图像中的对象&#xff0c;使用 OpenCV 对这些对象进行遮罩处理。让我们开始吧&#xff01; HSV 色标 请花一点时间观察下面的图片。每个图块似乎是不同的颜色&#xff0c;对吧&#xff1f;但是有一个有趣的地方&#xff1a;如果我们仔细思考&#…

B2B2C跨境独立站后台管理--支付系统开源搭建

要搭建一个B2B2C跨境独立站后台管理的支付系统&#xff0c;您可以按照以下步骤进行开发&#xff1a; 1. 确定需求和功能&#xff1a;首先&#xff0c;您需要明确支付系统的功能和需求&#xff0c;包括接入第三方支付平台、实现支付功能、订单管理、退款管理、对账功能等。 2.…

无涯教程-Perl - eval函数

描述 该函数在执行时判断EXPR,就好像EXPR是一个单独的Perl脚本一样。这使您可以在程序中使用单独的,也许是用户提供的Perl脚本。每次调用函数时,都会分别判断eval EXPR语句。 当解析脚本的其余部分时(执行之前),第二种形式判断BLOCK。 语法 以下是此函数的简单语法- eval …

Redis探索之旅

目录 今日良言&#xff1a;有志者自有千计万计&#xff0c;无志者只感千难万难 一、简介 二、Redis的安装 三、Redis的简单使用 四、Redis相关知识点 1.缓存分类 2.五大基本数据类型使用 3.持久化 4.常见面试题 今日良言&#xff1a;有志者自有千计万计&#xff0c;无…