【保姆级】Java后端查询数据库结果导出xlsx文件+打印xlsx表格
目录
- 前言
- 一、需求一:数据库查询的数据导出成Excel表格
- 1.1 Vue前端实现导出按钮+点击事件
- 1.2 后端根据数据库查询结果生成xlsx文件
- 二、需求二:对生成的xlsx文件调用打印机打印
- 2.1 Vue前端实现按钮+事件
- 2.2 后端实现打印
前言
最近在弄一个需求,需求如下:
需求一:Vue前端点击导出按钮,就可以将从数据库查出的数据导出成xlsx,即Excel表格形式
需求二:点击打印按钮,要将生成的xlsx文件启动进程,调用打印接口,实现打印,这是为了生成客户订单表,可以让机器直接打印
PS:想吐槽网上很多都复制粘贴的技术文章,找半天一点卵用都没用,这里记录一下自己解决方案,若转发请注明出处,原创不易,有问题可评论区留言
需求一效果预览
需求二预览
一、需求一:数据库查询的数据导出成Excel表格
1.1 Vue前端实现导出按钮+点击事件
<el-button type="success" round icon="el-icon-download" @click="exportByEasyPoi">导出</el-button>
对应按钮点击触发的exportByEasyPoi方法
,这里我用的是EasyPoi操作Excel,也挺多公司用的
注:前端是Vue2
<script>
import userApi from '@/api/userManage'
export default {methods: {exportByEasyPoi() {userApi.exportByEasyPoi().then(response => {this.$message.success('导出成功')})}}
}
</script>
这里我调用了src/api/userManage.js
,这是自己创建的js脚本,调用后端接口的
import request from '@/utils/request'export default {exportByEasyPoi() {return request({url: `/user/exportep`,method: 'get',timeout: '10000'})}
}
需求一前端就这么多了,接下来就是后端
1.2 后端根据数据库查询结果生成xlsx文件
首先导入EasyPoi相关依赖
<!--easypoi-->
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.3.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.3.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.3.0</version>
</dependency>
<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version>
</dependency>
下面先给出后端核心逻辑代码,后面会具体讲解,这里就不加篇幅,直接把逻辑代码写在Controller层,原本应该写在Service层,即xxxServiceImpl实现类中,这里为了方便,直接这么写下。
@Autowired
private IUserService userService;@GetMapping("/exportep")public Result<?> exportByEasyPoi(HttpServletResponse response) throws IOException {// mybatisplus实现的list(),拿到用户信息列表List<User> users = userService.list();List<ExcelUserVo> excelUserVos = BeanCopyUtils.copyBeanList(users, ExcelUserVo.class);// easypoi导出ExportParams params = new ExportParams();params.setTitle("测试");// 表格左下角的sheet名称params.setSheetName("用户信息");Workbook workbook = ExcelExportUtil.exportExcel(params, ExcelUserVo.class, excelUserVos);// 判断文件路径是否存在,并将信息写入文件try{// 文件夹是否存在,若没有对应文件夹直接根据路径生成文件会报错File folder = new File(Constants.XLSX_DIR);if (!folder.exists() && !folder.isDirectory()) {folder.mkdirs();}// 文件是否存在File file = new File(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME);if (!file.exists()){file.createNewFile();}// 输出流写入FileOutputStream outputStream = new FileOutputStream(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME);workbook.write(outputStream);// 关闭写,不然用户点击生成的文件会显示只读outputStream.close();workbook.close();}catch (IOException e){e.printStackTrace();}return Result.success("导出成功");}
ExcelUserVo.java
是自己需要显示在表格中的列,就是我们查询用户表,大部分时候不需要展示所有的属性到前端,挑需要显示的,所以封装成xxxVo,比如密码、创建时间、备注可以不显示在前端,不用打印就不要。
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("sys_user")
public class ExcelUserVo implements Serializable {@Excel(name = "用户id", width = 10)
// @ExcelIgnore // 表示忽略, 不在表格生成private Integer id;@Excel(name = "用户名", width = 20)private String username;@Excel(name = "邮箱", width = 30)private String email;@Excel(name = "电话", width = 30)private String phone;@Excel(name = "状态(1:正常,0:禁用)", width = 10)private Integer status;
}
BeanCopyUtils.java
是常用工具类,可以实现对象的拷贝,将两个对象中相同属性字段拷贝
import java.util.List;
import java.util.stream.Collectors;public class BeanCopyUtils {private BeanCopyUtils() {}/** 单个对象*/public static <V> V copyBean(Object source, Class<V> clazz) {/** 创建目标对象 实现属性拷贝*/V result = null;try {result = clazz.newInstance();/** 拷贝*/BeanUtils.copyProperties(source, result);} catch (Exception e) {e.printStackTrace();}return result;}/** 集合*/public static <O, V> List<V> copyBeanList(List<O> list, Class<V> clazz) {/** 创建目标对象 实现属性拷贝*/return list.stream().map(o -> copyBean(o, clazz)).collect(Collectors.toList());}
}
自定义常量Constants.java
,这里主要是定义输出路径
public class Constants {// excel表public static final String XLSX_DIR = "D:\\study\\excel";public static final String XLSX_NAME = "easypoi.xlsx";}
数据库sys_user表结构
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL,`password` varchar(100) DEFAULT NULL,`email` varchar(50) DEFAULT NULL,`phone` varchar(20) DEFAULT NULL,`status` int(1) DEFAULT NULL,`avatar` varchar(200) DEFAULT NULL,`deleted` int(1) DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、需求二:对生成的xlsx文件调用打印机打印
2.1 Vue前端实现按钮+事件
<el-button type="warning" round icon="el-icon-printer" @click="printExcel">打印</el-button>
methods: {printExcel() {userApi.printTable().then(response => {this.$message.success('请求打印成功')})}
}
userManage.js
中再写一个调用后端接口的
export default {printTable() {return request({url: `/user/print`,method: 'get',timeout: '100000'})}
}
2.2 后端实现打印
这里也干脆实现逻辑不写在Service层了,省点字,实际开发中还是要遵循规范哈
@GetMapping("/print")
public Result<?> printInfo(){try {String filepath = Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME;PrintUtil.print(filepath);} catch (Exception e) {e.printStackTrace();}return Result.success();
}
核心打印工具PrintUtil.java
,这个java文件稍微有点长
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;public class PrintUtil {/*** 竖屏模式*/public static OrientationRequested PORTRAIT = OrientationRequested.PORTRAIT;/*** 横屏模式*/public static OrientationRequested LANDSCAPE = OrientationRequested.LANDSCAPE;/*** 获取全部打印设备信息* @return 返回全部能用的打印服务的List*/public static List<PrintService> getDeviceList() {// 构建打印请求属性集HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();// 设置打印格式,因为未确定类型,所以选择autosenseDocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;// 查找所有的可用的打印服务PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);List<PrintService> list = Arrays.asList(printService);return list;}/*** 根据文件类型不同调用不同代码去打印* @param filePath 文件路径*/public static void print(String filePath) throws Exception {PrintService printService = PrintServiceLookup.lookupDefaultPrintService();String defaultDeviceName = printService.getName();print(filePath, defaultDeviceName);}/*** 额外传入一个 AfterPrint,会在打印完成后调用 afterPrint.run()* @param filePath* @param afterPrint* @throws Exception*/public static void print(String filePath, AfterPrint afterPrint) throws Exception {print(filePath);afterPrint.run();}/*** 根据文件类型不同调用不同代码去打印* @param filePath 文件路径* @param deviceName 设备名称,传入哪个设备的名称,就让哪个设备去打印*/public static void print(String filePath, String deviceName) throws Exception{List<PrintService> list = getDeviceList();PrintService printService = null;for (PrintService p : list) {if(p.getName().equals(deviceName)) {printService = p;break;}}if(printService == null) {throw new Exception("Device not found");}String type = filePath.replaceAll(".*\\.","");if("jpg".equalsIgnoreCase(type)) {normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.JPEG, printService);return;}if("jpeg".equalsIgnoreCase(type)) {normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.JPEG, printService);return;}if("gif".equalsIgnoreCase(type)) {normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.GIF, printService);return;}if("pdf".equalsIgnoreCase(type)) {printPDF(new File(filePath), DocFlavor.INPUT_STREAM.PNG, printService);return;}if("png".equalsIgnoreCase(type)) {normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.PNG, printService);return;}if("doc".equalsIgnoreCase(type)) {printWord(filePath, deviceName);return;}if("docx".equalsIgnoreCase(type)) {printWord(filePath, deviceName);return;}if("xls".equalsIgnoreCase(type)) {printExcel(filePath, deviceName);return;}if("xlsx".equalsIgnoreCase(type)) {printExcel(filePath, deviceName);return;}if("ppt".equalsIgnoreCase(type)) {printPPT(filePath, deviceName);return;}if("pptx".equalsIgnoreCase(type)) {printPPT(filePath, deviceName);return;}}/*** 会在打印完成后调用 afterPrint.run()* @param filePath* @param deviceName* @param afterPrint* @throws Exception*/public static void print(String filePath, String deviceName, AfterPrint afterPrint) throws Exception{print(filePath, deviceName);afterPrint.run();}/*** javase的打印机打印文件,支持jpg,png,gif,pdf等等* @param file 要打印的文件* @param flavor 打印格式*/private static void normalPrint(File file, DocFlavor flavor) {// 定位默认的打印服务PrintService service = PrintServiceLookup.lookupDefaultPrintService(); // 显示打印对话框normalPrint(file, flavor, service);}private static void normalPrint(File file, DocFlavor flavor, PrintService service) {normalPrint(file, flavor, PORTRAIT, service);}/*** javase的打印机打印文件,支持jpg,png,gif等等* @param file 要打印的文件* @param service 打印机选择* @param requested 设定横屏还是竖屏* @param flavor 打印格式*/private static void normalPrint(File file, DocFlavor flavor, OrientationRequested requested, PrintService service) {// 构建打印请求属性集HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();pras.add(requested);if (service != null) {try {DocPrintJob job = service.createPrintJob(); // 创建打印作业FileInputStream fis = new FileInputStream(file); // 构造待打印的文件流DocAttributeSet das = new HashDocAttributeSet();Doc doc = new SimpleDoc(fis, flavor, das);job.print(doc, pras);} catch (Exception e) {e.printStackTrace();}}}/*** 打印pdf的方法,因为java内置的打印pdf的方法有病,所以首先需要把pdf转换成png,然后打印png* @param file 要打印的文件* @param flavor 要打印的文件* @param service 打印设备*/private static void printPDF(File file, DocFlavor flavor, PrintService service) {try {PDDocument doc = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();for(int i=0;i<pageCount;i++){File f = new File(file.getParent() + File.separator + "temp_" + i + ".png");BufferedImage image = renderer.renderImageWithDPI(i, 96);ImageIO.write(image, "PNG", f);normalPrint(f, flavor, LANDSCAPE, service);f.delete();}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 打印机打印Word* @param filepath 打印文件路径* @param deviceName 传入哪个设备名称,用哪个设备打印*/private static void printWord(String filepath, String deviceName) {if(filepath.isEmpty()){return;}ComThread.InitSTA();//使用Jacob创建 ActiveX部件对象:ActiveXComponent word=new ActiveXComponent("Word.Application");//打开Word文档Dispatch doc=null;Dispatch.put(word, "Visible", new Variant(false));word.setProperty("ActivePrinter", new Variant(deviceName));Dispatch docs=word.getProperty("Documents").toDispatch();doc=Dispatch.call(docs, "Open", filepath).toDispatch();try {Dispatch.call(doc, "PrintOut");//打印} catch (Exception e) {e.printStackTrace();}finally{try {if(doc!=null){//关闭文档Dispatch.call(doc, "Close",new Variant(0));}} catch (Exception e2) {e2.printStackTrace();}word.invoke("Quit", new Variant[] {});//关闭进程//释放资源ComThread.Release();}}/*** 打印Excel* @param filePath 打印文件路径,形如 E:\\temp\\tempfile\\1494607000581.xls* @param deviceName 传入哪个设备名称,用哪个设备打印*/private static void printExcel(String filePath, String deviceName){if(filePath.isEmpty()){return;}ComThread.InitSTA();ActiveXComponent xl=new ActiveXComponent("Excel.Application");try {Dispatch.put(xl, "Visible", new Variant(true));Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();Dispatch excel=Dispatch.call(workbooks, "Open", filePath).toDispatch();Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),new Boolean(false), deviceName, new Boolean(true),Variant.VT_MISSING, ""});Dispatch.call(excel, "Close", new Variant(false));} catch (Exception e) {e.printStackTrace();} finally{xl.invoke("Quit",new Variant[0]);ComThread.Release();}}/*** 打印PPT* @param filePath* @param deviceName*/private static void printPPT(String filePath, String deviceName) {File file = new File(filePath);File pdfFile = new File(file.getParentFile().getAbsolutePath() + file.getName() + ".pdf");ActiveXComponent app = null;Dispatch ppt = null;try {ComThread.InitSTA();app = new ActiveXComponent("PowerPoint.Application");Dispatch ppts = app.getProperty("Presentations").toDispatch();ppt = Dispatch.call(ppts, "Open", filePath, true, true, false).toDispatch();Dispatch.call(ppt, "SaveAs", pdfFile.getAbsolutePath(), 32);} catch (Exception e) {e.printStackTrace();throw e;} finally {if (ppt != null) {Dispatch.call(ppt, "Close");}if (app != null) {app.invoke("Quit");}ComThread.Release();}try {print(pdfFile.getAbsolutePath(), deviceName);pdfFile.delete();} catch (Exception e) {e.printStackTrace();}}/*** 接口,在打印结束后调用*/public interface AfterPrint {void run();}
}
PrintUtil.java中依赖两个打印需要的非常重要包,jacob和pdfbox,下面给出免费链接,阿里云盘不限速的
链接:Java打印相关依赖包
下载后,需要导入一下,也十分简单,如图
然后运行后端,点击按钮就会有对应效果了,如果你没有打印机,会弹出生成PDF,有打印机连着,会使用默认打印机,或者通过PrintUtil中方法自定义打印机名称,选择打印机打印
以上就是全部内容,过程有啥问题可以评论区和大家一起交流!
相关文章:
【保姆级】Java后端查询数据库结果导出xlsx文件+打印xlsx表格
目录前言一、需求一:数据库查询的数据导出成Excel表格1.1 Vue前端实现导出按钮点击事件1.2 后端根据数据库查询结果生成xlsx文件二、需求二:对生成的xlsx文件调用打印机打印2.1 Vue前端实现按钮事件2.2 后端实现打印前言 最近在弄一个需求,需…...
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
文章目录1 JDBC(Java Database Connectivity)1.1 什么是 JDBC?1.2 JDBC 核心思想2 JDBC开发步骤【重点】2.0 环境准备2.1 注册数据库驱动2.2 获取数据库的连接2.3 获取数据库操作对象Statement2.4 通过Statement对象执行SQL语句2.5 处理返回结…...
vue3生命周期
一、Vue3中的生命周期 1、setup() : 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method 2、onBeforeMount() : 组件挂载到节点上之前执行的函数; 3、onMounted() : 组件挂载完成后执行的函数; 4、…...
Python学习笔记10:开箱即用
开箱即用 模块 python系统路径 import sys, pprint pprint.pprint(sys.path) [,D:\\Program Files\\Python\\Lib\\idlelib,D:\\Program Files\\Python\\python310.zip,D:\\Program Files\\Python\\DLLs,D:\\Program Files\\Python\\lib,D:\\Program Files\\Python,D:\\Progr…...
详解JAVA反射
目录 1.概述 2.获取Class对象 3.API 3.1.实例化对象 3.2.方法 3.3.属性 1.概述 反射,JAVA提供的一种在运行时获取类的信息并动态操作类的能力。JAVA反射允许我们在运行时获取类的属性、方法、构造函数等信息,并能够动态地操作它们。 2.获取Class…...
在nestjs中进行typeorm cli迁移(migration)的配置
在nestjs中进行typeorm cli迁移(migration)的配置 在学习nestjs过程中发现typeorm的迁移配置十分麻烦,似乎许多方法都是旧版本的配置,无法直接使用. 花了挺长时间总算解决了这个配置问题. db.config.ts 先创建db.config.ts, 该文件export了两个对象,其…...
前端工程构建问题汇总
1.less less-loader安装失败问题 npm install less-loader --save --legacy-peer-deps 加上–legacy-peer-deps就可以了 在NPM v7中,现在默认安装peerDependencies,这会导致版本冲突,从而中断安装过程。 –legacy-peer-deps标志是在v7中引…...
某马程序员NodeJS速学笔记
文章目录前言一、什么是Node.js?二、fs文件系统模块三、Http模块四、模块化五、开发属于自己的包模块加载机制六、Express1.初识ExpressGET/POSTnodemon2.路由模块化3.中间件中间件分类自定义中间件4. 跨域问题七、Mysql模块安装与配置基本使用Web开发模式Session认证JWT八、m…...
SpringMVC DispatcherServlet源码(6) 完结 静态资源原理
阅读源码,分析静态资源处理器相关组件: 使用SimpleUrlHandlerMapping管理url -> 处理器映射关系spring mvc使用WebMvcConfigurationSupport注入SimpleUrlHandlerMapping组件DelegatingWebMvcConfiguration可以使用WebMvcConfigurer的配置静态资源url…...
2023年全国最新会计专业技术资格精选真题及答案9
百分百题库提供会计专业技术资格考试试题、会计考试预测题、会计专业技术资格考试真题、会计证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 四、材料题 1.某企业为增值税一般纳税人,2019年12月初“应付职工薪酬…...
Web3中文|把Web3装进口袋,Solana手机Saga有何魔力?
2月23日,Solana Web3手机Saga发布新的消息,将推出NFT铸造应用程序Minty Fresh。在Minty Fresh,用户仅需轻点并完成拍摄,就可以直接在手机中进行NFT铸造,并在几秒钟内将其转换为链上NFT,NFT还可以发布在 Ins…...
【配电网优化】基于串行和并行ADMM算法的配电网优化研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
数据结构初阶 -- 顺序表
数据结构初阶 链表的讲解 目录 一. 线性表 1.1 定义 1.2 特点 二. 顺序表 2.1 定义 2.2 代码 2.3 功能需求 2.4 静态顺序表的特点以及缺点 2.5 动态的顺序表 2.6 动态顺序表接口的实现 三. 代码 头文件 主文件 一. 线性表 1.1 定义 线性表(linear li…...
uniapp:3分钟搞定在线推送uni.createPushMessage,uni.onPushMessage
安卓端 在线推送功能演示: 1、dcloud后台申请开通uniPush dcloud后台 (1):找到我的应用 (2):点进去后,各平台信息,点击新增 (3):填…...
C/C++开发,无可避免的多线程(篇一).跨平台并行编程姗姗来迟
一、编译环境准备 在正式进入c/c多线程编程系列之前,先来搭建支持多线程编译的编译环境。 1.1 MinGW(win) 进入Downloads - MinGW-w64下载页面,选择MinGW-w64-builds跳转下载, 再次进行跳转: 然后进入下载页…...
如何把照片的底色修改为想要的颜色
如何给照片更换底色?其实有可以一键给照片更换底色的 APP ,但是几乎都要收费。如果想要免费的给照片更换底色的话,分享两种简单便捷的方法给你。掌握了这项技能,以后就不用店花钱处理啦!1、免费!线上快速 给…...
【高效办公】批量生成固定模板的文件夹名称
老师让你按照他的要求生成每位学生的文件夹,你是学委,让你马上完成该任务,但你又不想是手动一个一个码字,因此聪明的你就看到了本篇文章啦!!! 虽说一个人懒惰,并不是好的事情。 但这个似乎合情合理啊~ 然后,就动手想办法,一开始就真的打算码字了。。 思路 在实际开…...
redis的集群方式
1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 主服务器BGSAVE执行完后,向所有从服务…...
温控负荷的需求响应潜力评估及其协同优化管理研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
模电学习9. MOS管使用入门
模电学习9. MOS管使用入门一、mos管理简介1. 简介2. mos管理的特点3. MOS管的工作状态(1)放大功能(2)截止区(3)饱和区3. Mos管的分类(1)按照工作模式分类:(2&…...
【算法】【数组与矩阵模块】正数组中累加和为给定值的最长子数组长度,空间复杂度O(1)解法
目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 …...
3.1.2 创建表
文章目录1.创建表2.表创建基础3.表的主键4.使用null值5.使用AUTO_INCREMENT6.指定默认值7. 字段备注8.引擎类型9.外键1.创建表 表的创建一般有俩种方式,一种是使用交互式创建和管理表的工具,比如我们安装的MariaDB,另一种是使用MySQL 语句进…...
使用netlify实现自动化部署前端项目(无服务器版本)
介绍 本文以 github仓库进行介绍关联netlify的无服务前端自动化部署。用途:个人网站设计、小游戏等当然这只是让你入门~具体细节等待你自己去探索 实现 打开官方网站 如果没有注册过的账户,你需要使用 github 去进行登录。注册完成后会自动给你提示填…...
MATLAB点云数据处理(二十九):可视化点云之pcshow参数详解与快捷键操作
文章目录 1 pcshow简述2 最简单的pcshow3 带参数的pcshow3.1 点大小参数----MakerSize3.2 背景色参数----Background3.3 指定竖直轴参数----VerticalAxis3.4 指定垂直轴方向参数----VerticalAxisDir3.5 投影参数----Projection3.6 指定可视化平面参数----ViewPlane3.7 颜色渲染…...
顺序表——重置版
本期我们来实现数据结构的顺序表(这个之前写过一次,不过本期和之前可能会略有不同,但大体相同),大家可以看一下我们之前完成的顺序表 (6条消息) 顺序表及其多种接口的实现_顺序表类中实现接口方法_KLZUQ的博客-CSDN博客…...
PyQt5自然语言处理入门案例笔记
前言 最近想将自然语言处理的项目进行可视化,尽量还是使用回Python语言,因此打算用PyQt来实现相应的功能。 入门案例 一个简单的自然语言处理的demo,使用PyQt框架,该demo可以读取文本文件,对文件中的文本进行情感分…...
使用 CSS 替换表行颜色?
跳到主内容 我正在使用一个带有交替行颜色的表格。 tr.d0 td {background-color: #CC9999;color: black; } tr.d1 td {background-color: #9999CC;color: black; }<table><tr class"d0"><td>One</td><td>one</td></tr>&…...
智能家居控制系统
🥁作者: 华丞臧. 📕专栏:【项目经验】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站…...
Linux 进程:fork()与vfork()的对比
目录一、fork函数二、vfork函数1.函数的原理2.函数的隐患3.解决函数隐患的方法在Linux的进程学习中,常使用fork函数来创建子进程,但其实还有一个vfork函数也可以创建子进程。但是这两个函数的实现机制不同,fork函数使用了写实拷贝技术&#x…...
环境搭建02-Ubuntu16.04 安装CUDA和CUDNN、CUDA多版本替换
1、CUDA安装 (1)下载需要的CUDA版本 https://developer.nvidia.com/cuda-toolkit-archive (2)安装 sudo sh cuda_8.0.61_375.26_linux.run(3)添加环境 gedit ~/.bashrc在文件末尾添加: ex…...
越南网站怎么做/seo实战密码
前言 PowerShell是为系统管理员设计的基于任务的自动化命令行外壳(Shell)和相关脚本环境。 它建立在.NET框架上。 它是比命令提示符(cmd)强大的命令行解释器,可以解释PowerShell和批处理命令。 powershell一直都是内网渗透的大热门,微软是真正的在推行…...
wordpress格式/网络营销推广
yield,可以使线程放手一下CPU。然后再抓!放一下手,就可以让后面的线程先上了CPU。 例子: public class TestYield {public static void main(String[] args) {MyThread3 t1 new MyThread3("t1");MyThread3 t2 new MyThread3("…...
做微博推广的网站/什么是seo营销
Sub 宏1()Sheets("无汇总").Select End Sub...
购物网站asp源码/营销策划与运营团队
如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历…...
合肥制作企业网站/西地那非片能延时多久每次吃多少
在virtual的知识里摸爬滚打好几天,最近大脑有些不够用了,现在整理一下 非考虑内存对齐时各个结构的大致模型 至于考绿内存的在前面几张已经叙述过了,为了方便,我再纸上画了整体的流程,, 内存分配要注意对齐…...
百度右侧相关网站/全球最牛的搜索引擎
2019独角兽企业重金招聘Python工程师标准>>> 一、jQuery fadeIn() 用于淡入已隐藏的元素。 <!DOCTYPE html> <html> <head> <script src"/jquery/jquery-1.11.1.min.js"></script> <script> $(document).ready(func…...