VBS操作Excel实例:COM自动化在遗留系统维护中的实战应用
1. 项目概述为什么VBS操作Excel依然值得深挖在自动化办公和数据处理领域Python的pandas和openpyxl库几乎成了标配很多新入行的朋友可能会觉得用VBSVBScript来操作Excel是不是有点“复古”了我最初也这么想直到接手了几个遗留的、运行在特定Windows服务器环境下的老系统维护任务。这些系统里核心的数据处理逻辑就是用VBS脚本写的直接调用本地的Microsoft Excel应用程序。你没法轻易升级环境更不能随意引入新的运行时这时候VBS就成了唯一可靠的选择。所以这个“VBS操作Excel实例”项目绝不是简单的怀旧而是针对特定场景如无Python环境、需深度集成Office功能、处理复杂格式报表的实用技能。它适合那些需要维护老旧系统、开发轻量级Windows桌面自动化工具或者对系统环境有严格限制的开发者。掌握它意味着你多了一种“就地解决”问题的能力尤其是在一些IT管控严格的企业内网中这种能力往往非常关键。2. 核心思路与方案选型为何是VBSExcel.Application当我们决定用VBS操作Excel时本质上是在调用COMComponent Object Model组件。Excel作为一个COM服务器暴露了一系列对象如Application、Workbook、Worksheet、Range供VBS这样的脚本语言调用。这套方案的核心优势在于无需额外安装只要目标Windows机器上装了Office哪怕是老版本的脚本就能直接运行。相比之下像Python虽然强大但需要部署解释器和第三方库在某些“纯净”或锁定的生产环境中这一步可能就是天堑。选择VBScript主要基于以下几点考量环境普适性从Windows 98到Windows 11只要启用了Windows Script HostWSHVBS就能运行兼容性极广。与Office深度集成通过COM接口VBS可以访问Excel几乎所有的功能包括图表操作、条件格式、数据透视表等高级特性这是很多纯文件操作库做不到的。轻量级与快速原型对于简单的数据搬运、格式调整、报表生成写一个几十行的.vbs文件双击就能执行比启动一个IDE、配置一个Python项目要快得多。当然这套方案的缺点也很明显性能一般尤其是处理大数据量时错误处理相对简陋且无法跨平台。因此它最适合的场景是中小型、周期性、运行在固定Windows环境下的自动化任务。我们的项目实例将围绕一个典型场景展开从一个文本文件或数据库查询结果中读取数据填入Excel模板进行一些计算和格式美化最后保存并生成PDF报告。这个过程会覆盖从创建Excel实例到释放资源的完整生命周期。3. 核心对象模型与关键语法解析要熟练操作必须先理解Excel的COM对象模型。这个模型是一个层次结构你可以把它想象成操作一个真实的Excel程序。3.1 核心对象四巨头Application对象这是根对象代表整个Excel应用程序。通过它你可以设置全局属性如是否显示界面、是否弹出警告也可以打开或创建工作簿。Set objExcel CreateObject(Excel.Application) 创建Excel应用实例 objExcel.Visible True 让Excel窗口可见。后台运行则设为False objExcel.DisplayAlerts False 关闭保存覆盖等提示框自动化时常用Workbook对象代表一个Excel工作簿文件.xls或.xlsx。你可以打开现有文件或新建一个。 打开一个已存在的工作簿 Set objWorkbook objExcel.Workbooks.Open(C:\Reports\Template.xlsx) 新建一个工作簿 Set objWorkbook objExcel.Workbooks.Add()Worksheet对象代表工作簿中的一个工作表。这是你进行数据操作的主要场所。 获取活动工作表或通过索引/名称获取特定工作表 Set objSheet objExcel.ActiveSheet Set objSheet objWorkbook.Worksheets(Data) 按名称 Set objSheet objWorkbook.Worksheets(1) 按索引从1开始Range对象这是最重要的对象代表一个或一组单元格。几乎所有的数据读写、格式设置都通过它来完成。 引用一个特定单元格 Set objCell objSheet.Range(A1) 引用一个矩形区域 Set objRange objSheet.Range(A1:C10) 引用整行或整列 Set objRow objSheet.Rows(5) 第5行 Set objColumn objSheet.Columns(B) B列3.2 必须掌握的VBS语法特性VBS是弱类型语言变量声明用Dim但给对象变量赋值时必须用Set这是新手最容易出错的地方。Dim strValue 声明一个普通变量 strValue Hello Dim objRange 声明一个对象变量 Set objRange objSheet.Range(A1) 给对象变量赋值必须用Set objRange.Value strValue 正确给对象的属性赋值 Set objRange.Value strValue 错误Value是属性不是对象不能用Set。注意所有用CreateObject或方法返回的对象引用都必须用Set关键字接收。忘记Set是导致“对象不支持此属性或方法”错误的常见原因。错误处理在自动化脚本中至关重要因为一个弹出的错误对话框就会让脚本卡住。使用On Error Resume Next和Err对象是基本操作。On Error Resume Next 发生错误时继续执行下一句 objSheet.Range(InvalidName).Value 100 If Err.Number 0 Then WScript.Echo 错误号 Err.Number 描述 Err.Description Err.Clear 清除错误 End If On Error Goto 0 恢复默认错误处理推荐在脚本关键段落后恢复4. 完整实操流程从数据到格式化报表下面我们实现一个完整的实例读取一个CSV格式的销售数据填入报表模板计算总额应用格式并另存为PDF。4.1 第一步环境准备与脚本框架创建一个新的文本文件将其后缀改为.vbs例如GenerateSalesReport.vbs。用记事本或任何代码编辑器打开。首先我们构建脚本的骨架包括变量声明、主流程和错误处理框架。 GenerateSalesReport.vbs 描述读取销售数据CSV生成格式化的Excel报表和PDF Option Explicit 强制变量声明避免拼写错误 定义常量 Const CSV_PATH C:\Data\sales_202310.csv Const TEMPLATE_PATH C:\Templates\SalesReport.xlsx Const OUTPUT_DIR C:\Reports\ 声明主变量 Dim objExcel, objWorkbook, objSheet, objDataSheet Dim objFSO, objCSVFile, strLine, arrData, i, j Dim dTotalSales Dim strOutputExcelPath, strOutputPDFPath 初始化总额 dTotalSales 0 主程序开始 WScript.Echo 开始生成销售报表... Call Main() WScript.Echo 报表生成完成 Sub Main() On Error Resume Next 在这里调用各个功能子过程 Call InitializeExcel() If Err.Number 0 Then Exit Sub Call ImportCSVData() If Err.Number 0 Then Exit Sub Call FillReportAndCalculate() If Err.Number 0 Then Exit Sub Call FormatReport() If Err.Number 0 Then Exit Sub Call SaveAndExport() If Err.Number 0 Then Exit Sub Call Cleanup() If Err.Number 0 Then WScript.Echo 所有步骤执行成功。 End If On Error Goto 0 End Sub 后续将在此处定义各个子过程Sub使用Option Explicit和清晰的子过程划分是编写可维护VBS脚本的好习惯。这能让你快速定位问题所在。4.2 第二步初始化Excel并打开模板在MainSub 后面我们添加第一个功能子过程初始化Excel应用并打开我们的报表模板。Sub InitializeExcel() WScript.Echo 步骤1启动Excel并打开模板... Set objExcel CreateObject(Excel.Application) If objExcel Is Nothing Then Err.Raise 1001, , 无法创建Excel应用程序对象。请确认Office已安装。 Exit Sub End If 配置Excel应用行为后台运行不显示警告 objExcel.Visible False 后台运行不显示界面 objExcel.DisplayAlerts False 自动处理覆盖保存等提示 objExcel.ScreenUpdating False 关闭屏幕更新大幅提升性能 打开预制的模板工作簿 Set objWorkbook objExcel.Workbooks.Open(TEMPLATE_PATH) If objWorkbook Is Nothing Then Err.Raise 1002, , 无法打开模板文件 TEMPLATE_PATH Exit Sub End If 获取数据输入工作表假设模板中已有一个名为“RawData”的空白表 Set objDataSheet objWorkbook.Worksheets(RawData) If objDataSheet Is Nothing Then 如果不存在则创建一个新工作表 Set objDataSheet objWorkbook.Worksheets.Add() objDataSheet.Name RawData Else 如果存在则清空旧数据从第2行开始保留标题行 objDataSheet.Range(A2).CurrentRegion.Offset(1, 0).ClearContents End If WScript.Echo 模板加载成功数据表准备就绪。 End Sub实操心得objExcel.ScreenUpdating False是提升脚本运行速度的关键设置。在批量操作单元格前将其设为False结束时再设为True你会发现脚本执行快了一个数量级。同样DisplayAlerts False可以避免“文件已存在是否覆盖”这类弹窗中断自动化流程。4.3 第三步读取并导入CSV数据接下来我们使用VBS自带的FileSystemObject来读取CSV文件并将数据写入Excel的“RawData”工作表。Sub ImportCSVData() WScript.Echo 步骤2导入CSV数据... Set objFSO CreateObject(Scripting.FileSystemObject) If Not objFSO.FileExists(CSV_PATH) Then Err.Raise 1003, , CSV数据文件不存在 CSV_PATH Exit Sub End If Set objCSVFile objFSO.OpenTextFile(CSV_PATH, 1) 1表示只读 i 2 从Excel的第2行开始写入假设第1行是标题 读取CSV文件头第一行可以根据需要写入Excel作为标题 strLine objCSVFile.ReadLine arrHeaders Split(strLine, ,) 如果需要可以拆分标题 循环读取每一行数据 Do While Not objCSVFile.AtEndOfStream strLine objCSVFile.ReadLine arrData Split(strLine, ,) 假设CSV以逗号分隔 将拆分后的数组写入Excel的对应行 For j 0 To UBound(arrData) objDataSheet.Cells(i, j 1).Value Trim(arrData(j)) Trim去除首尾空格 Next 假设CSV的第四列索引3是销售额进行累加 If UBound(arrData) 3 Then If IsNumeric(arrData(3)) Then dTotalSales dTotalSales CDbl(arrData(3)) End If End If i i 1 每处理100行给个进度提示对于大数据文件很有用 If (i Mod 100) 0 Then objExcel.StatusBar 正在导入数据已处理 i-2 行... End If Loop objCSVFile.Close Set objCSVFile Nothing Set objFSO Nothing WScript.Echo 数据导入完成共处理了 i-2 行记录。 WScript.Echo 销售总额计算为 FormatNumber(dTotalSales, 2) 格式化为两位小数 End Sub这里使用了Split函数来解析CSV行这要求CSV格式简单无包含逗号的引用字段。对于复杂的CSV建议使用专门的解析逻辑或考虑其他数据源。objExcel.StatusBar是一个向用户反馈进度的小技巧即使Excel窗口不可见状态栏信息在脚本运行期间也是可更新的虽然用户看不到但调试时有用。4.4 第四步填充报表与业务计算数据就位后我们开始操作报表主界面假设模板中有一个名为“Report”的工作表。Sub FillReportAndCalculate() WScript.Echo 步骤3填充报表并执行计算... Set objSheet objWorkbook.Worksheets(Report) If objSheet Is Nothing Then Err.Raise 1004, , 在模板中未找到‘Report’工作表。 Exit Sub End If 1. 写入汇总信息例如报告生成日期、总行数、总额 objSheet.Range(B2).Value 报告日期 Date() 假设B2单元格是报告日期位置 objSheet.Range(B3).Value 数据行数 (i - 2) i是上一步的计数器 objSheet.Range(B4).Value 销售总额 FormatNumber(dTotalSales, 2) 2. 使用Excel公式进行动态计算比在VBS中计算更灵活 假设我们需要在报表中计算平均销售额 objSheet.Range(B5).Formula IFERROR(B4/B3, 0) 总额/行数 平均额 3. 将RawData的数据引用到Report表的某个区域例如做一个简表 假设我们从A10开始放置数据 Dim iLastRow iLastRow objDataSheet.Cells(objDataSheet.Rows.Count, 1).End(-4162).Row xlUp -4162 If iLastRow 1 Then 有数据标题行除外 复制标题 objDataSheet.Range(A1:D1).Copy objSheet.Range(A10) 复制数据使用值粘贴避免公式依赖 objDataSheet.Range(A2:D iLastRow).Copy objSheet.Range(A11).PasteSpecial -4163 xlPasteValues -4163 objExcel.CutCopyMode False 清除剪贴板 End If 4. 在Report表上创建数据透视表高级功能示例 这需要模板中预留了位置且数据模型已建立。此处仅展示创建命令。 Dim objPivotCache, objPivotTable Set objPivotCache objWorkbook.PivotCaches.Create(1, objDataSheet.Range(A1).CurrentRegion, 1) xlDatabase1 Set objPivotTable objPivotCache.CreatePivotTable(objSheet.Range(H10), SalesPivot) ... 配置透视表字段 ... WScript.Echo 报表内容填充与计算完成。 End Sub这里展示了两种计算方式在VBS中计算如dTotalSales和在Excel单元格中写入公式如B5。对于简单的汇总前者足够对于需要随数据变化而动态更新的复杂计算后者更优。Cells(...).End(-4162).Row是VBS中获取某列最后一行有数据单元格行号的经典方法等同于在Excel中按Ctrl↑。4.5 第五步自动化格式设置数据填好了但报表还不够美观。我们来添加一些格式。Sub FormatReport() WScript.Echo 步骤4应用格式设置... With objSheet 1. 设置标题行样式 With .Range(A10:D10) 假设这是数据区域的标题行 .Font.Bold True .Interior.Color RGB(91, 155, 213) 浅蓝色背景 .Font.Color RGB(255, 255, 255) 白色字体 .HorizontalAlignment -4108 xlCenter -4108 End With 2. 设置数据区域边框 Dim rngData Set rngData .Range(A10).CurrentRegion 获取包含标题的整个数据区域 With rngData.Borders .LineStyle 1 xlContinuous 1 .Weight 2 xlThin 2 .Color RGB(0, 0, 0) End With 3. 为销售额列假设是D列应用货币格式 Dim rngSales Set rngSales .Range(.Cells(11, 4), .Cells(rngData.Rows.Count, 4)) D11到最后一行D列 rngSales.NumberFormat #,##0.00_);[Red](#,##0.00) 千位分隔两位小数负数红色 4. 设置汇总信息单元格的字体加大加粗 .Range(B2:B5).Font.Size 12 .Range(B2:B5).Font.Bold True 5. 自动调整列宽 rngData.Columns.AutoFit 6. 条件格式示例高亮销售额大于10000的单元格 With rngSales.FormatConditions.Add(5, , D1110000) xlCellValue1, Operator5 (greater than) .Interior.Color RGB(146, 208, 80) 绿色填充 End With End With WScript.Echo 格式设置完成。 End Sub使用With ... End With语句可以简化对同一对象多次属性的设置让代码更清晰。RGB函数用于指定颜色。格式设置代码通常比较冗长但正是这些细节让生成的报表看起来专业。4.6 第六步保存文件与导出PDF最后我们将工作簿保存到指定位置并导出PDF版本。Sub SaveAndExport() WScript.Echo 步骤5保存与导出... 生成带时间戳的输出文件名避免覆盖 Dim strTimeStamp strTimeStamp Replace(Replace(Replace(Now(), /, ), :, ), , _) strTimeStamp Left(strTimeStamp, Len(strTimeStamp)-2) 去掉秒的小数部分 strOutputExcelPath OUTPUT_DIR SalesReport_ strTimeStamp .xlsx strOutputPDFPath OUTPUT_DIR SalesReport_ strTimeStamp .pdf 先保存Excel工作簿 objWorkbook.SaveAs strOutputExcelPath, 51 51代表xlsx格式 (xlOpenXMLWorkbook) If Err.Number 0 Then WScript.Echo 警告保存Excel文件时出错 ( Err.Description )尝试继续导出PDF。 Err.Clear Else WScript.Echo Excel文件已保存至 strOutputExcelPath End If 导出整个工作表为PDF On Error Resume Next 导出PDF可能因打印机设置等问题失败 objSheet.ExportAsFixedFormat 0, strOutputPDFPath 0 xlTypePDF If Err.Number 0 Then WScript.Echo PDF文件已导出至 strOutputPDFPath Else WScript.Echo 错误导出PDF失败 ( Err.Description )。请检查系统是否安装了PDF打印机。 可以尝试替代方案如打印到PDF打印机 End If On Error Goto 0 End SubSaveAs方法的第二个参数是文件格式常量51对应.xlsx56对应.xls根据你的Office版本和需求选择。导出PDF功能依赖于系统是否安装了“Microsoft Print to PDF”虚拟打印机或Adobe PDF Printer等在Server系统上可能需要额外安装。4.7 第七步资源清理与退出脚本的最后必须妥善清理COM对象否则Excel进程可能残留在内存中造成“资源泄漏”。Sub Cleanup() WScript.Echo 步骤6清理资源... On Error Resume Next 防止清理过程中出错导致脚本崩溃 恢复Excel设置可选但是个好习惯 If Not objExcel Is Nothing Then objExcel.ScreenUpdating True objExcel.DisplayAlerts True End If 关闭工作簿不保存因为之前已经SaveAs了 If Not objWorkbook Is Nothing Then objWorkbook.Close False False表示不保存更改 End If 退出Excel应用 If Not objExcel Is Nothing Then objExcel.Quit End If 释放对象变量非常重要 Set objSheet Nothing Set objDataSheet Nothing Set objWorkbook Nothing Set objExcel Nothing WScript.Echo Excel进程已关闭对象资源已释放。 End Sub关键注意事项objExcel.Quit和 将对象变量设为Nothing是必须的步骤。如果只关闭工作簿而不退出应用Excel进程会隐藏运行在后台。如果只退出应用而不释放变量在某些情况下COM引用可能无法完全清除。按“工作簿→应用→释放变量”的顺序操作是最稳妥的。5. 常见问题排查与实战技巧即使按照上述步骤操作在实际环境中你仍可能遇到各种问题。下面是我在多年实践中总结的一些典型问题及其解决方法。5.1 错误“ActiveX部件不能创建对象”或“429错误”这是最常见的问题意味着CreateObject(Excel.Application)失败了。原因1Office未安装或损坏。这是最直接的原因。原因2权限问题。尤其是在Windows Server或受限制的用户账户下运行。原因332位/64位不匹配。如果你的Office是32位的而脚本宿主CScript/WScript运行在64位环境下或者反过来就可能出错。排查与解决首先手动在目标机器上运行一下Excel确认其能正常启动。尝试以管理员身份运行脚本。检查Office的位版本。可以尝试显式指定 对于32位Office在64位系统上 Set objExcel CreateObject(Excel.Application.16) 或尝试 Set objExcel GetObject(, Excel.Application) If objExcel Is Nothing Then Set objExcel CreateObject(Excel.Application) End If运行%windir%\SysWOW64\regsvr32.exe %windir%\SysWOW64\scrobj.dll重新注册脚本组件针对64位系统。5.2 错误“对象不支持此属性或方法”原因1对象变量未正确使用Set赋值。这是新手最常犯的错误务必检查所有对象赋值语句。原因2对象层次引用错误。例如试图在Workbook对象上调用Range方法Range是Worksheet的方法。原因3属性或方法名拼写错误。VBS不区分大小写但拼写必须准确。排查与解决仔细检查报错行确认对象变量是否已通过Set正确初始化。使用TypeName(objVar)函数打印对象的类型确认你操作的是正确的对象。查阅微软官方文档或使用Excel的VBA对象浏览器按F2来确认正确的对象模型和方法名。5.3 脚本运行后Excel进程未关闭残留内存中原因没有正确执行清理步骤。可能是在出错时直接退出没有执行到Quit和Set Nothing或者脚本被用户强制终止。解决确保你的脚本有完整的错误处理并在所有可能的退出路径包括错误退出中都调用清理子过程。可以将清理代码封装在函数中并使用On Error Goto确保其被执行。在任务管理器中手动结束残留的EXCEL.EXE进程。5.4 性能优化技巧当处理成百上千行数据时脚本可能会很慢。关闭屏幕更新和事件如前所述在操作开始前设置objExcel.ScreenUpdating False和objExcel.EnableEvents False。批量操作单元格尽量避免在循环中逐个读写单元格。可以将数据读入VBS数组处理完毕后再一次性写入一个Range区域。 低效做法 For i 1 To 1000 objSheet.Cells(i, 1).Value i Next 高效做法 Dim arrData(999, 0) 1000行1列 For i 0 To 999 arrData(i, 0) i 1 Next objSheet.Range(A1:A1000).Value arrData减少选择Select和激活ActivateVBA录制宏会产生大量.Select和.Activate代码在VBS中应直接操作对象避免这些耗时的界面交互。5.5 如何调试VBS脚本VBS没有集成调试器但有一些土办法使用WScript.Echo在关键位置输出变量值或状态信息。使用MsgBox在需要暂停并查看信息时使用但会弹窗中断。将中间结果输出到日志文件Set objFSO CreateObject(Scripting.FileSystemObject) Set objLogFile objFSO.OpenTextFile(C:\script.log, 8, True) 8追加True创建 objLogFile.WriteLine Now() - 变量i的值为 i objLogFile.Close让Excel可见在开发阶段将objExcel.Visible设为True可以直观地看到每一步操作的效果。5.6 安全与部署考量数字签名在企业环境中组策略可能禁止运行未签名的VBS脚本。你需要为脚本添加数字签名。路径处理脚本中的文件路径最好使用绝对路径或者通过脚本所在目录动态构造相对路径。Set objFSO CreateObject(Scripting.FileSystemObject) strScriptDir objFSO.GetParentFolderName(WScript.ScriptFullName) CSV_PATH objFSO.BuildPath(strScriptDir, data\sales.csv)凭据管理如果脚本需要访问网络资源或数据库避免将密码硬编码在脚本中。可以考虑使用Windows身份验证或将加密的凭据存储在受保护的文件中。通过这个完整的实例和深入的疑难解析你应该已经掌握了使用VBS操作Excel从基础到进阶的核心技能。这套技术虽然古老但在特定的运维和自动化场景下其简单、直接、依赖少的特性依然是解决问题的利器。关键在于理解COM对象模型养成良好的资源管理习惯并善用错误处理和性能优化技巧。下次当你面对一个不能安装Python的老旧服务器时不妨试试这个“老伙计”它很可能给你带来惊喜。

相关新闻

循环双向链表详解:从原理到实战,解锁高效数据结构设计

循环双向链表详解:从原理到实战,解锁高效数据结构设计

1. 项目概述:从“绕圈”的链表说起如果你已经玩转过单链表和双向链表,可能会觉得链表这种结构也就那样了,增删改查,无非是指针指来指去。但当你第一次接触“循环双向链表”时,那种感觉就像是在一个你以为已经走遍的迷宫…

2026/10/10 11:23:06 阅读更多 →
Outlook多邮箱高效管理:集中化配置与自动化规则实战指南

Outlook多邮箱高效管理:集中化配置与自动化规则实战指南

1. 项目概述:多邮箱管理的现实困境与核心价值每天一打开电脑,Outlook 收件箱里塞满了来自不同账号的邮件——工作邮箱里是项目进度和客户沟通,个人邮箱里是账单、订阅和亲友来信,可能还有一个专门用于注册各种服务的“垃圾”邮箱。…

2026/10/1 11:03:26 阅读更多 →
Xcelium xrun仿真工具:从命令行基础到高效芯片验证实践

Xcelium xrun仿真工具:从命令行基础到高效芯片验证实践

1. 项目概述:为什么我们需要关注Xcelium(xrun)?如果你是一名数字芯片设计或验证工程师,那么“仿真”这个词对你来说,就像吃饭喝水一样日常。从早期的Verilog-XL,到后来Cadence的NC-Verilog/NC-S…

2026/10/11 17:25:15 阅读更多 →

最新新闻

Winlator 上手指南:在安卓手机上直接运行 Windows 程序,几分钟就能跑起来

Winlator 上手指南:在安卓手机上直接运行 Windows 程序,几分钟就能跑起来

Winlator 上手指南:在安卓手机上直接运行 Windows 程序,几分钟就能跑起来 【免费下载链接】winlator Android application for running Windows applications with Wine and Box86/Box64 项目地址: https://gitcode.com/GitHub_Trending/wi/winlator …

2026/10/13 9:31:12 阅读更多 →
数据库设计实战:学生选课系统的ER模型、事务与并发控制

数据库设计实战:学生选课系统的ER模型、事务与并发控制

简介:这是一份针对数据库原理与应用课程的高分课程设计资源,围绕某高校学生选课系统展开,着重演示数据库系统分析与建模思路。资源重点放在数据库部分,不含完整应用程序,内含课程设计报告和数据库脚本,适合…

2026/10/13 9:31:12 阅读更多 →
PostgreSQL索引访问方法属性调优实战指南

PostgreSQL索引访问方法属性调优实战指南

1. 为什么“访问方法属性”才是索引性能的真正开关很多人学PostgreSQL索引,一上来就背B-tree、Hash、GIN、GiST这些名词,抄几行CREATE INDEX ON table USING btree (col)就以为掌握了。我带过不少刚转数据库开发的同事,他们能熟练写出复合索引…

2026/10/13 9:31:12 阅读更多 →
RISC-V IDE MRS使用笔记(十一):工程导出为CMake项目

RISC-V IDE MRS使用笔记(十一):工程导出为CMake项目

RISC-V IDE MRS使用笔记(十一):工程导出为CMake项目 今天分享一个MRS的实用功能:工程导出为CMake项目,旨在帮助想要使用CMake编译MRS工程的用户。主要适合于在Windows系统上使用IDE软件开发,想要迁移到Linu…

2026/10/13 9:31:12 阅读更多 →
蒙特卡洛马尔可夫链 MCMC 采样算法核心原理与工程实践小结

蒙特卡洛马尔可夫链 MCMC 采样算法核心原理与工程实践小结

1. 从“算不出”到“采出来”:为什么要学这把钥匙如果你做过贝叶斯统计或者训练过生成模型,大概率会撞上这样一个尴尬时刻:后验分布写起来干干净净,但要真的算出某个期望值、某个边缘概率,积分直接把你卡死。高维空间里…

2026/10/13 9:31:12 阅读更多 →
找城市题的实质是树的重心:四种语言实现与实战解析

找城市题的实质是树的重心:四种语言实现与实战解析

如果你的机考题单里出现“找城市”这三个字,第一眼千万别被“城市”“道路”这两个词带跑。我第一次做这一类题目时,下意识就开始想最短路、多源 BFS,甚至往最小生成树上靠,结果把简单问题复杂化了。后来仔细读题才反应过来&#…

2026/10/13 9:30:09 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →