WPS JS宏编程教程(从基础到进阶)-- 第七部分:JS对象在WPS中的应用
目录
- 第7章 JS对象在WPS中的应用
- 7-1 对象创建的几种方法
- 从零理解对象:数据收纳盒
- 两种基础创建方式
- 代码解析表
- 7-2 对象属性的查、改、增、删
- 像操作Excel单元格一样管理属性
- 1. 点操作符(静态键名)
- 2. 中括号操作符(动态键名)
- 动态属性应用场景
- 7-3 循环对象中的属性
- 批量操作:像筛选行一样遍历对象
- 方法对比表
- 实战:将对象写入Excel
- 7-4 实例1:提取各项目最后1条记录
- 场景:抓取最新数据
- 原始数据示例
- 代码实现
- 代码解析表
- 输出结果
- 7-5 实例2:提取各项目第1条记录
- 场景:记录首次出现的数据
- 原始数据(同7-4)
- 代码实现
- 代码解析表
- 输出结果
- 7-6 实例3:按指定字段汇总数据
- 场景:快速统计分组总和
- 原始数据(同7-4)
- 代码实现
- 代码解析表
- 输出结果
- 7-7 实例4:按指定字段做多种汇总
- 场景:多维数据统计
- 原始数据(扩展版)
- 代码实现
- 代码解析表
- 输出结果
- 7-8 实例5:按多字段做多种汇总
- 场景:复合条件分析
- 原始数据(同7-7)
- 代码实现
- 代码解析表
- 输出结果
- 7-9 实例6:按条件读取多表再拆成多表
- 场景:跨表数据整合
- 原始数据(假设有3个月份表)
- 代码实现
- 代码解析表
- 输出效果
- 7-10 实例7:拆分单表到多工作簿下的多表
- 场景:数据分库存储
- 原始数据
- 代码实现
- 代码解析表
- 生成文件示例
- 7-11 对象的属性值为函数用法
- 场景:封装工具方法
- 案例:颜色管理器
- 方法说明表
- 执行效果
- 7-12 用构造函数自定义类-1
- 场景:标准化数据处理
- 订单处理类
- 类结构解析表
- 输入输出示例
- 7-13 用构造函数自定义类-2
- 场景:动态数据容器
- 销售分析器类
- 方法参数说明
- 7-14 用class构造自定义类-3
- 场景:现代化代码封装
- 类定义:销售统计器
- 代码解析表
- 使用示例
- 7-15 实例8:自定义关于[唯一性]的类
- 场景:数据去重与可视化
- 类设计:唯一值处理器
- 使用演示
- 输入输出示例
- 7-16 实例8: [唯一性]类的应用
- 场景:跨表数据整合
- 扩展应用:跨表处理器
- 使用示例
- 输入输出示例
- 本章小结
所有章节教程word文件可以点击如下链接获取
wps-excel办公+JS宏编程教程基础到进阶+函数使用手册
第7章 JS对象在WPS中的应用
7-1 对象创建的几种方法
从零理解对象:数据收纳盒
想象一下,对象就像是一个多层的收纳盒,每个抽屉(属性)可以存放不同类型的东西——数字、文本、公式,甚至另一个收纳盒(嵌套对象)。在WPS表格中,用对象管理数据能让代码更清晰。
两种基础创建方式
-
空盒子起手
用new Object()
或字面量{}
创建一个空对象,适合逐步填充数据:// 方法1:构造函数 var student = new Object();// 方法2:字面量(更常用) var product = {};
-
预装数据的盒子
初始化时直接定义属性,适合固定结构的数据:var order = {id: "202309001", // 字符串items: ["笔记本", "鼠标"], // 数组total: 599.99, // 数字isValid: true, // 布尔值getDiscount: function() { // 函数return this.total * 0.9;} };
代码解析表
行号 | 代码片段 | 作用说明 | 输入/输出示例 |
---|---|---|---|
2 | var student = new Object(); | 创建空对象 | student 初始为空 |
5 | id: "202309001" | 添加字符串类型属性 | order.id 返回"202309001" |
6 | items: ["笔记本", "鼠标"] | 添加数组类型属性 | order.items[0] 返回"笔记本" |
9 | getDiscount: function() | 定义方法:计算9折价格 | order.getDiscount() 返回539.99 |
7-2 对象属性的查、改、增、删
像操作Excel单元格一样管理属性
对象属性操作类似表格中的单元格——可随时读取、修改、删除。关键在于灵活使用两种操作符:
1. 点操作符(静态键名)
- 适合已知属性名:直接通过
.
访问// 读取 console.log(order.id); // 输出"202309001"// 修改 order.total = 699.99; // 总价更新为699.99// 删除 delete order.isValid; // 移除是否有效标识
2. 中括号操作符(动态键名)
- 适合变量或特殊字符:
var key = "total"; console.log(order[key]); // 输出699.99// 添加带空格的属性 order["delivery address"] = "北京市朝阳区";
动态属性应用场景
假设需要根据单元格A1的值动态读取属性:
var cellValue = Range("A1").Value();
var data = {January: 1500,February: 2300
};
console.log(data[cellValue]); // 若A1是"February",输出2300
7-3 循环对象中的属性
批量操作:像筛选行一样遍历对象
当需要处理对象中的所有属性时,三种方法轻松实现遍历:
方法对比表
方法 | 作用 | 示例 | 输出示例 |
---|---|---|---|
Object.keys(obj) | 获取所有属性名 | Object.keys(order) | ["id", "items", "total", ...] |
Object.values(obj) | 获取所有属性值 | Object.values(order) | ["202309001", Array, 699.99, ...] |
Object.entries(obj) | 获取键值对数组 | Object.entries(order) | [["id", "202309001"], ["total", 699.99], ...] |
实战:将对象写入Excel
var sales = {产品A: 1200,产品B: 980,产品C: 1560
};// 写入A列(产品名)和B列(销售额)
var row = 1;
Object.entries(sales).forEach(([product, amount]) => {Cells(row, 1).Value2 = product; // A列Cells(row, 2).Value2 = amount; // B列row++;
});
7-4 实例1:提取各项目最后1条记录
场景:抓取最新数据
假设有一个不断更新的销售记录表,需要提取每个客户的最后一次交易数据。对象可以像“实时监控器”一样,始终保留最新值。
原始数据示例
姓名 | 销售额 | 时间 |
---|---|---|
张三 | 1500 | 2023-09-01 |
李四 | 800 | 2023-09-02 |
张三 | 2000 | 2023-09-03 |
王五 | 1200 | 2023-09-04 |
代码实现
function 提取最后记录() {var data = Range("A2:C5").Value(); // 读取原始数据var latestData = {}; // 空对象存储最新记录// 遍历每一行数据data.forEach(row => {var name = row[0]; // 提取姓名(A列)latestData[name] = row.slice(1); // 更新为当前行的数据});// 将对象转为数组并写入新区域var output = Object.entries(latestData).map(([key, val]) => [key, ...val]);Range("E2").Resize(output.length, 3).Value2 = output;
}
代码解析表
行号 | 代码片段 | 作用说明 | 数据变化示例 |
---|---|---|---|
2 | var data = Range("A2:C5") | 读取A2:C5区域数据 | 数据格式:二维数组 |
5 | latestData[name] = row.slice(1) | 用姓名作为键,覆盖存储最新数据 | 张三最终对应[2000, "2023-09-03"] |
9 | Object.entries(latestData) | 将对象转为键值对数组 | [ ["张三", [2000, "2023-09-03"]], ... ] |
10 | Range("E2").Resize(...) | 将结果写入E2开始的区域 | E列显示姓名,F列销售额,G列时间 |
输出结果
E | F | G |
---|---|---|
张三 | 2000 | 2023-09-03 |
李四 | 800 | 2023-09-02 |
王五 | 1200 | 2023-09-04 |
7-5 实例2:提取各项目第1条记录
场景:记录首次出现的数据
需要统计每个客户的首次交易信息,类似在Excel中标记“首次出现”的筛选功能。
原始数据(同7-4)
代码实现
function 提取第一条记录() {var data = Range("A2:C5").Value();var firstData = {}; // 存储首次记录var counter = 1; // 序号生成器data.forEach(row => {var name = row[0];if (!firstData[name]) { // 仅当不存在时存储firstData[name] = [counter++, ...row.slice(1)]; // 添加序号}});// 转换并写入结果var output = Object.values(firstData);Range("E2").Resize(output.length, 4).Value2 = output;
}
代码解析表
行号 | 代码片段 | 作用说明 | 关键逻辑 |
---|---|---|---|
5 | if (!firstData[name]) | 检查是否已存在该姓名的记录 | 李四首次出现时条件为true |
6 | counter++ | 自增序号生成 | 生成唯一序号:1,2,3… |
6 | ...row.slice(1) | 展开数组元素 | 将[1500, "2023-09-01"] 转为独立元素 |
输出结果
E | F | G | H |
---|---|---|---|
1 | 张三 | 1500 | 2023-09-01 |
2 | 李四 | 800 | 2023-09-02 |
3 | 王五 | 1200 | 2023-09-04 |
7-6 实例3:按指定字段汇总数据
场景:快速统计分组总和
类似Excel的“SUMIF”函数,但用对象实现动态聚合。
原始数据(同7-4)
代码实现
function 按姓名汇总() {var data = Range("A2:C5").Value();var sumData = {}; // 用对象存储累加结果data.forEach(row => {var name = row[0];var amount = row[1];// 累加逻辑:如果存在则加,否则初始化sumData[name] = (sumData[name] || 0) + amount;});// 转为二维数组并写入var output = Object.entries(sumData);Range("E2").Resize(output.length, 2).Value2 = output;
}
代码解析表
行号 | 代码片段 | 作用说明 | 数学过程示例 |
---|---|---|---|
6 | sumData[name] = (...) | 累加逻辑 | 张三:1500 → 1500+2000=3500 |
9 | Object.entries(sumData) | 转换为[["张三", 3500], ...] | 直接适配单元格写入格式 |
输出结果
E | F |
---|---|
张三 | 3500 |
李四 | 800 |
王五 | 1200 |
7-7 实例4:按指定字段做多种汇总
场景:多维数据统计
需要同时计算每个产品的销售额总和、最大值和平均值,类似Excel的数据透视表功能。
原始数据(扩展版)
产品 | 销售额 | 月份 |
---|---|---|
手机 | 12000 | 1月 |
笔记本 | 9800 | 1月 |
手机 | 15000 | 2月 |
耳机 | 3000 | 2月 |
笔记本 | 11500 | 3月 |
代码实现
function 多维统计() {var data = Range("A2:C6").Value();var statData = {}; // 存储统计数据的对象data.forEach(row => {var product = row[0];var amount = row[1];// 初始化或更新统计数据if (!statData[product]) {statData[product] = {total: 0,max: -Infinity,count: 0};}// 更新统计值statData[product].total += amount;statData[product].max = Math.max(statData[product].max, amount);statData[product].count++;});// 生成输出数组var output = Object.entries(statData).map(([product, data]) => [product,data.total,data.max,data.total / data.count]);// 写入结果Range("E2").Resize(output.length, 4).Value2 = output;
}
代码解析表
行号 | 代码片段 | 作用说明 | 数据结构示例 |
---|---|---|---|
4 | var statData = {} | 初始化空对象存储统计结果 | { 手机: {total:0, max:0, count:0} } |
9-15 | if (!statData[product]) | 初始化新产品的统计容器 | 首次遇到"耳机"时创建新键 |
18 | statData[product].total += | 累加销售额 | 手机:12000+15000=27000 |
24 | Object.entries(statData) | 将对象转为[["手机", {...}], ...] | 便于映射为表格数据 |
输出结果
E | F | G | H |
---|---|---|---|
手机 | 27000 | 15000 | 13500 |
笔记本 | 21300 | 11500 | 10650 |
耳机 | 3000 | 3000 | 3000 |
7-8 实例5:按多字段做多种汇总
场景:复合条件分析
需要按"产品+月份"组合统计数据,类似Excel中的多级分类汇总。
原始数据(同7-7)
代码实现
function 复合键统计() {var data = Range("A2:C6").Value();var statData = {}; // 存储复合键统计结果data.forEach(row => {var product = row[0];var month = row[2];var amount = row[1];var key = product + "|" + month; // 构建复合键// 初始化或更新统计if (!statData[key]) {statData[key] = {total: 0,transactions: []};}statData[key].total += amount;statData[key].transactions.push(amount);});// 生成输出数组var output = Object.entries(statData).map(([key, data]) => {var [product, month] = key.split("|");return [product,month,data.total,Math.max(...data.transactions),data.transactions.length];});// 写入结果Range("E2").Resize(output.length, 5).Value2 = output;
}
代码解析表
行号 | 代码片段 | 作用说明 | 关键技巧 |
---|---|---|---|
6 | `var key = product + " | " + month` | 构建复合键 |
15 | transactions.push(amount) | 存储明细数据 | 保留原始交易记录供后续分析 |
21 | `key.split(" | ")` | 拆分复合键 |
输出结果
E | F | G | H | I |
---|---|---|---|---|
手机 | 1月 | 12000 | 12000 | 1 |
笔记本 | 1月 | 9800 | 9800 | 1 |
手机 | 2月 | 15000 | 15000 | 1 |
耳机 | 2月 | 3000 | 3000 | 1 |
笔记本 | 3月 | 11500 | 11500 | 1 |
7-9 实例6:按条件读取多表再拆成多表
场景:跨表数据整合
从多个工作表中提取数据,按指定条件合并后重新拆分到新表。
原始数据(假设有3个月份表)
1月表:
产品 | 销售额 |
---|---|
手机 | 12000 |
笔记本 | 9800 |
2月表:
产品 | 销售额 |
---|---|
手机 | 15000 |
耳机 | 3000 |
代码实现
function 跨表合并拆分() {var mergedData = {}; // 存储合并后的数据var sheets = ["1月", "2月", "3月"]; // 目标工作表名sheets.forEach(sheetName => {var sheet = Sheets(sheetName);var data = sheet.Range("A2:B" + sheet.Range("A1").End(xlDown).Row).Value();data.forEach(row => {var product = row[0];if (!mergedData[product]) {mergedData[product] = [];}mergedData[product].push([sheetName, row[1]]); // 添加月份数据});});// 创建新工作簿写入数据var newWb = Workbooks.Add();Object.entries(mergedData).forEach(([product, data]) => {var ws = newWb.Sheets.Add();ws.Name = product;ws.Range("A1").Value2 = ["月份", "销售额"];ws.Range("A2").Resize(data.length, 2).Value2 = data;});
}
代码解析表
行号 | 代码片段 | 作用说明 | 动态特性 |
---|---|---|---|
6 | sheet.Range("A1").End(xlDown) | 动态获取数据末尾行 | 适应不同月份数据量变化 |
11 | mergedData[product].push(...) | 按产品聚合各月数据 | 手机数据包含1月、2月记录 |
17 | newWb.Sheets.Add() | 动态创建工作表 | 每个产品独立工作表 |
输出效果
手机表:
月份 | 销售额 |
---|---|
1月 | 12000 |
2月 | 15000 |
耳机表:
月份 | 销售额 |
---|---|
2月 | 3000 |
7-10 实例7:拆分单表到多工作簿下的多表
场景:数据分库存储
将一张包含全国各城市销售数据的总表,按省份拆分为独立工作簿(每个省份一个文件),适合数据分发场景。
原始数据
城市 | 省份 | 销售额 |
---|---|---|
杭州市 | 浙江 | 15000 |
温州市 | 浙江 | 9800 |
南京市 | 江苏 | 22000 |
苏州市 | 江苏 | 16500 |
广州市 | 广东 | 31800 |
代码实现
function 按省份拆分工作簿() {var mainData = Range("A2:C6").Value(); // 读取源数据var provinceData = {}; // 按省份分组存储// 数据分组mainData.forEach(row => {var province = row[1];if (!provinceData[province]) {provinceData[province] = [];}provinceData[province].push(row);});// 创建独立工作簿Object.entries(provinceData).forEach(([province, data]) => {var newWb = Workbooks.Add(); // 新建工作簿var ws = newWb.ActiveSheet;ws.Name = province + "销售数据";// 写入表头和内容ws.Range("A1:C1").Value2 = [["城市", "省份", "销售额"]];ws.Range("A2").Resize(data.length, 3).Value2 = data;// 保存文件var path = ThisWorkbook.Path + "\\" + province + ".xlsx";newWb.SaveAs(path);newWb.Close();});
}
代码解析表
行号 | 代码片段 | 作用说明 | 关键逻辑 |
---|---|---|---|
5 | var province = row[1] | 提取省份字段(B列) | 浙江/江苏/广东作为分组依据 |
8 | provinceData[province].push | 按省份归类数据 | 所有浙江数据存入同一个数组 |
15 | newWb = Workbooks.Add() | 为每个省份创建独立工作簿 | 内存中生成新文件 |
20 | path = ThisWorkbook.Path... | 生成保存路径 | 文件保存在原文档相同目录 |
生成文件示例
浙江.xlsx内容:
A | B | C |
---|---|---|
城市 | 省份 | 销售额 |
杭州 | 浙江 | 15000 |
温州 | 浙江 | 9800 |
7-11 对象的属性值为函数用法
场景:封装工具方法
将常用功能(如格式设置、计算逻辑)封装为对象方法,实现代码复用。
案例:颜色管理器
// 定义工具对象
var formatTool = {// 设置单元格背景色(输入范围对象,输出无)setColor: function(rng, colorIndex) {rng.Interior.ColorIndex = colorIndex;},// 生成随机颜色值(输入无,输出数字)randomColor: function() {return Math.floor(Math.random() * 56) + 1;}
};// 应用示例
function 随机着色() {var dataRng = Range("A2:C6");formatTool.setColor(dataRng, formatTool.randomColor());
}
方法说明表
方法名 | 输入参数 | 输出类型 | 示例调用 |
---|---|---|---|
setColor | Range对象, 颜色索引值 | 无 | setColor(Range("A1"), 3) |
randomColor | 无 | 数字 | var c = randomColor() → 生成5 |
执行效果
- A2:C6区域背景色变为随机索引色(1-56)
7-12 用构造函数自定义类-1
场景:标准化数据处理
创建可复用的数据处理器类,统一管理同类操作。
订单处理类
// 定义构造函数
function OrderProcessor(sheetName) {// 属性初始化this.sheet = Sheets(sheetName);this.dataRange = this.sheet.UsedRange;// 方法:获取总销售额this.getTotalSales = function() {return this.dataRange.Columns(3).Value().flat().reduce((a,b) => a + b);};
}// 使用示例
function 处理订单() {var processor = new OrderProcessor("订单表"); // 实例化对象console.log("总销售额:" + processor.getTotalSales());
}
类结构解析表
组件 | 代码片段 | 作用说明 |
---|---|---|
构造函数 | function OrderProcessor() | 接收表名参数并初始化 |
属性 | this.sheet | 存储工作表对象 |
方法 | this.getTotalSales | 计算第三列总和 |
输入输出示例
- 输入:
new OrderProcessor("订单表")
- 输出方法:
getTotalSales()
返回数值如150000
7-13 用构造函数自定义类-2
场景:动态数据容器
构建支持动态分析的数据模型,适合实时计算场景。
销售分析器类
function SalesAnalyzer(dataRange) {// 初始化数据this.rawData = dataRange.Value();// 方法:按产品过滤this.filterByProduct = function(product) {return this.rawData.filter(row => row[0] === product);};// 方法:计算平均值this.getAverage = function() {var values = this.rawData.map(row => row[1]);return values.reduce((a,b) => a + b) / values.length;};
}// 使用示例
function 分析数据() {var analyzer = new SalesAnalyzer(Range("A2:B10"));var phoneData = analyzer.filterByProduct("手机");console.log("手机平均销售额:" + analyzer.getAverage());
}
方法参数说明
方法名 | 输入类型 | 输出类型 | 示例 |
---|---|---|---|
filterByProduct | 字符串(产品名) | 二维数组 | filterByProduct("手机") |
getAverage | 无 | 数字 | 输出如13500 |
7-14 用class构造自定义类-3
场景:现代化代码封装
ES6的class
语法让面向对象编程更直观,适合构建复杂工具。我们将重构7-13节的销售分析器,体验现代语法优势。
类定义:销售统计器
class SalesAnalyzer {constructor(dataRange) {// 初始化数据源this.rawData = dataRange.Value();}// 方法1:按产品过滤数据filterByProduct(product) {return this.rawData.filter(row => row[0] === product);}// 方法2:计算平均值(保留两位小数)getAverage() {const sum = this.rawData.map(row => row[1]).reduce((a, b) => a + b);return Number(sum / this.rawData.length).toFixed(2);}// 方法3:生成统计报告generateReport() {return `共${this.rawData.length}条数据,平均销售额:${this.getAverage()}`;}
}
代码解析表
代码片段 | 作用说明 | 与传统构造函数对比优势 |
---|---|---|
class SalesAnalyzer | 声明类 | 结构更清晰,接近Java/C#语法 |
constructor(dataRange) | 初始化方法 | 替代function SalesAnalyzer() |
filterByProduct() | 类方法定义 | 无需this. 前缀,直接写函数名 |
toFixed(2) | 保留两位小数 | 避免浮点数精度问题 |
使用示例
function 生成分析报告() {const analyzer = new SalesAnalyzer(Range("A2:B10")); // 输入数据区域console.log(analyzer.generateReport()); // 输出:共9条数据,平均销售额:13500.00
}
7-15 实例8:自定义关于[唯一性]的类
场景:数据去重与可视化
需要为表格中的唯一值自动着色(如分类标识),并通过类封装实现复用。
类设计:唯一值处理器
class UniqueValueProcessor {constructor(targetRange) {this.range = targetRange; // 存储目标区域this.uniqueValues = []; // 存储唯一值列表}// 方法1:提取唯一值extractUniqueValues() {const allValues = this.range.Value().flat();this.uniqueValues = [...new Set(allValues)]; // Set去重}// 方法2:为唯一值随机着色colorizeUniqueValues() {this.uniqueValues.forEach(value => {const color = Math.floor(Math.random() * 56) + 1; // 1-56号颜色this.range.Cells.Find(value).Interior.ColorIndex = color;});}
}
使用演示
function 处理唯一值() {const processor = new UniqueValueProcessor(Range("B2:B10")); // 输入分类列processor.extractUniqueValues(); // 提取唯一值processor.colorizeUniqueValues(); // 着色单元格
}
输入输出示例
-
输入数据(B列):
分类 电子产品 服装 食品 电子产品 -
执行结果:
uniqueValues
数组:["电子产品", "服装", "食品"]
- B列中每个分类显示不同背景色
7-16 实例8: [唯一性]类的应用
场景:跨表数据整合
将多个工作表中相同列的唯一值汇总,并生成全局统计报告。
扩展应用:跨表处理器
class CrossSheetUniqueProcessor {constructor(sheetNames, columnIndex) {this.sheets = sheetNames; // 工作表名数组this.column = columnIndex; // 要处理的列号(从1开始)this.globalUniqueSet = new Set(); // 存储全局唯一值}// 方法:遍历所有表提取唯一值collectAllUniqueValues() {this.sheets.forEach(sheetName => {const sheet = Sheets(sheetName);const range = sheet.Columns(this.column);const values = range.Value().flat();values.forEach(v => this.globalUniqueSet.add(v));});}// 方法:生成汇总报告generateReport() {const reportSheet = Sheets.Add();reportSheet.Name = "唯一值汇总";const uniqueArray = [...this.globalUniqueSet];reportSheet.Range("A1").Resize(uniqueArray.length, 1).Value2 = uniqueArray;}
}
使用示例
function 跨表汇总() {const processor = new CrossSheetUniqueProcessor(["1月", "2月", "3月"], 2); // 处理各表B列processor.collectAllUniqueValues(); // 收集数据processor.generateReport(); // 生成汇总表
}
输入输出示例
-
输入表结构(各月表B列):
1月表 2月表 笔记本电脑 智能手机 智能手机 耳机 -
输出结果(汇总表A列):
唯一值汇总 笔记本电脑 智能手机 耳机
本章小结
通过对象和类,我们实现了:
- 数据封装:将复杂操作隐藏在类内部
- 代码复用:通过实例化重复使用逻辑
- 可维护性:修改类定义即可影响所有调用处
尝试用面向对象思维设计你的下一个WPS宏项目吧!
相关文章:
WPS JS宏编程教程(从基础到进阶)-- 第七部分:JS对象在WPS中的应用
目录 第7章 JS对象在WPS中的应用7-1 对象创建的几种方法从零理解对象:数据收纳盒两种基础创建方式代码解析表 7-2 对象属性的查、改、增、删像操作Excel单元格一样管理属性1. 点操作符(静态键名)2. 中括号操作符(动态键名…...
网络编程(UDP)
server:服务器 # import socket # # 传递udp协议参数 # sk socket.socket(typesocket.SOCK_DGRAM) # # # 绑定ip及端口 # sk.bind(("127.0.0.1",8080)) # # print("等待客户端发送消息") # # # 直接发送 # msg,addr sk.recvfrom(1024) # # print(msg.d…...
深入讲解 CSS 选择器权重及实战
1. 权重计算规则详解 CSS 选择器的优先级由 三元组 (x, y, z) 决定,比较规则如下: 选择器类型权重值 (x, y, z)示例ID 选择器x 1#header → (1,0,0)类/伪类/属性y 1.active, :hover元素/伪元素z 1div, ::before 比较规则:从左到右逐级比…...
Mysql的查询
1.Mysql的基本查询 语法:select*from 表名;代表查询所有数据的所有列 SELECT * FROM classinfo; SELECT * FROM studentinfo; select 字段1,字段2.....from 表名;查询数据的指定字段 查询studentinfo表的学生姓名和年龄 SELECT stuname,age FROM stu…...
RaabitMQ 快速入门
🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…...
LLM: 探索LLM视觉缺陷
文章目录 前言一、Constructing MMVP Benchmarks1、CLIP-blind pair 二、MMVP-VLM bench1、Model size influence2、correlation between CLIP MLLMs 三、Mixture of Features1、Additive MoF Experiment2、Interleaved MoF Experiment 总结 前言 在使用多模态大模型时候是否会…...
常用的 SQL 语句分类整理
以下是常用的 SQL 语句分类整理,覆盖数据查询、操作、表管理和高级功能,适用于大多数关系型数据库(如 MySQL、PostgreSQL、SQL Server): 目录 一、数据查询(DQL) 1. 基础查…...
Go之defer关键字:优雅的资源管理与执行控制
在Go语言中,defer关键字是处理资源释放、错误恢复和代码逻辑清理的利器。它看似简单,却隐藏着许多设计哲学和底层机制。本文将深入剖析defer的执行原理、使用场景和常见陷阱,助你掌握这一关键特性。 一、defer基础:延迟执行的本质…...
T1结构像+RS-fMRI影像处理完整过程记录(数据下载+Matlab工具箱+数据处理)
最近需要仿真研究T1结构像RS-fMRI影像融合处理输出目标坐标的可行性。就此机会记录下来。 为了完成处理,首先需要有数据,然后需要准备对应的处理平台和工具箱。那么正文开始~ (1)下载满足要求的开源数据 去OpenNEURO https://open…...
Flowable进阶-网关、事件和服务
网关 并行网关 并行网关允许将流程拆分为多个分支,也可以将多个分支汇集到一起。并行网关的功能是基于流入流出的顺序流。fork分支:用于任务的开始。并行后所有外出的顺序流,为每个顺序流都创建一个并发分支。 join汇聚:用于任务…...
【三维重建与生成】GenFusion:SVD统一重建和生成
标题:《GenFusion: Closing the Loop between Reconstruction and Generation via Videos》 来源:西湖大学;慕尼黑工业大学;上海科技大学;香港大学;图宾根大学 项目主页:https://genfusion.sibowu.com 文章…...
常见的爬虫算法
1.base64加密 base64是什么 Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后…...
有序二叉树各种操作实现(数据结构C语言多文件编写)
1.先创建tree.h声明文件( Linux 命令:touch tree.h)。编写函数声明如下(打开文件 Linux 操作命令:vim tree.h): //树的头文件位置 #ifndef __TREE_H__ #define __TREE_H__ //节点 typedef struct node{int data;//数据struct node* left;//记录左侧子节…...
Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置
作者:濯光、翼严 Kubernetes 配置管理的局限 目前,在 Kubernetes 集群中,配置管理主要通过 ConfigMap 和 Secret 来实现。这两种资源允许用户将配置信息通过环境变量或者文件等方式,注入到 Pod 中。尽管 Kubernetes 提供了这些强…...
特殊文件以及日志——特殊文件
一、特殊文件 必要性:可以用于存储多个用户的:用户名、密码。这些有关系的数据都可以用特殊文件来存储,然后作为信息进行传输。 1. 属性文件.properties(键值对) (1)特点: 都只能…...
Spark-SQL核心编程语言
利用IDEA开发spark-SQL 创建spark-SQL测试代码 自定义函数UDF 自定义聚合函数UDAF 强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数, 如 count(), countDistinct(),avg(),max(),min()。除此之外&…...
jdk 安装
oracle官网 : Java Archive | Oracle 中国 export JAVA_HOME/Users/xxxxx/app/services/x86jdk/jdk1.8.0_431.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH 华为镜像网站:Index of java-local/jdk...
Missashe考研日记-day21
Missashe考研日记-day21 1 专业课408 学习时间:4h学习内容: 今天先把昨天学的内容的课后习题做了,整整75道啊,然后学了OS第二章关于CPU调度部分的内容,这第二章太重要了,以至于每一小节的内容都比较多&am…...
双重路由引入的环路,选路次优的产生以及解决方法
描述 在R2,R3上双向引入ospf,以及rip,R5修改静态的优先级为180,在ospf中引入该静态路由 路由分析 选路次优问题 R5引入了静态路由,优先级是150 R2->R5->100.1.1.0,优先级是150 R3->R4->100.1.1.0,优先级是150 R3->R4->R5->100.1.1.0,优先级是150 R2-…...
环境变量概念以及获取环境变量(linux下解析)
目录 1 基本概念 2 常见的环境变量 3 查看环境变量方法 4 和环境变量相关的命令 5 环境变量的组织方式 6 通过代码如何获取环境变量 6.1 命令行参数 6.2 环境变量 7 通过系统调用获取或设置环境变量 1 基本概念 环境变量(environmentvariables)⼀般是指在操作系统中用来指…...
删除win11电脑上的阿尔巴尼亚输入法SQI
删除电脑自带的阿尔巴尼亚输入法 这个输入法在系统中并不显示,但是有时候会出现在右下角显示,删除这个输入法的流程如下,暂时没发现反复! 第一步:打开注册表: winR打开运行,输入 regedit 第二…...
目标检测与分割:深度学习在视觉中的应用
🔍 PART 1:目标检测(Object Detection) 1️⃣ 什么是目标检测? 目标检测是计算机视觉中的一个任务,目标是让模型“在图像中找到物体”,并且判断: 它是什么类别(classif…...
npm和npx的作用和区别
npx 和 npm 是 Node.js 生态系统中两个常用的工具,它们有不同的作用和使用场景。 1. npm(Node Package Manager) 作用: npm 是 Node.js 的包管理工具,主要用于: 安装、卸载、更新项目依赖(包&a…...
OpenCV 图形API(36)图像滤波-----形态学操作函数morphologyEx()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 执行高级形态学变换。 该函数可以使用腐蚀和膨胀作为基本操作来执行高级形态学变换。 任何操作都可以原地进行。在处理多通道图像时,…...
Python入门到精通6:CSS网页美化入门1
CSS(层叠样式表)是网页设计的核心语言之一,它让我们的网页从单调的结构变得生动美观。今天,我将带大家快速了解CSS的基础知识,包括基本概念、引入方式、选择器、字体与文本样式以及调试工具的使用。 1. CSS基本概念 …...
【深入C++多态:基于消息解析器的设计、实现与剖析】
深入C多态:基于消息解析器的设计、实现与剖析 前言多态代码示例代码结构C多态的核心知识点多态的底层机制深入剖析多态的设计模式总结 前言 在C面向对象编程中,多态(Polymorphism)是实现灵活性和扩展性的核心特性,允许…...
Dockerfile 文件常见命令及其作用
Dockerfile 文件包含一系列命令语句,用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用: FROM:指定基础镜像,后续的操作都将基于该镜像进行。例如,FROM python:3.9-slim-buster 表示使用 Pyt…...
Redis--持久化
一、持久化 Redis支持RDB和AOF两种持久化机制持久化功能有效地避免因进程退出造成数据丢失问题, 当下次重启时利用之前持久化的文件即可实现数据恢复。 二、RDB RDB 持久化是把当前进程数据⽣成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和…...
Markdown学习
Typora下载 Typora教程 标题 井号加空格——回车即可形成标题,几级标题几个井号。 字体 斜体——前后各一个*,回车 粗体——前后各两个*,回车 既斜体又粗体——前后各三个*,回车 删除线——前后各两个~(波浪号…...
Vulhub-DarkHole靶机通关攻略
下载链接:https://www.vulnhub.com/entry/darkhole-1,724/ 扫描ip arp-scan -l扫描端口 nmap 192.168.112.144 -p-扫描目录 dirsearch -u http://192.168.112.144/有一个登录页面,还有一个upload目录,但是还没有找到上传点 先注册一个用…...
UniRig ,清华联合 VAST 开源的通用自动骨骼绑定框架
UniRig是清华大学计算机系与VAST联合开发的前沿自动骨骼绑定框架,专为处理复杂且多样化的3D模型而设计。基于强大的自回归模型和骨骼点交叉注意力机制,UniRig能够生成高质量的骨骼结构和精确的蒙皮权重,大幅提升动画制作的效率和质量。 UniR…...
深入解析 sklearn 中的 LabelEncoder:功能、使用场景与注意事项
标题:深入解析 sklearn 中的 LabelEncoder:功能、使用场景与注意事项 摘要: LabelEncoder 是 sklearn 中用于类别标签编码的重要工具,能够将离散的类别型标签转换为模型可识别的数值格式。本文详细解析 LabelEncoder 的核心功能…...
红帽Linux网页访问问题
配置网络,手动配置 搭建yum仓库红帽Linux网页访问问题 下载httpd 网页访问问题:首先看httpd的状态---selinux的工作模式(强制)---上下文类型(semanage-fcontext)---selinux端口有没有放行semanage port ---防火墙有没有active---…...
Muduo库代码剖析 : EventLoop
本文初发于 “天目中云的小站”,同步转载于此 EventLoop 详解 EventLoop类似于Reactor模型中的反应堆(Reactor)和事件分发器(Demultiplex)的合并, 其目的在于高效的接收事件, 并正确分配给对应的事件处理器. EventLoop中有两类关键的子控件 : Channel 和 Poller. C…...
Python网络爬虫设计(一)
目录 一、网络爬虫 1、基本的爬虫 2、获取URL 3、查找网页源码关键字 4、代码实现 二、requests库 1、requests的优势和劣势 2、获取网页的其他库 (1)selenium库 (2)pyppeteer库 三、pyppeteer库 1、pyppeteer库的来历…...
GEO供应商盈达科技发布:AI信源占位白皮书
副标题:生成式AI时代的企业认知主权争夺战 发布日期:2025年4月15日 一、范式重构:从流量入口到认知主权的战略迁移 生成式AI的规则革命 73%的用户决策直接依赖AI生成内容,但68%的引…...
L1-4 拯救外星人
题目 你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“57”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。 本题就请你…...
业务摆渡解锁信息孤岛,重塑数字医疗未来
某三甲医院的急诊科突然亮起红灯,一名车祸患者被紧急送入,主治医师需要调取其三个月前在科研专网存储的增强CT影像。若在两年前,这需要两位管理员手动导出、杀毒、跨网传输,耗时40分钟;而现在,系统自动触发…...
OpenCV中的轮廓近似方法详解
文章目录 引言一、什么是轮廓近似?二、OpenCV中的轮廓近似方法2.1Douglas-Peucker算法原理2.2函数原型 三、代码示例3.1. 基本使用 四、参数选择技巧五、与其他轮廓方法的比较六、总结 引言 在计算机视觉和图像处理中,轮廓是物体边界的重要表示形式。Op…...
4种方法将文件映射到内存提升读写速度
背景 考虑到以下应用需求,常将文件映射到内容,以提升读写效果。 高效文件读写:大文件操作时,避免多次read/write系统调用的开销。进程间通信(共享内存):多个进程映射同一文件,实现…...
367. 有效的完全平方数
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。 不能使用任何内置的库函数,如 sqrt 。 示例 1…...
Ubuntu2404装机指南
因为原来的2204升级到2404后直接嘎了,于是要重新装一下Ubuntu2404 Ubuntu系统下载 | Ubuntuhttps://cn.ubuntu.com/download我使用的是balenaEtcher将iso文件烧录进U盘后,使用u盘安装,默认选的英文版本, 安装后,安装…...
爬虫框架 - Coocan
安装 pip install coocan 演示...
S06-Kep的跨通道传输
每次分享一小点,进步都是实实在在。小编今天又来分享了!之前我们讲到的KepServer软件,是一个具备强大通讯能力的软件,但是当你的上位软件不够灵活的时候,又有多个通道的数据交互的需求,Kep的跨通道传输就为…...
Zookeeper单机三节点集群部署(docker-compose方式)
前提: 服务器需要有docker镜像zookeeper:3.9.3 或能连网拉取镜像 服务器上面新建文件夹: mkdir -p /data/zk-cluster/{data,zoo-cfg} 创建三个zookeeper配置文件zoo1.cfg、zoo2.cfg、zoo3.cfg,配置文件里面内容如下(三个文件内容一样): tickTime=2000 initLimit=10 …...
C++| 深入剖析std::list底层实现:链表结构与内存管理机制
引言 std::list的底层实现基于双向链表,其设计哲学与std::vector截然不同。本文将深入探讨其节点结构、内存分配策略及迭代器实现原理,揭示链表的性能优势和潜在代价。 1. 底层数据结构:双向链表 每个std::list节点包含: 数据域…...
mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置
mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 https://www.modb.pro/db/1784385883449397248 mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 SQL命令行临时设置操作 #查看mysql数据库的线程连接数: mysql> show global statu…...
HarmonyOS-ArkUI V2状态-PersistenceV2:持久化存储UI状态
PersistenceV2类是一个与AppStorageV2类用法非常相似的类。因为它俩是子类和父类的关系。如果不了解AppStorageV2,可以先跳转至了解一下这个类。 HarmonyOS-ArkUI V2工具类:AppStorageV2:应用全局UI状态存储-CSDN博客 PersistenceV2相比于其父类AppStorageV2而言,它存储的…...
App测试小工具
前言 最近app测试比较多,每次都得手动输入日志tag,手动安装,测完又去卸载,太麻烦。就搞了小工具使用。 效果预览 每次测试完成,点击退出本次测试,就直接卸载了,usb插下一个手机又可以继续测了…...
ZEP: 一种用于智能体记忆的时序知识图谱架构
摘要 我们介绍了Zep,一种新型的智能体记忆层服务,在深度记忆检索(DMR)基准测试中,超越了现有的最先进系统MemGPT。此外,Zep在比DMR更全面、更具挑战性的评估中表现优异,这些评估更好地反映了现实世界企业应用的需求。尽管现有的基于大语言模型(LLM)的检索增强生成(R…...