当前位置: 首页 > news >正文

一个通用的EXCEL生成下载方法

Excel是一个Java开发中必须会用到的东西,之前博主也发过一篇关于使用Excel的文章,但是最近工作中,发现了一个更好的使用方法,所以,就对之前的博客进行总结,然后就有了这篇新的,万能通用的方法说明书了
好了,闲话不多说,直接上干货了
控制器代码如下

@Operation(summary = "Excel导入", description = "Excel导入")@GetMapping("/commPointManagement/importExcel")public ResultBody importExcel(@RequestParam MultipartFile excel,@RequestParam(value = "creatorId") Long creatorId,HttpServletResponse response){try {return commPointManagementService.importExcel(excel,creatorId,response);} catch (Exception e) {return ResultBody.failed("导入失败"+e.getMessage());}}/*** excel导出* @param dto*/@Operation(summary = "Excel导出", description = "Excel导出")@PostMapping("/commPointManagement/downloadInfoExcel")public void downloadInfoExcel(@RequestBody CommPointManagementDTO dto, HttpServletResponse response){commPointManagementService.downloadInfoExcel(dto,response);}/*** 下载模板*/@GetMapping("/commPointManagement/downloadExcelTemplate")@Operation(summary = "下载模板excel模板", description = "下载模板excel模板")public void exportExcelFormat(HttpServletResponse response) {commPointManagementService.exportExcelFormat(response);}

上面总结了三个方法,都是不使用模板的,代码也有注释,大家可根据注释获取自己需要的方法

service接口就不粘贴了,直接上实现类了

public void exportExcelFormat(HttpServletResponse response) {List<List<String>> customTitle = new ArrayList<>();List<String> titles = Lists.newArrayList();titles.add("字段1");titles.add("字段2");titles.add("字段3");customTitle.add(titles);try {EasyPoiUtil.exportExcel("模板名称.xlsx", null, null, Lists.newArrayList(), CommPointManagementVO.class, customTitle, Lists.newArrayList(), response);} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic ResultBody importExcel(MultipartFile excel,Long creatorId, HttpServletResponse response) throws Exception {//获取Excel中的数据集合ExcelImportResult<CommPointManagementBean> importExcel = EasyPoiUtil.importExcel(excel, 1, 0, 0, false, CommPointManagementBean.class);List<CommPointManagementBean> importList = importExcel.getList();int failCount = 0;int insertCount = 0;if (CollUtil.isEmpty(importList)) {return ResultBody.ok().msg("导入excel成功");}Timestamp time = new Timestamp(new Date().getTime());for (int i = 0; i < importList.size(); i++) {CommPointManagementBean date = importList.get(i);}return ResultBody.ok().data().msg("导入excel成功");}@Overridepublic void downloadInfoExcel(CommPointManagementDTO dto, HttpServletResponse response) {//获取数据库数据IPage<CommPointManagementVO> page = commPointManagementMapper.findPage(new PageParams(dto.getPage(), dto.getLimit()), dto);List<CommPointManagementVO> records = page.getRecords();List<List<String>> customTitle = new ArrayList<>();List<String> titleList = new ArrayList<>();titleList.add("字段1");titleList.add("字段2");titleList.add("字段3");customTitle.add(titleList);try {EasyPoiUtil.exportExcel("表名.xlsx", "表头", "Excel中的页名", records,CommPointManagementVO.class, customTitle, new ArrayList<>(), response);} catch (Exception e) {throw new RuntimeException(e);}}

上面方法中的CommPointManagementVO.class是接口返回的实体类,虽然没有注解,但是细心一点看还是能看出来的,里面还有一个工具类EasyPoiUtil,这个就是咱们今天的主角了,主角介绍如下:

package com.secondcloud.system.server.util;import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.afterturn.easypoi.util.PoiPublicUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** easyPoi excel通用导入导出*/
public class EasyPoiUtil {private static final String SUFFIX = ".xlsx";/*** exportExcel 通用导出方法(bean加注解)** @param fileName    文件名* @param title       标题* @param sheetName   表单名* @param list        数据* @param pojoClass   数据类* @param customTitle 自定义表头* @param mergeList   自定义合并* @param response    响应* @throws Exception*/public static void exportExcel(String fileName, String title, String sheetName, List<?> list, Class<?> pojoClass,List<List<String>> customTitle, List<CellRangeAddress> mergeList, HttpServletResponse response)throws Exception {defaultExport(list, pojoClass, fileName, response, simpleParams(title, sheetName, fileName), customTitle,mergeList, null);}/*** exportExcelEntity 通用导出方法(自定义ExcelExportEntity)** @param fileName    文件名* @param title       标题* @param sheetName   表单名* @param list        数据* @param entityList  数据配置* @param customTitle 自定义表头* @param mergeList   自定义合并* @param response    响应* @throws Exception*/public static void exportExcelEntity(String fileName, String title, String sheetName, List<?> list, List<ExcelExportEntity> entityList,List<List<String>> customTitle, List<CellRangeAddress> mergeList, HttpServletResponse response)throws Exception {defaultExport(list, null, fileName, response, simpleParams(title, sheetName, fileName), customTitle,mergeList, entityList);}/*** exportExcel 多表单导出方法(bean加注解)** @param fileName   文件名* @param configList title:标题 data:数据 entity:数据类* @param response   响应* @throws Exception*/public static void exportExcelMultiSheet(String fileName, List<Map<String, Object>> configList,HttpServletResponse response) throws Exception {// 根据fileName后缀确定excel文件是xls还是xlsxExcelType type = ExcelType.HSSF;if (StrUtil.endWith(fileName, SUFFIX)) {type = ExcelType.XSSF;}Workbook workbook = ExcelExportUtil.exportExcel(configList, type);if (workbook != null) {try {if (CollectionUtil.isNotEmpty(configList)) {int sheetIndex = 0;for (Map<String, Object> map : configList) {List<List<String>> customTitle = (List<List<String>>) map.get("customTitle");List<CellRangeAddress> mergeList = (List<CellRangeAddress>) map.get("mergeList");String sheetTitle = Convert.toStr(map.get("sheetTitle"));Sheet sheet = workbook.getSheetAt(sheetIndex);if (sheet != null) {// 自定义合并boolean mergeFlag = CollectionUtil.isNotEmpty(mergeList);if (mergeFlag) {for (CellRangeAddress merge : mergeList) {sheet.addMergedRegion(merge);}}// 合并多列标题(暂时支持第一行向左合并 第二行向上合并)int begin = 0;int end = 0;String tmpTitle = null;// 已合并区域标识 i&jList<String> mergedList = new ArrayList<>();int i = 0;if (sheetTitle != null) {i++;}int line = i;CellStyle cellStyle = null;for (List<String> strings : customTitle) {Row row = sheet.getRow(i);if (row == null) {row = sheet.createRow(i);}int j = 0;for (String s : strings) {Cell cell = row.getCell(j);if (cell == null) {cell = row.createCell(j);cell.setCellStyle(cellStyle);} else if (cellStyle == null) {cellStyle = cell.getCellStyle();}cell.setCellValue(s);if (!mergeFlag) {// 第一行合并规则if (i == line) {if (StrUtil.isEmpty(s)) {end = j;}if (tmpTitle != null && StrUtil.isNotEmpty(s) && !tmpTitle.equals(s)) {if (end > begin) {sheet.addMergedRegion(new CellRangeAddress(i, i, begin, end));for (int f = begin; f < end; f++) {mergedList.add(i + "&" + f);}}begin = j;tmpTitle = s;}if (tmpTitle == null) {begin = j;tmpTitle = s;}} else if (i == line + 1) {// 第二行向上合并if (StrUtil.isEmpty(s) && !mergedList.contains((i - 1) + "&" + j)) {sheet.addMergedRegion(new CellRangeAddress(i - 1, i, j, j));mergedList.add((i - 1) + "&" + j);mergedList.add(i + "&" + j);}}}j++;}if (!mergeFlag) {// 第一行合并规则(换行前)if (i == line) {if (strings.size() > 0 && end > begin) {sheet.addMergedRegion(new CellRangeAddress(i, i, begin, end));for (int f = begin; f < end; f++) {mergedList.add(i + "&" + f);}}}}i++;}}sheetIndex++;}}} catch (Exception e) {}downLoadExcel(fileName, response, workbook);}}/*** importExcel 通用导入方法(bean加注解)** @param file       导入文件* @param titleRows  标题行数* @param headerRows 头部行数* @param keyIndex   主键列 如果这个cell没有值,就跳过,默认0* @param needVerfiy 是否需要校验,默认false* @param pojoClass  数据类* @return* @throws Exception*/public static <T> ExcelImportResult<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows,Integer keyIndex, Boolean needVerfiy, Class<T> pojoClass) throws Exception {if (file == null) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);params.setKeyIndex(keyIndex);params.setNeedVerify(needVerfiy);ExcelImportResult<T> rst = null;try {rst = ExcelImportUtil.importExcelMore(file.getInputStream(), pojoClass, params);} catch (Exception e) {e.printStackTrace();throw e;}return rst;}/*** importExcel 指定表单导入方法(bean加注解)** @param file            导入文件* @param titleRows       标题行数* @param headerRows      头部行数* @param startSheetIndex 表单序号* @param sheetNum        表单数量* @param keyIndex        主键列 如果这个cell没有值,就跳过\* @param needVerfiy      是否需要校验,默认false* @param pojoClass       数据类* @return* @throws Exception*/public static <T> ExcelImportResult<T> importExcelCommon(MultipartFile file, Integer titleRows, Integer headerRows,Integer startSheetIndex, Integer sheetNum, Integer keyIndex, Boolean needVerfiy, Class<T> pojoClass)throws Exception {if (file == null) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);params.setStartSheetIndex(startSheetIndex);params.setSheetNum(sheetNum);params.setKeyIndex(keyIndex);params.setNeedVerify(needVerfiy);ExcelImportResult<T> rst = null;try {rst = ExcelImportUtil.importExcelMore(file.getInputStream(), pojoClass, params);} catch (Exception e) {e.printStackTrace();throw e;}return rst;}/*** importExcel 根据文件路径导入excel(bean加注解)** @param filePath* @param titleRows* @param headerRows* @param pojoClass* @param <T>* @return* @throws Exception*/public static <T> ExcelImportResult<T> importExcel(String filePath, Integer titleRows, Integer headerRows,Class<T> pojoClass) throws Exception {if (StrUtil.isEmpty(filePath)) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);ExcelImportResult<T> rst = null;try {rst = ExcelImportUtil.importExcelMore(new File(filePath), pojoClass, params);} catch (Exception e) {e.printStackTrace();throw e;}return rst;}private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response,ExportParams exportParams, List<List<String>> customTitle, List<CellRangeAddress> mergeList,List<ExcelExportEntity> entityList) throws Exception {exportParams.setFixedTitle(false);Workbook workbook;int titleLine = 0;if (CollectionUtil.isNotEmpty(customTitle)) {titleLine = customTitle.size();}// 自定义标题需要在标题下插入行List<Object> t = new ArrayList<>();while (titleLine > 1 && CollectionUtil.isNotEmpty(list)) {t.add(pojoClass.getDeclaredConstructor().newInstance());titleLine--;}t.addAll(list);if (pojoClass == null) {workbook = ExcelExportUtil.exportExcel(exportParams, entityList, t);} else {workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, t);}if (workbook != null) {// 自定义标题if (CollectionUtil.isNotEmpty(customTitle)) {Sheet sheet = workbook.getSheetAt(0);if (sheet != null) {// 自定义合并boolean mergeFlag = CollectionUtil.isNotEmpty(mergeList);if (mergeFlag) {for (CellRangeAddress merge : mergeList) {sheet.addMergedRegion(merge);}}// 合并多列标题(暂时支持第一行向左合并 第二行向上合并)int begin = 0;int end = 0;String tmpTitle = null;// 已合并区域标识 i&jList<String> mergedList = new ArrayList<>();int i = 0;if (exportParams.getTitle() != null) {i++;}if (exportParams.getSecondTitle() != null) {i++;}int line = i;CellStyle cellStyle = null;for (List<String> strings : customTitle) {Row row = sheet.getRow(i);if (row == null) {row = sheet.createRow(i);}int j = 0;for (String s : strings) {Cell cell = row.getCell(j);if (cell == null) {cell = row.createCell(j);cell.setCellStyle(cellStyle);} else if (cellStyle == null) {cellStyle = cell.getCellStyle();}cell.setCellValue(s);if (!mergeFlag) {// 第一行合并规则if (i == line) {if (StrUtil.isEmpty(s)) {end = j;}if (tmpTitle != null && StrUtil.isNotEmpty(s) && !tmpTitle.equals(s)) {if (end > begin) {sheet.addMergedRegion(new CellRangeAddress(i, i, begin, end));for (int f = begin; f < end; f++) {mergedList.add(i + "&" + f);}}begin = j;tmpTitle = s;}if (tmpTitle == null) {begin = j;tmpTitle = s;}} else if (i == line + 1) {// 第二行向上合并if (StrUtil.isEmpty(s) && !mergedList.contains((i - 1) + "&" + j)) {sheet.addMergedRegion(new CellRangeAddress(i - 1, i, j, j));mergedList.add((i - 1) + "&" + j);mergedList.add(i + "&" + j);}}}j++;}if (!mergeFlag) {// 第一行合并规则(换行前)if (i == line) {if (strings.size() > 0 && end > begin) {sheet.addMergedRegion(new CellRangeAddress(i, i, begin, end));for (int f = begin; f < end; f++) {mergedList.add(i + "&" + f);}}}}i++;}}}downLoadExcel(fileName, response, workbook);}}private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook)throws Exception {OutputStream ouputStream = null;try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));response.setHeader("Pragma", "No-cache");ouputStream = response.getOutputStream();workbook.write(ouputStream);} catch (Exception e) {e.printStackTrace();throw e;} finally {if (ouputStream != null) {try {ouputStream.flush();ouputStream.close();} catch (Exception e) {}}}}/*** 获取表单配置项** @param title* @param sheetName* @param fileName* @return*/public static ExportParams simpleParams(String title, String sheetName, String fileName) {// 根据fileName后缀确定excel文件是xls还是xlsxExcelType type = ExcelType.HSSF;if (StrUtil.endWith(fileName, SUFFIX)) {type = ExcelType.XSSF;}ExportParams exportParams = new ExportParams(title, sheetName, type);exportParams.setFixedTitle(false);return exportParams;}/*** 获取表单配置对象** @param title* @param sheetName* @param fileName* @param pojoClass* @param list* @param customTitle 自定义表头* @param mergeList   自定义合并* @return*/public static Map<String, Object> simpleParamsMap(String title, String sheetName, String fileName, List<?> list,Class<?> pojoClass, List<List<String>> customTitle, List<CellRangeAddress> mergeList) throws Exception {Map<String, Object> map = new HashMap<String, Object>();map.put("title", simpleParams(title, sheetName, fileName));map.put("entity", pojoClass);List<Object> array = new ArrayList<>();if (CollectionUtil.isNotEmpty(customTitle)) {int size = customTitle.size();while (size > 1) {array.add(pojoClass.getDeclaredConstructor().newInstance());size--;}}if (list != null) {array.addAll(list);}map.put("data", array);map.put("customTitle", customTitle);map.put("mergeList", mergeList);map.put("sheetTitle", title);return map;}/*** 生成ExcelExportEntity** @param name  名称* @param value 属性* @param merge 是否合并列* @param list  下级entity* @return*/public static ExcelExportEntity getExportEntity(String name, String value, Boolean merge, Double width, Integer orderNum,String format, List<ExcelExportEntity> list) {ExcelExportEntity entity = new ExcelExportEntity(name, value);if (merge != null) {entity.setNeedMerge(merge);}if (width != null) {entity.setWidth(width);}if (orderNum != null) {entity.setOrderNum(orderNum);}if (format != null) {entity.setFormat(format);}if (CollectionUtil.isNotEmpty(list)) {entity.setList(list);}return entity;}public static List<ExcelExportEntity> classToEntityList(Class<?> pojoClass) {List<ExcelExportEntity> rst = new ArrayList<>();try {Field[] fileds = PoiPublicUtil.getClassFields(pojoClass);ExcelTarget etarget = (ExcelTarget) pojoClass.getAnnotation(ExcelTarget.class);String targetId = etarget == null ? null : etarget.value();new ExcelExportService().getAllExcelField(null, targetId, fileds, rst, pojoClass, (List) null, (ExcelEntity) null);} catch (Exception e) {}return rst;}
}

这个工具类一般的格式都能使用的,具体复杂的Excel表格样式,还是使用Excel表格模板去做会更方便点,工具类的方发也有说明,大家自行查看哦。
本篇分享就到这里了,如果有使用问题,可以评论留言,有不对的地方,请批评指正,谢谢!

相关文章:

一个通用的EXCEL生成下载方法

Excel是一个Java开发中必须会用到的东西&#xff0c;之前博主也发过一篇关于使用Excel的文章&#xff0c;但是最近工作中&#xff0c;发现了一个更好的使用方法&#xff0c;所以&#xff0c;就对之前的博客进行总结&#xff0c;然后就有了这篇新的&#xff0c;万能通用的方法说…...

介绍 TensorFlow 的基本概念和使用场景。

TensorFlow&#xff08;简称TF&#xff09;是由Google开发的开源机器学习框架&#xff0c;它具有强大的数值计算和深度学习功能&#xff0c;广泛用于构建、训练和部署机器学习模型。以下是TensorFlow的基本概念和使用场景&#xff1a; 基本概念&#xff1a; 张量&#xff08;T…...

【力扣】304. 二维区域和检索 - 矩阵不可变 <二维前缀和>

目录 【力扣】304. 二维区域和检索 - 矩阵不可变二维前缀和理论初始化计算面积 题解 【力扣】304. 二维区域和检索 - 矩阵不可变 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, …...

线上问诊:数仓开发(三)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 线上问诊&#xff1a;数仓开发(二) 线上问诊&#xff1a;数仓开发(三) 文章目录 系列文章目录前言一、ADS1.交易主题1.交易综合统计2.各医院交易统计3.各性…...

微信小程序 通过响应式数据控制元素class属性

我想大家照这个和我最初的目的一样 希望有和vue中v-bind:class一样方便的指令 但答案不太尽人意 这里 我们只能采用 三元运算符的形式 参考代码如下 <view class"item {{ userId item.userId ? isThisUser : }}"> </view>这里 我们判断 如果当前ite…...

linux并发服务器 —— linux网络编程(七)

网络结构模式 C/S结构 - 客户机/服务器&#xff1b;采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互&#xff1b;C/S结构中&#xff0c;服务器 - 后台服务&#xff0c;客户机 - 前台功能&#xff1b; 优点 1. 充分发挥客户端PC处理能力…...

Java后端开发面试题——企业场景篇

单点登录这块怎么实现的 单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称SSO&#xff09;,只需要登录一次&#xff0c;就可以访问所有信任的应用系统 JWT解决单点登录 用户访问其他系统&#xff0c;会在网关判断token是否有效 如果token无效则会返回401&am…...

TiDB x 安能物流丨打造一栈式物流数据平台

作者&#xff1a;李家林 安能物流数据库团队负责人 本文以安能物流作为案例&#xff0c;探讨了在数字化转型中&#xff0c;企业如何利用 TiDB 分布式数据库来应对复杂的业务需求和挑战。 安能物流作为中国领先的综合型物流集团&#xff0c;需要应对大规模的业务流程&#xff…...

负载均衡算法实现

负载均衡算法实现 负载均衡介绍 负责均衡主要有以下五种方法实现: 1、轮询法 将请求按顺序轮流地分配到后端服务器上&#xff0c;它均衡地对待后端的每一台服务器&#xff0c;而不关心服务器实际的连接数和当前的系统负载&#xff1b; 2、随机法 通过系统的随机算法&#…...

Flutter 完美的验证码输入框 转载

刚开始看到这个功能的时候一定觉得so easy&#xff0c;开始的时候我也是这么觉得的&#xff0c;这还不简单&#xff0c;然而真正写的时候才发现并没有想象的那么简单。 先上图&#xff0c;不上图你们都不想看&#xff0c;我难啊&#xff0c;到Github&#xff1a; https://gith…...

SpringBoot整合Jpa实现增删改查功能(提供Gitee源码)

前言&#xff1a;在日常开发中&#xff0c;总是撰写一些简单的SQL会非常耗时间&#xff0c;Jpa可以完美的帮我们提高开发的效率&#xff0c;对于常规的SQL不需要我们自己撰写&#xff0c;相对于MyBatis有着更简单易用的功能&#xff0c;但是MyBatis自由度相对于Jpa会更高一些&a…...

微服务[Nacos]

CAP 1&#xff09;一致性(Consistency) (所有节点在同一时间具有相同的数据) 2&#xff09;可用性(Availability)(保证每个请求不管成功或者失败都有响应) 3&#xff09;分区容错(Partition tolerance)(系统中任意信息的丢失或失败不会影响系统的继续运作) 一、虚拟机镜像准备 …...

8K视频来了,8K 视频编辑的最低系统要求

当今 RED、Canon、Ikegami、Sony 等公司的 8K 摄像机以及 8K 电视&#xff0c;许多视频内容制作人和电影制作人正在认真考虑 8K 拍摄、编辑和后期处理&#xff0c;需要什么样的系统来处理如此海量的数据&#xff1f; 中央处理器&#xff08;CPU&#xff09; 首先&#xff0c;…...

AsyncContext优雅实现HTTP长轮询接口

一、背景 接到一个需求&#xff0c;实现方案时需要提供一个HTTP接口&#xff0c;接口需要hold住5-8秒&#xff0c;轮询查询数据库&#xff0c;一旦数据库中值有变化&#xff0c;取出变化的值进行处理&#xff0c;处理完成后返回响应。这不就是长轮询吗&#xff0c;如何优雅的实…...

如何制作一个百货小程序

在这个数字化时代&#xff0c;小程序已成为各行各业的必备工具。其中&#xff0c;百货小程序因其便捷性和多功能性&#xff0c;越来越受到人们的青睐。那么&#xff0c;如何制作一个百货小程序呢&#xff1f;下面&#xff0c;我们就详细介绍一下无需编写代码的步骤。 一、进入后…...

【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

文章目录 局部搜索算法内存限制局部搜索算法示例&#xff1a;n-皇后爬山算法随机重启爬山模拟退火算法局部剪枝搜索遗传算法小结 局部搜索算法 在某些规模太大的问题状态空间内&#xff0c;A*往往不够用 问题空间太大了无法访问 f 小于最优的所有状态通常&#xff0c;甚至无法储…...

MATLAB旋转动图的绘制

MATLAB旋转动图的绘制 文章目录 MATLAB旋转动图的绘制1、动图效果2、matlab代码 利用matlab实现三维旋转动图的绘制。 1、动图效果 2、matlab代码 close all clear clcf(x,y,z)(x.^2 (9./4).*y.^2 z.^2 - 1).^3 - x.^2.*z.^3 - (9./80).*y.^2.*z.^3; [x,y,z]meshgrid(linspac…...

算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)

1 介绍 精准最近邻搜索中数据维度一般较低&#xff0c;所以会采用穷举搜索&#xff0c;即在数据库中依次计算其中样本与所查询数据之间的距离&#xff0c;抽取出所计算出来的距离最小的样本即为所要查找的最近邻。 当数据量非常大的时候&#xff0c;搜索效率急剧下降。——>…...

uni-app 之 vue语法

uni-app 之 vue语法 image.png --- v-html 字符 --- image.png <template><view><view>{{title}}</view>--- v-html 字符 ---<view>{{title2}}</view><view v-html"title2"></view><view>{{arr}}</view&g…...

Android之RecyclerView仿ViewPage滑动

文章目录 前言一、效果图二、实现步骤1.xml主布局2.所有用到的drawable资源文件3.xml item布局4.adapter适配器5.javabean实体类6.activity使用 总结 前言 我们都知道ViewPageFragment滑动&#xff0c;但是的需求里面已经有了这玩意&#xff0c;但是在Fragment中还要有类似功能…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...