C++ COM自动化读写Excel 2010:原理、代码与性能优化实战
1. 项目概述为什么要在C里读写Excel在工业控制、数据分析、游戏配置管理或者是一些遗留的MFC桌面应用中我们经常会遇到一个看似简单却有点“古老”的需求用C直接读写Excel文件。你可能会问现在Python的pandas、C#的EPPlus不是更方便吗没错但对于一个已经用VS2013和原生C构建的、对运行环境依赖极轻可能就一个exe、或者对性能有苛刻要求的项目来说引入一个庞大的第三方语言运行时或复杂的库链往往不是最优解。这个教程要解决的就是在Visual Studio 2013环境下使用纯C或辅以经典的COM技术来操作Excel 2010格式.xlsx或.xls的文件。这不仅仅是调用几个API那么简单它涉及到对COM组件的理解、资源的安全管理以及如何优雅地处理微软Office这套复杂对象模型。网上很多代码片段要么过于简略缺胳膊少腿要么就是针对老旧的.xls格式在读写.xlsx时各种报错。今天我就把当年在工业数据采集项目中趟过的坑、总结出的稳定套路从头到尾给你拆解清楚。2. 环境准备与核心原理剖析2.1 开发环境与依赖确认工欲善其事必先利其器。首先明确我们的战场开发环境Microsoft Visual Studio 2013。选择它是因为其自带的C编译器对COM支持成熟且与Office 2010属于同时代产品兼容性最好。更高版本的VS当然也可以但一些项目设置和库的引用方式略有不同。目标Office版本Microsoft Excel 2010。这里有个关键点我们主要通过Excel的主互操作程序集Primary Interop Assemblies, PIA来操作。PIA是微软官方提供的、用于.NET与COM Office组件交互的桥梁。虽然我们用C但可以通过导入这些类型库实现类似的COM自动化。运行环境目标机器上必须安装完整版的Microsoft Excel 2010。我们的程序实际上是启动一个Excel的进程实例通过COM与其通信。如果目标机只有Excel运行时或兼容包大概率会失败。核心原理就是COM自动化。你可以把Excel想象成一个独立的、功能强大的服务器COM Server我们的C程序作为客户端COM Client通过一套标准的协议IDispatch接口向它发送命令比如“打开A.xlsx”、“读取Sheet1的B2单元格”、“在C列写入一组数据”。这套协议是跨版本的但高版本Excel的某些新功能在低版本PIA中可能没有对应接口。2.2 在VS2013中配置项目创建一个新的Win32控制台应用程序或MFC应用程序根据你的需求。关键配置步骤如下引入COM支持在stdafx.h等预编译头文件中确保引入了COM支持。#import C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE \ rename(DialogBox, ExcelDialogBox) \ rename(RGB, ExcelRGB) \ exclude(IFont, IPicture) \ no_auto_exclude这行#import语句是灵魂所在。它告诉编译器去指定的路径请根据你的Office安装位置调整读取Excel.exe中的类型库并自动生成对应的C智能指针包装类如_ApplicationPtr,_WorkbookPtr,_WorksheetPtr。rename是为了避免命名冲突exclude是可选的用于排除一些不常用的、可能引起冲突的接口。初始化COM库任何COM操作前必须初始化COM环境。通常在程序入口点如_tmain或InitInstance调用CoInitialize(NULL); // 初始化COM单线程公寓STA模型这对Office自动化是必须的程序退出前需要对应地调用CoUninitialize();。设置编译选项在项目属性 - C/C - 常规中将“警告视为错误”暂时关闭因为#import生成的代码可能会产生一些警告。在链接器 - 输入中确保添加了必要的库如ole32.lib和oleaut32.lib。注意#import生成的包装类会创建两个文件.tlh类型库头文件和.tli类型库实现文件。它们通常位于项目的中间输出目录如Debug。如果遇到编译错误可以尝试清理解决方案并重新生成以刷新这些文件。3. 核心操作流程详解3.1 启动Excel与打开工作簿一切从创建Excel应用实例开始。这里演示一个完整的、包含错误处理的打开流程。#include comdef.h // 用于 _com_error 异常处理 Excel::_ApplicationPtr spApp nullptr; Excel::_WorkbookPtr spWorkbook nullptr; HRESULT hr CoCreateInstance( __uuidof(Excel::Application), // Excel Application 的 CLSID nullptr, CLSCTX_LOCAL_SERVER, // 关键Excel是一个本地外进程服务器 __uuidof(Excel::_Application), reinterpret_castLPVOID*(spApp) ); if (FAILED(hr) || spApp nullptr) { _com_error err(hr); std::cerr 无法启动Excel应用程序。错误: err.ErrorMessage() std::endl; return -1; } // 可选设置Excel可见性。调试时设为可见发布时通常设为不可见以提升速度。 spApp-Visible VARIANT_FALSE; // VARIANT_FALSE 表示不可见 spApp-DisplayAlerts VARIANT_FALSE; // 不显示警告对话框如“是否保存” try { // 打开工作簿 spWorkbook spApp-Workbooks-Open( _bstr_t(LC:\\YourPath\\Data.xlsx), // 文件路径使用宽字符 vtMissing, // 更新链接 vtMissing, // 只读模式设为vtMissing或VARIANT_TRUE表示可读写 vtMissing, // 格式 vtMissing, // 密码 vtMissing, // 写入密码 vtMissing, // 忽略只读推荐 vtMissing, // 格式 vtMissing, // 分隔符 vtMissing, // 可编辑 vtMissing, // 通知 vtMissing, // 转换器 vtMissing, // 添加至最近列表 vtMissing, // 文本编码 vtMissing // 文本限定符 ); std::cout 工作簿打开成功。 std::endl; } catch (const _com_error e) { std::cerr 打开工作簿失败: e.ErrorMessage() std::endl; spApp-Quit(); spApp nullptr; return -1; }关键点解析CLSCTX_LOCAL_SERVER这是最易出错的地方之一。必须使用这个标志它告诉系统启动一个独立的Excel进程。如果误用CLSCTX_INPROC_SERVER会导致失败。vtMissing这是一个VARIANT类型的常量表示省略一个可选参数。在C中调用这些多参数方法时对于不想指定的选项必须显式传入vtMissing。_bstr_t一个方便的包装类用于在C和COM的BSTR字符串类型之间转换。它自动管理内存避免内存泄漏。3.2 读取单元格数据的多种姿势打开工作表后读取数据是核心。Excel对象模型非常灵活可以通过多种方式定位单元格。Excel::_WorksheetPtr spSheet nullptr; try { // 方式1通过索引获取第一个工作表 spSheet spWorkbook-Worksheets-GetItem(_variant_t((long)1)); // 方式2通过名称获取工作表 // spSheet spWorkbook-Worksheets-GetItem(_variant_t(Sheet1)); // 获取使用的范围 Excel::RangePtr spUsedRange spSheet-UsedRange; // 读取单个单元格的值 (例如A1) Excel::RangePtr spCell spSheet-Cells-GetItem(_variant_t(1L), _variant_t(1L)); // 行列 _variant_t varValue spCell-Value2; // Value2属性通常返回最原始的数据数字、字符串 // 判断并转换数据 if (varValue.vt VT_R8) { // 双精度浮点数 double dVal varValue.dblVal; std::cout A1 (数字): dVal std::endl; } else if (varValue.vt VT_BSTR) { // 字符串 _bstr_t bstrVal(varValue.bstrVal); std::cout A1 (字符串): (const char*)bstrVal std::endl; } else if (varValue.vt VT_EMPTY || varValue.vt VT_NULL) { std::cout A1 (空单元格) std::endl; } // 批量读取一个区域到二维数组高效做法 long lastRow spUsedRange-Rows-Count; long lastCol spUsedRange-Columns-Count; std::cout 数据区域大小: lastRow 行 x lastCol 列 std::endl; // 获取整个区域的Value2返回一个二维SAFEARRAY的VARIANT _variant_t varArray spUsedRange-Value2; if (varArray.vt VT_ARRAY) { SAFEARRAY* psa varArray.parray; long lBoundRow, uBoundRow, lBoundCol, uBoundCol; SafeArrayGetLBound(psa, 1, lBoundRow); // 行下界通常是1 SafeArrayGetUBound(psa, 1, uBoundRow); // 行上界 SafeArrayGetLBound(psa, 2, lBoundCol); // 列下界通常是1 SafeArrayGetUBound(psa, 2, uBoundCol); // 列上界 // 遍历SAFEARRAY for (long i lBoundRow; i uBoundRow; i) { for (long j lBoundCol; j uBoundCol; j) { long indices[2] { i, j }; _variant_t varItem; SafeArrayGetElement(psa, indices, varItem); // 处理varItem... } } } } catch (const _com_error e) { std::cerr 读取数据时发生错误: e.ErrorMessage() std::endl; }实操心得ValuevsValue2优先使用Value2。Value属性可能会返回格式化后的字符串如日期格式而Value2返回的是原始值对于数字和字符串处理更直接、性能也稍好。批量读取如果需要读取大量数据像上面那样一次性将整个UsedRange的Value2读入一个SAFEARRAY然后在内存中遍历速度远高于循环调用Cells-GetItem。这是性能优化的关键。类型判断读取到的_variant_t需要根据其vtVARTYPE字段判断实际类型再进行转换否则直接强转可能导致程序崩溃。3.3 写入数据与格式设置写入操作与读取类似但方向相反。我们也可以设置单元格格式如数字格式、字体、颜色等。try { // 写入单个值 spSheet-Cells-GetItem(_variant_t(5L), _variant_t(3L))-Value2 _variant_t(123.456); // C5单元格写入数字 spSheet-Cells-GetItem(_variant_t(6L), _variant_t(3L))-Value2 _variant_t(测试字符串); // C6单元格写入字符串 // 批量写入一个二维数组高效 long startRow 10; long startCol 1; long numRows 100; long numCols 5; // 1. 创建一个SAFEARRAY SAFEARRAYBOUND rgsabound[2]; rgsabound[0].cElements numRows; rgsabound[0].lLbound 1; // Excel索引通常从1开始 rgsabound[1].cElements numCols; rgsabound[1].lLbound 1; SAFEARRAY* psa SafeArrayCreate(VT_VARIANT, 2, rgsabound); // 2. 填充数据到SAFEARRAY for (long i 1; i numRows; i) { for (long j 1; j numCols; j) { long indices[2] { i, j }; _variant_t value; // 示例填充一些测试数据 if (j 1) value _variant_t((long)(i)); // 第一列为行号 else value _variant_t((double)(i * j * 1.5)); // 其他列为计算值 SafeArrayPutElement(psa, indices, value); } } // 3. 获取目标Range对象 Excel::RangePtr spTargetRange spSheet-Range( spSheet-Cells-GetItem(_variant_t(startRow), _variant_t(startCol)), spSheet-Cells-GetItem(_variant_t(startRow numRows - 1), _variant_t(startCol numCols - 1)) ); // 4. 将SAFEARRAY赋值给Range的Value2 _variant_t varArray; varArray.vt VT_ARRAY | VT_VARIANT; varArray.parray psa; spTargetRange-Value2 varArray; // 5. 清理SAFEARRAY (非常重要!) SafeArrayDestroy(psa); // 设置单元格格式示例将A列设置为文本格式将第10行背景设为黄色 Excel::RangePtr spColumnA spSheet-Columns-GetItem(_variant_t(1L)); spColumnA-NumberFormat _bstr_t(); // “”是文本格式的符号 Excel::RangePtr spRow10 spSheet-Rows-GetItem(_variant_t(10L)); spRow10-Interior-Color RGB(255, 255, 0); // 黄色背景 std::cout 数据写入与格式设置完成。 std::endl; } catch (const _com_error e) { std::cerr 写入数据时发生错误: e.ErrorMessage() std::endl; }注意事项批量写入与批量读取一样通过构造SAFEARRAY进行批量赋值是操作大量单元格时唯一可行的性能方案。循环单个单元格写入在数据量超过几百行时就会变得极其缓慢。资源释放手动创建的SAFEARRAY必须用SafeArrayDestroy释放否则会造成内存泄漏。_variant_t和COM智能指针在析构时会自动释放其管理的资源但这里我们手动创建了数组。格式符号NumberFormat属性可以接受标准的Excel格式字符串如“0.00”表示两位小数“yyyy-mm-dd”表示日期“”表示文本。这比通过代码转换数据类型更方便。3.4 保存、另存为与退出所有操作完成后需要妥善保存并关闭Excel释放所有COM引用。try { // 保存到原文件 spWorkbook-Save(); // 另存为新文件例如保存为CSV格式 // spWorkbook-SaveAs( // _bstr_t(LC:\\YourPath\\Data.csv), // Excel::xlCSV, // 文件格式xlCSV是枚举值 // vtMissing, vtMissing, vtMissing, vtMissing, // Excel::xlNoChange, // 访问模式 // vtMissing, vtMissing, vtMissing, vtMissing, vtMissing // ); // 关闭工作簿不保存更改 // spWorkbook-Close(VARIANT_FALSE, vtMissing, vtMissing); // 关闭工作簿并保存更改 spWorkbook-Close(VARIANT_TRUE, vtMissing, vtMissing); spWorkbook nullptr; // 退出Excel应用程序 spApp-Quit(); spApp nullptr; std::cout Excel文件已保存并关闭。 std::endl; } catch (const _com_error e) { // 如果Save失败尝试强制退出 std::cerr 保存或关闭过程中发生错误: e.ErrorMessage() std::endl; if (spApp ! nullptr) { spApp-DisplayAlerts VARIANT_FALSE; // 关闭警告 spApp-Quit(); spApp nullptr; } } // 最后在程序适当位置调用 CoUninitialize();关键技巧DisplayAlerts在退出前再次确保DisplayAlerts VARIANT_FALSE可以阻止Excel弹出“是否保存对XXX的更改”这类对话框让程序自动处理。引用释放将智能指针赋值为nullptr会触发其析构释放对COM对象的引用。正确的释放顺序是先关闭工作簿再退出应用。即使发生异常也应在catch块中尝试强制退出防止Excel进程残留。4. 常见问题排查与性能优化实战4.1 编译与链接阶段问题问题现象可能原因解决方案编译错误C2059C2143等语法错误指向.tlh文件#import生成的类型库头文件与现有代码冲突或Office版本不对。1. 检查#import路径是否正确指向Office14对应2010。2. 在#import语句中使用rename解决命名冲突如示例所示。3. 清理解决方案删除Debug/Release目录下的.tlh/.tli文件重新生成。链接错误LNK2001LNK2019提示_com_error或_variant_t相关符号未解析未链接必要的COM库。在项目属性 - 链接器 - 输入 - 附加依赖项中添加ole32.lib和oleaut32.lib。CoCreateInstance失败返回REGDB_E_CLASSNOTREG目标机器未安装Excel 2010或安装不完整。确保运行环境安装了完整版Excel 2010。可通过注册表HKEY_CLASSES_ROOT\Excel.Application\CurVer查看默认版本。4.2 运行时问题与调试技巧问题现象可能原因解决方案与调试方法程序运行到Open或CreateObject时卡住或报错Excel进程启动失败或DCOM权限问题。1.以管理员身份运行你的程序特别是Windows 7/Server系统。2. 检查任务管理器是否有残留的EXCEL.EXE进程强制结束它们。3. 暂时将spApp-Visible VARIANT_TRUE观察Excel界面是否有错误提示。4. 使用try...catch捕获_com_error打印ErrorMessage()和ErrorCode()。读取到的数字变成日期或奇怪格式单元格在Excel中设置了特定的数字格式。使用Value2属性而非Value。或者先读取NumberFormat属性判断格式再做相应转换。批量操作大量数据时程序运行极慢在循环中频繁访问单个单元格的COM接口开销巨大。必须改用批量读写。将数据准备在内存数组vector或二维数组中一次性赋值给Range的Value2。这是提升性能数量级的关键。程序退出后Excel进程仍在后台运行COM引用未正确释放或Excel有未关闭的对话框。1. 确保所有_xxxPtr智能指针在退出前都置为nullptr或使其离开作用域自动析构。2. 在Quit()前设置DisplayAlerts VARIANT_FALSE。3. 在catch块和正常退出路径都加入强制Quit()的逻辑。在多线程中调用崩溃Excel的COM对象模型默认不是线程安全的。绝对避免在多线程中直接操作同一个Excel COM对象。应采用主线程集中处理或使用生产者-消费者队列由单一线程负责与Excel交互。4.3 高级技巧与扩展思路处理多个工作表通过Worksheets-GetItem(name)或遍历Worksheets集合来操作不同Sheet。操作命名区域使用Workbook-Names集合来访问和操作已定义的名称。执行Excel公式给单元格的Formula或FormulaR1C1属性赋值字符串如spCell-Formula _bstr_t(“SUM(A1:A10)”)。读取公式结果需要读取Value2。使用后期绑定Late Binding如果不想在编译时依赖特定版本的PIA可以使用IDispatch接口进行后期绑定。但这会使代码更复杂且失去编译时类型检查。错误处理的健壮性对于自动化脚本可以考虑创建一个包装类在析构函数中确保Quit()被调用利用RAII资源获取即初始化思想管理COM生命周期。5. 替代方案简析何时该换条路走虽然本文详细介绍了通过COM自动化操作Excel但这并不是唯一的路。在项目选型时你需要权衡使用COM自动化本文方法优点功能最全能使用Excel几乎所有的功能格式、图表、公式等。无需第三方库只需Office。缺点依赖已安装的Excel速度相对慢尤其是进程间通信在多线程/服务器环境下问题多进程残留风险高。适用场景客户端桌面应用需要复杂格式操作且运行环境确保有Excel。使用第三方库如libxlsxwriter, OpenXLSX优点纯库不依赖Excel安装跨平台性能好适合服务器端生成报表。缺点通常只支持写入或读写功能有限不支持读取复杂格式或执行公式。适用场景在服务器端动态生成.xlsx报表文件。使用ODBC或ADO驱动读取优点可以将Excel文件当作数据库表来查询适合简单的数据导入。缺点需要配置数据源功能受限无法进行格式写入等操作。适用场景简单的、只读的数据抽取。导出为CSV等文本格式优点最简单通用性最强任何语言都容易处理。缺点丢失所有格式、公式和多工作表信息。适用场景数据交换对格式无要求。在我经历的那个工业数据项目中最终方案是混合使用在配置端需要复杂模板编辑使用COM自动化在嵌入式数据采集端则将数据生成CSV再由配置端程序通过COM导入到预设的Excel模板中并格式化。这样既满足了灵活编辑的需求又保证了采集端的轻量与稳定。最后记住与Office COM交互就像和一个脾气不小的老专家打交道你得严格按照它的规矩来该初始化的初始化该清理的清理传参一个都不能马虎。把上面这些代码框架和注意事项吃透你就能在C的世界里稳稳当当地驾驭Excel这艘大船了。如果遇到诡异的错误多看_com_error返回的信息多查MSDN上对应接口的文档大部分问题都能找到线索。

相关新闻

DrivNet多模态融合技术在自动驾驶行为预测中的应用

DrivNet多模态融合技术在自动驾驶行为预测中的应用

1. 项目概述:DrivNet如何革新自动驾驶行为预测在自动驾驶技术快速发展的今天,DrivNet的出现恰逢其时。这个自适应驾驶行为预测网络的核心价值在于解决了多模态交通环境下的安全预测难题。不同于传统单一传感器方案,DrivNet创新性地融合了视觉…

2026/10/16 15:13:05 阅读更多 →
C++开源项目学习指南:从工程架构到现代特性实战

C++开源项目学习指南:从工程架构到现代特性实战

1. 项目概述:为什么我们需要关注C开源项目?在技术圈子里混了十几年,我见过太多开发者,尤其是刚入行的朋友,对C的态度很复杂。一方面,它被誉为“皇冠上的明珠”,性能强悍,是操作系统、…

2026/10/16 22:23:14 阅读更多 →
车载CarLife投屏方案全解析:从基础连接到高阶调优

车载CarLife投屏方案全解析:从基础连接到高阶调优

1. 车载CarLife投屏方案概述作为一名在车载智能系统领域深耕多年的技术顾问,我见证了从传统蓝牙连接到智能投屏的技术演进。CarLife作为国内主流车机互联方案,其最大优势在于同时兼容Android和iOS两大移动操作系统。不同于CarPlay仅支持苹果设备的局限性…

2026/10/16 19:27:04 阅读更多 →

最新新闻

用蒙特卡洛模拟网约车司机生存账本:叙事新闻游戏开发实战

用蒙特卡洛模拟网约车司机生存账本:叙事新闻游戏开发实战

简介:这是一款由英国《金融时报》制作的叙事性新闻游戏,围绕优步司机的经济处境与真实生活展开,玩家需在一周内尝试赚取1000美元,并在接受采访的真实司机面前做出抉择。资源面向对零工经济、交互叙事与新闻游戏开发感兴趣的读者&a…

2026/10/17 18:36:00 阅读更多 →
内网流媒体密码安全:从最低标准到实践配置

内网流媒体密码安全:从最低标准到实践配置

很多人觉得内网里的流媒体服务,密码随便设一个六位数字就够了,反正外面的人又看不到。这话说得太轻巧了。我在实际排查里见过不少内网媒体服务器被“外人”打开过的案例,原因大多不是什么高深黑客技术,而是密码太短、太常见&#…

2026/10/17 18:36:00 阅读更多 →
Java实现MySQL到Excel高效导出与导入:POI与EasyExcel实战

Java实现MySQL到Excel高效导出与导入:POI与EasyExcel实战

1. 为什么“数据库到Excel”这个需求值得认真对待但凡做过企业级应用的人,几乎都绕不开一个场景:业务方跑过来说,“能不能把系统里的数据导出来给我,我要在Excel里做分析”。或者反过来,“我这边整理了一份Excel&#…

2026/10/17 18:36:00 阅读更多 →
把AI课件当工程项目:从信息架构到交付验证的完整路径

把AI课件当工程项目:从信息架构到交付验证的完整路径

简介:这份PPT课件围绕人工智能的现状与未来展开,面向高校学生、职场入门者及需要系统梳理AI知识框架的读者,帮助其在较短时间内建立从概念到产业应用的完整认知。内容涵盖人工智能的定义与弱、通用、强三种类型,机器人、语言识别、…

2026/10/17 18:36:00 阅读更多 →
脑机接口白皮书:医疗健康落地与脑电信号应用解析

脑机接口白皮书:医疗健康落地与脑电信号应用解析

简介:本资源为AIIA于2021年7月发布的《脑机接口技术在医疗健康领域应用白皮书》,面向医疗AI产品经理、脑科学研究者、医疗器械从业者及政策分析人员,系统梳理脑机接口(BCI)的技术原理、发展脉络与医疗应用场景。白皮书…

2026/10/17 18:36:00 阅读更多 →
QML自制数字软键盘:向TextInput/TextField键入数字并实现左移右移删除

QML自制数字软键盘:向TextInput/TextField键入数字并实现左移右移删除

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

2026/10/17 18:34:59 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →