Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类

package com.yutu.garden.utils;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * @ClassName: ExcelUtils
 * @Description: Excel相关操作
 * @Author
 * @Date 2022/4/11
 * @Version 1.0
 */
@Component
public class ExcelUtils {

	@Resource
	private  ResourceLoader resourceLoader;
	private static Logger log = LoggerFactory.getLogger(ExcelUtils.class);
	static{
		System.setProperty("java.awt.headless", "true");
	}

	/**
	 * 设置表头
	 * @param sheet sheet
	 * @param str 表头数据
	 * @param startNum 开始行
	 * @param height 高度
	 * @param style 样式
	 */
	public static void setTitle(HSSFSheet sheet, String[] str,int startNum,Short height,HSSFCellStyle style,Integer[] widths,int width) {
		try {
			HSSFRow row = sheet.createRow(startNum);
			if(ObjectUtils.isEmpty(height)){
				height = (short)(20*20);
			}
			row.setHeight(height);
			//创建表头名称
			HSSFCell cell;
			for (int j = 0; j < str.length; j++) {
				cell = row.createCell(j);

				//设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
				if(ObjectUtils.isNotEmpty(widths) && ObjectUtils.isNotEmpty(widths[j]) ){
					sheet.setColumnWidth(j, widths[j]);
				}else{
					sheet.autoSizeColumn(j);
					int colWidth = sheet.getColumnWidth(j) * width / 10;
//					if (colWidth > 255) {
//						colWidth = 255;
//					}

					sheet.setColumnWidth(j, colWidth);
				}

				cell.setCellValue(str[j]);
				cell.setCellStyle(style);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void setTitle(HSSFSheet sheet, List<String> str,int startNum,Short height,HSSFCellStyle style,Integer[] widths) {
		try {
			HSSFRow row = sheet.createRow(startNum);
			if(ObjectUtils.isEmpty(height)){
				height = (short)(20*20);
			}
			row.setHeight(height);
			//创建表头名称
			HSSFCell cell;
			for (int j = 0; j < str.size(); j++) {
				cell = row.createCell(j);

				//设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
				if(ObjectUtils.isNotEmpty(widths) && ObjectUtils.isNotEmpty(widths[j]) ){
					sheet.setColumnWidth(j, widths[j]);
				}else{
					sheet.autoSizeColumn(j);
					sheet.setColumnWidth(j, sheet.getColumnWidth(j) * 30 / 10);
				}

				cell.setCellValue(str.get(j));
				cell.setCellStyle(style);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 方法名:setData
	 * 功能:表格赋值
	 */
	public static void setData(HSSFSheet sheet, List<Object[]> data,int startNum,HSSFCellStyle style) {
		try{
			int rowNum = startNum+1;
			for (int i = 0; i < data.size(); i++) {
				HSSFRow row = sheet.createRow(rowNum);
				for (int j = 0; j < data.get(i).length; j++) {
					HSSFCell cell = row.createCell(j);
					if(ObjectUtils.isEmpty(data.get(i)[j])){
						cell.setCellValue("");
					}else{
						cell.setCellValue(data.get(i)[j].toString());
					}
					cell.setCellStyle(style);
				}
				rowNum++;
			}
		}catch (Exception e){
			e.printStackTrace();
		}
	}

	public static void setDataByList(HSSFSheet sheet, List<List<Object>> data,int startNum) {
		try{
			int rowNum = startNum+1;
			for (int i = 0; i < data.size(); i++) {
				HSSFRow row = sheet.createRow(rowNum);

				for (int j = 0; j < data.get(i).size(); j++) {
					if(ObjectUtils.isEmpty(data.get(i).get(j))){
						row.createCell(j).setCellValue("");
					}else{
						row.createCell(j).setCellValue(data.get(i).get(j).toString());
					}
				}
				rowNum++;
			}
		}catch (Exception e){
			e.printStackTrace();
		}
	}

	/**
	 * 方法名:setBrowser
	 * 功能:使用浏览器下载
	 */
	public static void setBrowser(HttpServletResponse response, HSSFWorkbook workbook, String fileName) {
		try {
			//清空response
			//response.reset();
			//设置response的Header
			String name = URLEncoder.encode(fileName, "UTF-8");
			//Content-disposition 的 attachment参数将文件作为附件下载
			//response.setHeader("Content-disposition", "attachment;filename=" + fileName+".xlsx");
			response.setHeader( "Content-Disposition", "attachment;filename=\"" + name + "\".xlsx;filename*=utf-8''" + name +".xlsx");

			OutputStream os = new BufferedOutputStream(response.getOutputStream());
			response.setContentType("application/vnd.ms-excel");
			response.setCharacterEncoding("utf-8");
			//将excel写入到输出流中
			workbook.write(os);
			os.flush();
			os.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 居中
	 * @param workbook
	 * @return
	 */
	public static HSSFCellStyle getStyleByCENTER(HSSFWorkbook workbook,int size){
		//设置标题样式
		HSSFCellStyle style = workbook.createCellStyle();
		HSSFFont font = workbook.createFont();
		font.setBold(true);
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) size);
		style.setFont(font);
		//水平居中
		style.setAlignment(HorizontalAlignment.CENTER);
		//垂直居中
		style.setVerticalAlignment(VerticalAlignment.CENTER);
		style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
		return style;
	}

	/**
	 * 带边框的样式
	 * @param workbook workbook
	 * @param size 字体大小
	 * @param isText 是否正文
	 * @return
	 */
	public static HSSFCellStyle getStyleByBorder(HSSFWorkbook workbook,int size,boolean isText){
		//设置标题样式
		HSSFCellStyle style = workbook.createCellStyle();
		HSSFFont font = workbook.createFont();
		if(!isText){
			font.setBold(true);
		}
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) size);
		style.setFont(font);
		//水平居中
		style.setAlignment(HorizontalAlignment.CENTER);
		//垂直居中
		style.setVerticalAlignment(VerticalAlignment.CENTER);
		style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
		//边框
		style.setBorderBottom(BorderStyle.THIN);
		style.setBorderLeft(BorderStyle.THIN);
		style.setBorderTop(BorderStyle.THIN);
		style.setBorderRight(BorderStyle.THIN);
		return style;
	}


	public static HSSFCellStyle getDataStyle(HSSFWorkbook workbook,int size,boolean isSetBold,HSSFColor.HSSFColorPredefined background){
		//设置标题样式
		HSSFCellStyle style = workbook.createCellStyle();
		HSSFFont font = workbook.createFont();
		font.setBold(isSetBold);
		font.setFontName("宋体");
		font.setFontHeightInPoints((short) size);
		style.setFont(font);
		if(ObjectUtils.isNotEmpty(background)){//设置填充方式
			style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
			style.setFillForegroundColor(background.getIndex());
		}
		return style;
	}

	/**
	 * 解析上传的excel, 默认只解析第一张Sheet
	 *
	 * @param file     excel
	 * @param startRow 数据开始行
	 * @return List<String [ ]>
	 * @throws IOException
	 */
	public static List<String> getExcelData(MultipartFile file, int startRow, Integer endRow){
		int resultSize = 0;
		ArrayList<String> resultData = new ArrayList<>(resultSize);
		try {
			if (!checkFile(file)) {
				log.error("上传的excel文件格式有问题");
				return resultData;
			}

			//获得Workbook工作薄对象
			Workbook workbook = getWorkBook(file);
			if (ObjectUtils.isNotEmpty(workbook)) {
				//获取第一张sheet工作表
				Sheet sheet = workbook.getSheetAt(0);
				if (ObjectUtils.isEmpty(sheet)) {
					return resultData;
				}

				// 重新初始化List结果大小
				resultSize = sheet.getLastRowNum() + 1;
				//获得当前sheet的开始行
				int firstRowNum = sheet.getFirstRowNum();
				//获得当前sheet的结束行
				int lastRowNum = sheet.getLastRowNum();
				if(ObjectUtils.isNotEmpty(endRow)){
					lastRowNum = endRow;
				}

				//循环除了startRow的所有行,如果要循环除第一行以外的就firstRowNum+1
				for (int rowNum = firstRowNum + startRow; rowNum <= lastRowNum; rowNum++) {
					//获得当前行
					Row row = sheet.getRow(rowNum);
					if (rowIsEmpty(row)) {
						break;
					}
					//获得当前行的开始列
					int firstCellNum = row.getFirstCellNum();
					//获得当前行的列数
					int lastCellNum = row.getLastCellNum();
					//String[] cells = new String[lastCellNum];
					StringBuilder stringBuffer = new StringBuilder();
					//循环当前行
					for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
						Cell cell = row.getCell(cellNum);
						//cells[cellNum] = getCellValue(cell);
						String cellValue = getCellValue(cell);
						stringBuffer.append(getCellValue(cell)).append(",&");//加个&防止有答案中有,的
					}
					//resultData.add(cells);
					resultData.add(stringBuffer.toString());
				}
				workbook.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		return resultData;
	}


	/**
	 * 检查文件格式
	 *
	 * @param file
	 * @throws IOException
	 */
	public static boolean checkFile(MultipartFile file) throws IOException {
		if (null == file) {
			log.error("文件不存在!");
			return false;
		}
		//获得文件名
		String fileName = file.getOriginalFilename();
		//判断文件是否是excel文件
		if (ObjectUtils.isEmpty(fileName) || (!fileName.endsWith("xls") && !fileName.endsWith("xlsx"))) {
			log.error(fileName + "不是excel文件");
			return false;
		}
		return true;
	}

	/**
	 * 获取工作簿对象
	 *
	 * @param file
	 * @return
	 */
	public static Workbook getWorkBook(MultipartFile file) {
		//获得文件名
		String fileName = file.getOriginalFilename();
		//创建Workbook工作薄对象,表示整个excel
		Workbook workbook = null;
		try {
			//获取excel文件的io流
			InputStream is = file.getInputStream();
			//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
			if(ObjectUtils.isNotEmpty(fileName)){
				if (fileName.endsWith("xls")) {
					//2003
					workbook = new HSSFWorkbook(is);
				} else if (fileName.endsWith("xlsx")) {
					//2007 及2007以上
					workbook = new XSSFWorkbook(is);
				}
			}
		} catch (IOException e) {
			log.error(e.getMessage());
		}
		return workbook;
	}

	public static String getCellValue(Cell cell) {
		String cellValue = "";
		if (cell == null) {
			return cellValue;
		}
		switch (cell.getCellTypeEnum()) {
			case NUMERIC:
				//数字
				cellValue = stringDateProcess(cell);
				break;
			case STRING:
				//字符串
				cellValue = String.valueOf(cell.getStringCellValue());
				break;
			case BOOLEAN:
				//Boolean
				cellValue = String.valueOf(cell.getBooleanCellValue());
				break;
			case FORMULA:
				//公式
				cellValue = String.valueOf(cell.getCellFormula());
				break;
			case BLANK:
				//空值
				cellValue = "";
				break;
			case ERROR:
				//故障
				cellValue = "非法字符";
				break;
			default:
				cellValue = "未知类型";
				break;
		}
		return cellValue;
	}


	public static String stringDateProcess(Cell cell) {
		String result = new String();
		if (HSSFDateUtil.isCellDateFormatted(cell)) {
			// 处理日期格式、时间格式
			SimpleDateFormat sdf = null;
			if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
				sdf = new SimpleDateFormat("HH:mm");
			} else {// 日期
				sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			}
			Date date = cell.getDateCellValue();
			result = sdf.format(date);
		} else if (cell.getCellStyle().getDataFormat() == 58) {
			// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			double value = cell.getNumericCellValue();
			Date date = org.apache.poi.ss.usermodel.DateUtil
				.getJavaDate(value);
			result = sdf.format(date);
		} else {
			double value = cell.getNumericCellValue();
			CellStyle style = cell.getCellStyle();
			DecimalFormat format = new DecimalFormat();
			String temp = style.getDataFormatString();
			// 单元格设置成常规
			if ("General".equals(temp)) {
				int decimalPlaces = countDecimalPlaces(value);
				StringBuilder pattern = new StringBuilder("#.");
				for (int i = 0; i < decimalPlaces; i++) {
					pattern.append("#");
				}
				format.applyPattern(pattern.toString());
			}
			result = format.format(value);
		}

		return result;
	}

	public static int countDecimalPlaces(double value) {
		String stringValue = Double.toString(value);
		int integerPlaces = stringValue.indexOf('.');
		return stringValue.length() - integerPlaces - 1;
	}

	/**
	 * @return * @param null
	 * @Author
	 * @Description //TODO 判断excel的row是否全为空
	 * @Date 2019/12/2 19:30
	 * @Param
	 */
	public static boolean rowIsEmpty(Row row) {
		if (null == row) {
			return true;
		}
		for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
			Cell cell = row.getCell(c);
			if (cell != null && cell.getCellTypeEnum() != CellType.BLANK) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 模板下载
	 * @param response
	 * @param request
	 * @param filename
	 * @param path
	 * @throws IOException
	 */
	public void downloadTemplate(HttpServletResponse response, HttpServletRequest request, String filename, String path) throws IOException {

		InputStream inputStream = null;
		ServletOutputStream servletOutputStream = null;
		try {
			org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:" + path);

			response.setContentType("application/vnd.ms-excel");
			response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
			response.addHeader("charset", "utf-8");
			response.addHeader("Pragma", "no-cache");
			String encodeName = URLEncoder.encode(filename, StandardCharsets.UTF_8.toString());
			response.setHeader("Content-Disposition", "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName);

			inputStream = resource.getInputStream();
			servletOutputStream = response.getOutputStream();
			IOUtils.copy(inputStream, servletOutputStream);
			response.flushBuffer();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (servletOutputStream != null) {
					servletOutputStream.close();
				}
				if (inputStream != null) {
					inputStream.close();
				}
				// jvm的垃圾回收
				System.gc();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

控制层接口

package com.yutu.garden.controller;

import com.yutu.garden.utils.ExcelUtilsWP;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
@RequestMapping("excel")
@Api(tags = "Excel模板下载")
public class ExcelTemplateController {

	@Resource
	private ExcelUtilsWP excelUtils;

	@ApiOperation("下载苗木计划清单模板")
	@GetMapping("/downloadPunishTemplate")
	public void downloadPunishTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {
		String filename = "苗木计划清单模板.xlsx";
		String path = "template/苗木计划清单模板.xlsx";
		excelUtils.downloadTemplate(response,request,filename,path);
	}
}

Excel模板存放位置

在这里插入图片描述

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

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

相关文章

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器&#xff0c;可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开&#xff1a; gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件&#xff0c;但是用终端打开gedit可以动用更高的权限&#xff…

OpenHarmony实战开发-使用一次开发多端部署实现一多设置典型页面

介绍 本示例展示了设置应用的典型页面&#xff0c;其在小窗口和大窗口有不同的显示效果&#xff0c;体现一次开发、多端部署的能力。 1.本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备&#xff08;或多窗口尺寸&#xff09;适配&#xff0c;保…

掌握机器学习新星:使用Python和Scikit-Learn进行图像识别

正文&#xff1a; 随着智能手机和社交媒体的普及&#xff0c;图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据&#xff0c;我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库&#xff0c;它…

谷粒商城实战(010 缓存-解决数据一致性问题以及SpringCache的使用)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第166p-第p172的内容 缓存一致性问题解决 redisson使用lua脚本&#xff0c;所以的锁都保证了原子性 改之前的代码 锁的粒度越小越好 如11号…

PS入门|黑白色的图标怎么抠成透明背景

前言 抠图可以算是PS的入门必备操作&#xff0c;开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦&#xff01;但切勿心急&#xff5e; 今天给小伙伴们带来&#xff1a;黑白色的图标抠图教程 抠图有很多种方法&#xff0c;但根据类型的不同&#xff0c;使用适当的方法很重…

Redis底层数据结构-Dict

1. Dict基本结构 Redis的键与值的映射关系是通过Dict来实现的。 Dict是由三部分组成&#xff0c;分别是哈希表&#xff08;DictHashTable&#xff09;&#xff0c;哈希节点&#xff08;DictEntry&#xff09;&#xff0c;字典&#xff08;Dict&#xff09; 哈希表结构如下图所…

YUNBEE云贝-2024年4月PostgreSQL PGCM认证实战培训

课程介绍 了解关注开源技术&#xff0c;学习PG以点带面 Linux/Andriod&#xff08;操作系统&#xff09;、Apache/Tomcat&#xff08;应用服务器&#xff09;、OpenStack/KVM&#xff08;虚拟化&#xff09;、Docker/K8S&#xff08;容器化&#xff09;、Hadoop&#xff08;大…

利用Python和Selenium实现定时任务爬虫

网络爬虫在信息获取、数据分析等领域发挥着重要作用&#xff0c;而定时爬虫则可以实现定期获取网站数据的功能&#xff0c;为用户提供持续更新的信息。在Python中&#xff0c;结合Selenium技术可以实现定时爬虫的功能&#xff0c;但如何设置和优化定时爬虫的执行时间是一个关键…

C语言编写Linux的Shell外壳

目录 一、输出命令行 1.1 了解环境变量 1.2 获取用户名、主机名、当前路径 1.3 缓冲区改进MakeCommandLine 二、获取用户命令 2.1 读取函数的选择 2.2 细节优化 2.3 返回值 三、指令和选项分割 3.1 strtok 函数 3.2 分割实现 四、执行命令 4.1 fork 方法 4.2 进…

Qt C++ | Qt 元对象系统、信号和槽及事件(第一集)

01 元对象系统 一、元对象系统基本概念 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使用元…

蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录 前言 1. RTC介绍 2. 使用CubeMx进行源工程配置 3. 代码编程 3.1 准备工作 3.2 进行bsp_rtc.h编写 3.3 进行bsp_rtc.c编写 3.4 main.c编写 3.4.1 头文件引用 3.4.2 变量声明 3.4.3 子函数声明 3.4.4 函数实现 3.4.5 main函数编写 4. 代码实验 5. 总结 前言 因本人备赛蓝…

2024年购买阿里云服务器多少钱?100元-5000元预算

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

IntelliJ IDEA中文---强化智能编码与重构,提升开发效率

IntelliJ IDEA 2023是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它支持智能代码编辑、自动补全和重构&#xff0c;帮助开发者提高编码效率。同时&#xff0c;内置了丰富的调试工具&#xff0c;支持断点调试和变量监视&#xff…

STM32-04基于HAL库(CubeMX+MDK+Proteus)中断案例(按键中断扫描)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的按键检测代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在完成GPIO输入输出案例之后&#xff0c;开始新的功能…

2024阿里云老用户服务器优惠价格99元和199元

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

[RK356X_LINUX] 关于UMS功能电脑不显示盘符

问题描述 根据356x_linux\docs\Linux\ApplicationNote\Rockchip_Quick_Start_Linux_USB_Gadget_CN.pdf文档执行命令配置UMS功能。 虽然电脑端显示有UMS设备图标&#xff0c;但无盘符显示。 在执行/etc/init.d/S50usbdevice restart后会出现打印&#xff1a; Starting /usr/b…

MySQL数据库 数据库基本操作(二):表的增删查改(上)

1. CRUD CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写,就是数据库基本操作中针对表的一系列操作. 2. 新增(create) -->insert 语法: insert into 表名 [列名1,列名2…] values (val1,val2…) [注意] 列名可以没有,如果没有列名…

Delphi 是一种内存安全的语言吗?

上个月&#xff0c;美国政府发布了 "回到基石 "报告&#xff1a; 通往安全和可衡量软件之路 "的报告。该报告是美国网络安全战略的一部分&#xff0c;重点关注多个领域&#xff0c;包括内存安全漏洞和质量指标。 许多在线杂志都对这份报告进行了评论&#xff0…

跑mmdec(自用)

1. 准备工作 进服务器先conda activate openmmlab 如果没有conda初始化的话&#xff0c;要先 source ~/miniconda3/bin/activate 然后cd mmdetection进目录 2. 数据处理 把数据变成这样的格式

时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-BiLST…