Qt读取Excel全方案对比:QAxObject、QXlsx与CSV实践指南

发布时间:2026/10/5 9:47:33

Qt读取Excel全方案对比:QAxObject、QXlsx与CSV实践指南 写Qt程序读Excel是我这几年在Windows客户端开发里被问得最多的需求之一。财务要导报表、质量部要读检测数据、设备上位机要抄参数业务场景五花八门但最后落到C这边核心问题就一个在Qt里怎么快速、稳定、不依赖人工操作地把.xlsx或者.xls里的数据读进来。这篇文章我不打算给你堆一堆查得到的中文文档而是把我实际在项目里用过的几条路线、踩过的坑、调优过的性能数据都摊开来说。如果你正打算在Qt工程里集成Excel读取功能这篇文章应该能帮你少走不少弯路。1. 内容整体设计与思路拆解1.1 先搞清楚需求你要读的Excel到底长什么样接到需求先别急着写代码。Excel文件看起来都一样但在程序处理层面差异非常大直接影响你选哪条技术路线。我在实际项目里通常会把需求先分个类表格是xls还是xlsx格式。xls是老版本二进制格式xlsx本质是zip压缩包里面装了一堆XML文件两者读取方式完全不一样。数据量有多大。几十行和几十万行完全是两个量级处理方式天差地别。表格结构规不规整。是干干净净的二维表还是带合并单元格、标题行、多级表头、图片、公式的复杂报表。运行平台。是纯Windows还是需要跨Linux、macOS。目标机器装没装Office装的是哪个版本。这些问题没想清楚之前别碰代码。我在一个项目里就被“用户机器上装的是WPS”这个因素坑过后面会详细说。为什么一定要先分类因为不同的组合最优解完全不同。如果你的机器固定装Office且是Windows用COM组件操作Excel是最简单粗暴的如果你要跨平台COM直接出局如果你要高性能读十万行数据用QAxObject一条一条读会慢到你想砸键盘但一次性取整个Range就快得飞起。1.2 技术路线的全景梳理与选型逻辑Qt要读Excel主流的技术路线其实就这几条我把它们全部实测过技术方案依赖条件跨平台性能复杂度适用场景QAxObject COMWindows 安装Office/WPS否中批量读取时很快低业务机环境固定需要读格式复杂的报表QXlsx无纯第三方库是中低开源项目、跨平台、只需读写简单表格libxls / xlnt无是高中高性能解析.xls或.xlsx转CSV后读取需先人工或程序转格式是极高极低数据量大、格式简单、可控制数据源QSqlTableName ODBC机器需有Excel驱动仅Windows中低把Excel当数据库做SQL查询没列进来的方案还有通过Python脚本作为中转在Qt里QProcess调Python去读Excel再拿结果这个我确实也见过有人这么干。能用但不建议等于给部署环境多加了一个重量级依赖调试起来非常痛苦。我的选型逻辑很简单Windows业务机优先QAxObject因为复用机器上已经装好的Office不用额外带库跨平台或者要分发到大量未知环境的客户端优先QXlsx如果只是偶尔读一次数据且格式不复杂直接转CSV省掉所有第三方依赖。2. 核心细节解析与实操要点2.1 QAxObject读取Excel的核心原理QAxObject是Qt ActiveX模块的封装不需要我多解释大家应该都见过。它本质上是C和COM对象之间的桥梁通过它你可以调用Excel暴露出来的Application、Workbooks、Worksheets、Range等对象模型。这套模型对应到Excel用户界面就是Excel.Application对应你在任务管理器里看到的EXCEL.EXE进程Workbooks对应“已打开的Excel文件集合”Worksheets对应打开文件后的多个表页签Range对应你鼠标框选的一片单元格区域读Excel的过程本质就是把用户界面上“打开文件—选工作表—读单元格”的操作翻译成COM调用。这里想提醒一个很多新人会忽略的地方QAxObject读Excel的原理是在后台启动一个真实的EXCEL.EXE进程然后模拟用户操作这个进程。这意味着目标机器必须装Excel或者WPSWPS也提供兼容接口但细节上有不少差异读文件过程中任务管理器里能看到EXCEL进程如果程序崩溃或读完后没有正确退出EXCEL进程会残留导致内存占用持续上涨理解了这条原理你对“为什么有时候读一个文件要好几秒”“为什么杀毒软件会拦截”这类问题就不会再困惑。2.2 批量读取与逐行读取的性能差异这条我认为是读Excel里最值得展开的性能话题。我测试过用QAxObject读取一个3万行、15列的xlsx数据全部是文本和数字混合。逐行用Range读取单元格的写法大约耗时2分30秒以上。代码如下// 慢速方式逐单元格获取性能极差 for (int row 1; row rowCount; row) { for (int col 1; col columnCount; col) { QAxObject* cell sheet-querySubObject(Cells(int,int), row, col); QVariant value cell-property(Value); // 处理value... } }改成一次性获取整块已用区域QAxObject* usedRange sheet-querySubObject(UsedRange); QAxObject* valueArray usedRange-querySubObject(Value); QVariant variant valueArray-property(Value);这段代码耗时大约1.8秒。也就是说同样的数据批量取值比逐单元格取值快了一个数量级不止。为什么差别这么大因为每一次querySubObject和property调用都是一次跨进程的COM调用Excel内部要走出COM服务器、进入OLE自动化消息循环、定位单元格并返回结果。一次调用毫秒级三万行乘十五列就是45万次调用时间全耗在了进程通信的开销上。而一次性获取Value返回的是一个二维QVariantList实际上是SAFEARRAY转来的走一次COM通道就能把整个区域的数据全部打包回来。所以不管你是读100行还是读10万行第一个原则永远是能批量取就不要逐格取。3. 实操过程与核心环节实现3.1 QAxObject完整读取流程与代码实例我在项目里用的完整读取函数核心流程分六步初始化COM环境、启动Excel Application、打开Workbook、定位Worksheet、读取UsedRange数据、关闭清理。代码直接贴出来按Qt 5.15.2测试过。#include QAxObject #include QVariant #include QDebug #include QStringList // 读取Excel文件返回二维QString列表 QVectorQStringList readExcelByAxObject(const QString filePath, int sheetIndex 1) { QVectorQStringList result; // 1. 初始化COM环境Qt5通常在main中已经初始化没有的话需要HRESULT hr CoInitializeEx(nullptr, COINIT_MULTITHREADED); QAxObject* excel new QAxObject(Excel.Application, nullptr); if (excel-isNull()) { qWarning() Excel.Application 创建失败请确认是否安装Excel; delete excel; return result; } // 2. 设置是否显示界面不要弹窗去掉警告 excel-setProperty(Visible, false); excel-setProperty(DisplayAlerts, false); // 3. 打开Workbook QAxObject* workbooks excel-querySubObject(Workbooks); if (!workbooks) { delete excel; return result; } QAxObject* workbook workbooks-querySubObject(Open(const QString), filePath); if (!workbook) { qWarning() Workbook 打开失败: filePath; excel-dynamicCall(Quit()); delete excel; return result; } // 4. 定位Worksheet QAxObject* worksheets workbook-querySubObject(Worksheets); if (!worksheets || worksheets-property(Count).toInt() sheetIndex) { workbook-dynamicCall(Close(bool), false); excel-dynamicCall(Quit()); delete excel; return result; } QAxObject* sheet worksheets-querySubObject(Item(int), sheetIndex); // 5. 获取已用区域的值 QAxObject* usedRange sheet-querySubObject(UsedRange); QAxObject* valueArray usedRange-querySubObject(Value); QVariant variant valueArray-property(Value); // 6. 解析QVariant为二维容器 // 这里要特别注意如果只有一格数据variant是单个QVariant // 如果是一行或一列variant可能是一个QVariantList // 只有多行多列才是 QVariantList 里嵌套 QVariantList。 if (variant.typeId() QMetaType::QVariantList || variant.canConvertQVariantList()) { QVariantList rows variant.toList(); for (const QVariant rowVar : rows) { QStringList rowData; QVariantList cols rowVar.toList(); for (const QVariant cellVar : cols) { rowData cellVar.toString(); } result.append(rowData); } } else { QStringList rowData; rowData variant.toString(); result.append(rowData); } // 7. 关闭文件退出Excel释放资源 workbook-dynamicCall(Close(bool), false); excel-dynamicCall(Quit()); delete valueArray; delete usedRange; delete sheet; delete worksheets; delete workbook; delete workbooks; delete excel; return result; }这段代码看起来不复杂但每一行都有讲究。我重点说几个容易出问题的细节第一个是DisplayAlerts必须设为false。如果Excel弹出一个“是否保存更改”的对话框而你的程序在后台看不见这个弹窗整个读取流程就会卡住看起来像程序死掉了。这个我踩过很惨的坑调试器一挂就卡在dynamicCall返回值上等不到结果。第二个是QVariant的解析结构。Excel COM组件返回的Value属性在不同区域形状下返回的QVariant结构完全不同。单个单元格返回普通QVariant一行数据返回QVariantList一个矩形区域返回QVariantList套QVariantList。如果你不判断就直接遍历大概率得到空值。上面代码里我做了类型判断这是实战总结出来的。第三个是QAxObject指针的释放顺序。Workbook要CloseExcel要Quit最后再delete这些QAxObject对象。我曾经只delete对象没调Quit最后任务管理器里堆满了EXCEL.EXE进程上线测试直接被客户吐槽“你们这程序每次读个Excel电脑就卡成PPT”。3.2 处理QVariant返回值的细节从SAFEARRAY到二维表刚接触COM读Excel的人最晕的就是这个QVariant返回值。我来把这个拆开揉碎讲清楚。Excel COM的Range.Value属性返回的其实是一个SAFEARRAYQAxBase收到这个COM类型后会对它做转换多行多列时最终会转成QVariant的嵌套结构。这个结构长什么样你可以这样打印出来看QVariant v valueArray-property(Value); qDebug() v.typeName(); // 可能是QVariantList qDebug() v.toStringList(); // 千万别直接这么干有次我在QAx容器里用qDebug直接dump发现第一层是QList 里面每个元素又是QList 。但如果你用Python写同样的功能拿到的struct序列在打印时看起来又是另一种。这就是COM转换的“方言”问题。在实际解析时我还习惯先探测行数和列数而不是直接在嵌套List里硬遍历。办法是分别取Rows和Columns属性int rowCount usedRange-property(Rows).toInt(); int colCount usedRange-property(Columns).toInt();这个数据能辅助你判断解析出来的嵌套列表维度是否跟预期一致。我在项目里就遇到过Excel COM返回的行列数和用户实际看到的行数不一样的情况因为UsedRange把一些格式化了但没写内容的空单元格也算进去了导致返回的二维表尾部全是空字符串。这个现象后面排查章节会细说。3.3 使用QXlsx实现跨平台读取如果程序要发到多平台QAxObject就完全失效了。我个人的方案是用QXlsx这个开源库它从xlsx的zip包里直接解析XML不依赖Office纯C实现MIT协议可以直接编译进工程。使用前先拿到库一般两种方式一是引用Qt官方仓库里例子带的QXlsx源码二是到GitHub上拉取编译。我的做法是把QXlsx的源码头文件直接放到Pro文件里的INCLUDEPATH然后编译。核心读取代码非常简洁#include xlsxdocument.h #include xlsxcellrange.h #include xlsxcell.h void readExcelByQxlsx(const QString filePath) { QXlsx::Document xlsx(filePath); if (!xlsx.isLoadPackage()) { qWarning() QXlsx 加载失败; return; } // 定位第一个工作表 QXlsx::Worksheet* sheet xlsx.currentWorksheet(); if (!sheet) { return; } // 获取行数和列数QXlsx把第一行定义为1而不是0 int rowCount sheet-dimension().rowCount(); int colCount sheet-dimension().columnCount(); for (int row 1; row rowCount; row) { QStringList rowData; for (int col 1; col colCount; col) { QVariant cell xlsx.read(row, col); rowData cell.toString(); } // 处理rowData... } }从代码量看比QAxObject简单不少。但用QXlsx有几个文件格式层面的限制你需要提前知道它只能读.xlsx不能读老格式.xls。解决方案是把.xls文件先用Office另存成.xlsx或者再套一个libxls去解析.xls。xlsx文件如果被Excel加密或设置了打开密码QXlsx拿不到有效内容。它读取公式单元格时得到的是公式计算后的“缓存值”如果文件是用WPS生成的有些公式缓存值可能是空的这时你读到的是空字符串。合并单元格的处理需要自己判断QXlsx本身不会自动给你把合并区域的值扩展到所有单元格。如果数据量非常大QXlsx的耗时比COM批量读稍慢。实测读一个20万行、4列的.xlsxQXlsx大约要4~5秒QAxObject批量读在2秒以内。但QXlsx的好处是崩溃概率要低很多跨进程COM那种“读到一半Excel弹窗卡死”的情况基本没有。3.4 CSV中转方案最快但最需要前置条件其实在不少“能控制的场景”里我的第一选择反而是转CSV再读。比如数据源的Excel文件名和格式固定用户也愿意做一个“导出CSV”动作或者VBA脚本定时转换那在Qt里读CSV就只需要一个循环分行的函数。转换通常用Excel本身能力或者WPS的另存为CSVQt这边一次性读取到二维表bool readCsvFile(const QString filePath, QVectorQStringList rows) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return false; } QTextStream in(file); // CSV文件经常是GBK编码需要根据实际文件切换 in.setEncoding(QStringConverter::Encoding::System); while (!in.atEnd()) { QString line in.readLine(); // 简单按逗号分割注意真正的CSV有引号和转义处理这里仅是简化示例 QStringList fields; QString field; bool inQuote false; for (QChar ch : line) { if (ch ) { inQuote !inQuote; } else if (ch , !inQuote) { fields.append(field.trimmed()); field.clear(); } else { field.append(ch); } } fields.append(field.trimmed()); rows.append(fields); } file.close(); return true; }这段代码里我特意处理了双引号包裹的内容因为Excel导出的CSV如果某个字段里含逗号、换行或引号会自动用双引号把它包起来这是CSV标准。如果你只按逗号分隔不做引号处理读到的数据铁定错位。CSV方案读取速度极快百万行也能在1秒内读完毕竟是纯文本解析。但编码问题比较头疼。Windows上中文环境Excel另存为CSV默认是ANSI也就是GBK编码。Qt里QTextStream默认按UTF-8解析直接读中文必乱码。解决方式是在打开文件后设置编码为System对应本地代码页或者干脆用QTextCodec::codecForName(GB18030)这个编码对简体中文兼容性最好。4. 常见问题与排查技巧实录4.1 Excel.Application创建失败的几种原因QAxObject读Excel时最离谱的问题就是excel-isNull()返回true说明COM对象创建失败。我在不同客户机器上遇到的原因大概有四类第一是目标机器压根没装Office或WPS这没啥好说的。第二是装了Office但组件服务里禁止了自动化操作这个要用dcomcnfg打开组件服务在“Microsoft Excel应用程序”属性里把访问权限和启动权限改成允许。第三是杀毒软件拦截Excel进程启动没起来或者启动即被杀。这里比较挠头因为杀毒软件不会给你弹提示但查“拒绝访问”相关日志能发现线索。第四是用户装的Office是Microsoft Store版本这种版本的专业版对自动化支持极差经常创建失败。我后来做项目时会在启动时用一个空COM调用做“冒烟测试”失败就直接提示用户“当前环境不支持程序自动化读取Excel请安装桌面版Office或WPS”。4.2 日期、数字变成一串数字的问题这是读Excel最常见的第二个坑。COM方式读到的日期类型在QVariant里可能转成double比如2024年1月15日读出来可能是一个长得像“45254.0”的数字。这个数字是Excel内部的日期序列号它从1900年1月1日开始计天数这个规则还带个Bug1900年2月29日也被算进去了这是Excel历史遗留问题。我在使用时的处理方式读到的单元格如果isValid()且类型是double先判断这个数是否在一个合理日期范围内通常大于20000小于80000然后转成QDate。转换公式是QDate excelSerialToDate(int serial) { // Excel认为1900-01-01为第1天但实际转换算法从1899-12-30开始 QDate baseDate(1899, 12, 30); return baseDate.addDays(serial); }特别注意这个1899-12-30不是笔误。Excel的日期序列号对应关系很反直觉1900-01-01是11900-02-28是591900-03-01是6160是那个不存在的2月29日所以从1899-12-30起算才能对得上。QXlsx读日期时相对好一些它读到的是带日期格式的单元格会解析成QDateTime类型但前提是xlsx文件里单元格记录的样式类型被你读出来了如果直接调read()到QVariant再toString会丢掉格式信息。4.3 读取大Excel内存和速度的取舍之前测试过一个38MB、30万行的xlsx文件QAxObject批量取值的时候内存增长大概600MB因为整个二维QVariantList一次性装进来了。QXlsx同样读这个文件内存直接飙到1.2GB差点把我那台测试机搞死。所以当数据量超过十万行以后我的处理策略是能转CSV优先转CSV流式逐行读内存占用恒定。必须用COM时按Range分批取比如每1万行取一次每次取完立即转存到本地QVector里释放QVariant。别等整个文件都取完再处理。必须用QXlsx时用read()单个格的方式读不用sheet-allDataToStringList()这种把整个表加载到内存的函数同时读一行清一行。还有一个很多人没意识到的经验读Excel的时候Excel进程本身也会占内存如果你的程序要长时间运行且频繁读Excel建议每次读完都把Excel进程Quit掉不要在整个程序生命周期里复用一个Excel.Application对象。原因是我遇到过一次内存泄漏定位发现是COM对象在反复Open/Close后Excel进程没有真正退出最后整个应用被系统拖死。5. 常见需求场景的配套扩展5.1 每隔一段时间轮询读取Excel文件的监控场景有的设备类项目需要在固定时间间隔去读取一个Excel文件比如产线设备每5秒检查一次参数表是否有更新。这种情况下反复启动Excel进程再退出的开销比较大每次都1秒起步。更稳的做法是先用QFileSystemWatcher监听文件是否被修改如果被修改再重新读而不是定时去轮询。QFileSystemWatcher* watcher new QFileSystemWatcher(this); watcher-addPath(filePath); connect(watcher, QFileSystemWatcher::fileChanged, this, [](const QString path) { // 延迟500ms处理防止Excel保存过程中文件还没写完全 QTimer::singleShot(500, this, []() { QVectorQStringList rows readExcelByAxObject(path); handleNewRows(rows); }); });注意Excel在保存文件时通常不是一个原子操作它会写入临时文件再替换所以QFileSystemWatcher可能触发多次fileChanged信号也可能文件被旧文件覆盖后watch失效。每次文件变更后需要重新watcher-addPath(filePath)再监听一次这是个老坑了。还要注意一个问题监听器函数里再调QAxObject打开同一个Excel文件如果这个文件此刻正被用户用Excel手动打开COM的Open调用会失败或者弹只读提示。常规做法是捕获异常后重试两三次或者提示用户先关闭文件。5.2 将读取的Excel数据回写到数据库数据读进来以后大多数业务场景并不是在界面上展示就完了而是要入库。这里容易犯的错是拿着QVariantList一层一层嵌套访问后再一条条insert到SQLite/MySQL里。我的经验是先把二维表结构统一转换成业务结构体向量或者直接用QVectorQStringList然后用一个事务批量提交不要每行单独commit。以SQLite为例QSqlDatabase db QSqlDatabase::database(); db.transaction(); QSqlQuery query(db); query.prepare(INSERT INTO table_test (col1, col2, col3) VALUES (?, ?, ?)); for (const QStringList row : rows) { query.addBindValue(row.value(0)); query.addBindValue(row.value(1)); query.addBindValue(row.value(2)); query.exec(); } db.commit();十万行数据用这种方式入库可能30秒内完成。你要是逐条自动提交每一条都触发一次磁盘fsync速度慢十倍以上是正常的。5.3 处理读取结果在界面上的刷新策略QTableWidget一次性插入几万行会被卡到爆这个应该不用我多说了。经验做法是分页显示比如每次只往表格里放500行配合QAbstractTableModel自定义model。数据源就用前面读到的QVectorQStringListmodel里存这个二维表的引用界面函数里根据可视区域动态设置可见行。这里有一个建议不管界面显示多少行底层二维表数据结构是完整存在的model按需返回对应row/column的值就好。这样可以避免用户只拉了第一页数据却把几万行全部塞进界面控件里的低级性能问题。6. 我最终的使用建议这篇文章我写了大概这么多字核心其实可以提炼成几句掏心窝子的大白话。如果你的程序只跑Windows业务机统一装Office而且需要读格式复杂的Excel那么用QAxObject走COM方案准没错性能用批量取Range方式完全够用。注意封装好文件打开失败、Excel进程残留、日期序列号转换这几个点基本可以稳定运行。如果程序要跨平台或者要打包发布给大量未知环境QXlsx是最稳妥的选择零依赖、简单、可控。牺牲一点点性能换来了部署环境的干净这笔账是划算的。如果Excel的数据你能用“另存为CSV”这个前置条件解决那请优先选CSV路线这是所有方案里最省心、最快、最不挑环境的方式。根据我个人经验最怕的不是“用什么库”而是“拿到一个Excel就开始埋头写代码”。做之前先想清楚文件的规模、格式、运行环境以及后续数据去往哪里通常能帮你避开大部分坑。如果你也在这个方向上踩过别的坑欢迎分享出来这玩意儿真是一个人踩一遍不够的。
延伸阅读

更多相关文章

2026/10/5 9:47:33

CFD边界层网格与y+实战:从理论估算到Fluent Meshing设置

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

2026/10/5 9:47:33

ROS2+SLAM+Nav2打造可调试扫地机器人全栈指南

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

2026/10/5 9:47:33

Xilinx FPGA程序固化指南:从Bit文件到MCS文件的转换与选型

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

2026/10/5 10:47:37

Linux alias命令实战:终端效率与运维日常的必备技能

做 Linux 运维和开发这些年,要说哪个命令最不起眼又最能提升日常效率,我投系统设置里的 alias 一票。它不炫技,不复杂,甚至文档里就几行参数,但真用好了,一天下来能帮你省下几百次重复敲键。这篇就围绕 Lin…

2026/10/5 10:47:37

组织学习,工业4.0转型的隐形瓶颈

前阵子和一个负责智能工厂建设的朋友聊天,他说现在最头疼的其实不是服务器宕机、也不是设备联网率不够,而是产线上那群干了十几年的老师傅,宁可凭手感调机,也不愿意看系统推荐的数据参数。另一边新招的工程师懂算法、会建模&#…

2026/10/5 10:47:37

Git提交后如何取消某个文件?reset、revert、amend三种方案详解

刚开始用 Git 的时候,八成的人都干过这种事:一口气git add了一堆文件,顺手git commit提交了,结果提交完才反应过来——坏了,有个文件根本不该进来。也许是本地数据库配置,也许是 IDE 的私有配置文件&#x…

2026/10/5 10:47:37

ShuffleNet轻量网络实战:从原理到菠萝成熟度分类部署

简介:基于ShuffleNet轻量级卷积神经网络的菠萝成熟度分类实战项目,面向图像分类入门与轻量模型应用学习者,含完整代码、数据集与训练权重,解压后可直接运行。数据集覆盖没熟、半熟、成熟等8个成熟阶段,训练集4808张、测…

2026/10/5 10:42:37

车企呼叫中心自建实施方案:从需求梳理到验收避坑指南

简介:企业智能呼叫中心系统建设实施方案文档,定位为商务技术方案范文与模板,面向呼叫中心项目经理、IT规划人员、售前顾问及企业客服体系管理者,解决从业务现状梳理到系统落地全过程缺少标准化方案的痛点。压缩包内为单个Word文档…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑