新闻详情

新闻详情

首页 / 资讯中心 / 详情

Qt操作Word:基于COM接口的QAxObject实战与避坑指南

发布时间:2026/10/2 18:41:55来源:尧图网络
Qt操作Word:基于COM接口的QAxObject实战与避坑指南
简介面向需要在Qt应用中操作Word、Excel文档的C开发者这套QtOffice轻量代码包围绕QtWord与QTOffice的常用接口做了二次封装解决直接调用Office COM、OLE等复杂机制带来的高门槛问题。压缩包体积仅5KB内部共5个文件主要包括word_operator、excel_operator两组头文件与实现文件以及一份readme.txt说明文档结构一目了然适合快速引入小型工程。已有521人学习下载。代码中示范了创建/打开文档、插入段落文本、读写表格数据等核心场景并以较短的示例链展示了从QWDocument到QWParagraph的典型用法方便读者直接套用readme.txt中补充了编译依赖和调用要点可帮助初学者避开常见坑位。对希望快速产出文档处理Demo、或需要抽取基础操作模块做二次开发的Qt工程师而言这套小资源比翻阅零散资料更直接也便于在此基础上扩展样式、图片等高级功能。1. Qt 操作 Word能落地的不是 QTextDocument而是走 COM 这条通道做上位机的人迟早会遇到一个需求程序里攒了一批结构化数据客户不要 Excel、不要 PDF就要一份排版工整的 Word 报告——带目录、带页眉页脚、表格列宽固定、图片嵌在指定段落。用 QTextDocument 生成 docx 能解燃眉之急但一到目录域、页眉页码、表格列宽这些 Word 原生功能就露怯写出来的文档在 Office 里一打开各种细节走样。qtword 这类资源走的是另一条路让 Qt 程序通过 COM 接口直接驱动本机 Word所有排版动作和你手动开 Word 操作完全一致生成的就是一等公民 docx。这份资源的核心价值是把 Word 的 COM 对象模型封装成一组 Qt 类调用方不用记那一长串dynamicCall签名。要评估它能不能用、怎么集成、踩过哪些坑得先把 COM 这条通道的原理看清楚。这篇就把我从拆包到落地生成报告的完整过程摊开讲含参数、代码和五个高频翻车点。2. 先看懂底层ActiveX/COM 对象模型与 QAxObject 的对应关系2.1 Word 对象模型的访问路径Application → Documents → Document → RangeQt 操作 Word 依赖的是 ActiveQt 模块里的QAxObject它做的事本质上是 COM 调用。Word 暴露给外部程序的接口是一棵对象树所有操作都是在这棵树上定位节点、读属性、调方法ApplicationWord 程序本身控制可见性、弹窗、退出Documents打开的文档集合可Add、OpenDocument单个文档包含段落、表格、书签、域Range/Selection文档里的区域或当前光标位置文本写入、格式设置主要在这层Tables/InlineShapes/Fields表格、图片、域字段的集合对应到 Qt 代码是层层querySubObject往下钻最后用dynamicCall或setProperty执行动作#include QAxObject #include QAxWidget QAxObject* word new QAxObject(Word.Application, this); word-setProperty(Visible, false); QAxObject* docs word-querySubObject(Documents); QAxObject* doc docs-querySubObject(Add()); QAxObject* selection word-querySubObject(Selection); selection-dynamicCall(TypeText(const QString), 第一个段落);new QAxObject(Word.Application, this)里的字符串是 ProgIDWindows 注册表里注册好的 COM 标识setProperty(Visible, false)对应 VBA 里的word.Visible FalsequerySubObject(Documents)返回集合对象querySubObject(Add())注意带括号表示执行方法而非取属性。dynamicCall第一个参数里const QString是类型描述符告诉 COM 参数按什么类型封送。2.2 qtword 这类资源一般怎么封装拆这类资源包时里面的组织方式通常高度一致一个负责进程生命周期的 Office 单例一个封装常用文档操作的 Word 类再加一个示例工程。核心是把dynamicCall的细节收进方法内部调用方只传文件名、行数、列数这种业务参数。我见过的主流封装风格是两层。底层一个OfficeApp类管Word.Application的创建、可见性、退出和进程回收上层一个QtWord类管文档动作头文件里的方法签名大致长这样class QtWord { public: bool openDocument(const QString path); // 打开已有文档 bool saveAs(const QString path, int format); // 保存/另存 bool insertTable(int rows, int cols); // 在光标处插入表格 bool setCellText(int row, int col, const QString text); bool insertImage(const QString imagePath, int width); bool setParagraphAlign(int align); // 对齐方式用枚举 bool addBookmark(const QString name); bool replaceBookmark(const QString name, const QString text); void closeDocument(); };注意这类资源里常见的约定所有int参数都对应 Word VBA 里的枚举值比如对齐方式 1 是居中、2 是右对齐、3 是两端对齐。头文件里一般会有一组常量定义没有的话就自己补一份后面写代码会频繁用到。2.3 环境准备pro 文件、编译期版本与 COM 注册先说工程配置。要在.pro文件里加一行QT axcontainer这会把 ActiveQt 模块引进来。然后确认 Qt 套件和编译器配对Windows 上常见是 Qt 5.15.2 配 MSVC2019 64 位新工程用 Qt 6 配 MSVC2022 也很多。这里有个非常典型的报错新手会被直接劝退fatal: cannot mix incompatible qt library (version ex50601) with this librarversion ex50601意思是某个库文件是用 Qt 5.6.1 编译的和你当前用的 Qt 版本不是一套。原因一般是 PATH 里混入了旧版 Qt 的 bin或某个第三方库自带了老版本 dll。解决方式是打开Qt Creator → 工具 → 选项 → 构建套件确认编译器与 Qt 版本匹配再查一下PATH里有没有多个 Qt 目录把不需要的挪掉。我一般还会顺手qmake -v验证一下当前解析到的 qmake 路径。还要确认目标机器上 Word 的 COM 组件可用。注册表里查一下reg query HKCR\Word.Application /s能查到CLSID说明 COM 注册正常。装的是 WPS 的话这个 ProgID 也会注册但行为差异很大后面避坑章节会展开。另外提示一句某些精简版 Office 安装时被砍了 COM 组件QAxObject创建出来是空指针跑之前最好在程序里做一次空判断。3. 把 qtword 用起来从空文档到带表格图片的成品 Word3.1 创建文档与基础写入的完整流程有了封装类生成一份带文字的 docx 只关注业务逻辑就行。核心流程是启动 Word 进程 → 新建文档 → 拿Selection当光标 → 逐段写文字 → 保存关闭。手动操作 Word 时所有「光标在哪、往哪敲」的动作在 COM 里都由Selection对象承担。bool QtWord::createDocument(const QString outputPath) { m_word new QAxObject(Word.Application, this); if (m_word-isNull()) return false; // 本机没装 Word 或 COM 注册异常 m_word-setProperty(Visible, false); // 后台运行不弹界面 m_word-setProperty(DisplayAlerts, 0); // 关掉弹窗wdAlertsNone QAxObject* docs m_word-querySubObject(Documents); m_doc docs-querySubObject(Add()); QAxObject* sel m_word-querySubObject(Selection); sel-dynamicCall(TypeText(const QString), 这是报告标题); sel-dynamicCall(TypeParagraph()); // 回车换段 bool ok saveAs(outputPath, 16); // 16 wdFormatDocumentDefaultdocx closeDocument(); delete m_word; return ok; }DisplayAlerts设为 0 很关键。不关的话保存文件遇到同名文件、格式兼容性检查都会弹模态对话框后台模式下一弹窗整个调用就挂住了。TypeParagraph()对应敲一次回车TypeText只负责输入文字不做换行。保存用SaveAs2还是SaveAs看 Word 版本Word 2010 以后建议走SaveAs2老接口也能用但个别新格式枚举不认。3.2 表格创建、数据填充与列宽控制表格是这份资源的重头戏。Word 的表格用Tables.Add创建传入一个Range指定插入位置再给行数列数。默认新建的表格会自动调整列宽适应内容这会导致你精心设计的列宽被内容撑变形。要做固定列宽先关自动调整再逐列设宽度bool QtWord::insertTable(int rows, int cols, const QVectorQVectorQString data) { QAxObject* sel m_word-querySubObject(Selection); QAxObject* rng sel-querySubObject(Range); QAxObject* tables m_doc-querySubObject(Tables); QAxObject* table tables-querySubObject( Add(QVariant, int, int, int), QVariant(rng-asVariant()), rows, cols, 1); // wdAutoFitFixed 0固定布局不让内容撑开列 table-dynamicCall(AutoFitBehavior(int), 0); // 逐格写入 for (int i 1; i rows; i) { for (int j 1; j cols; j) { QAxObject* cell table-querySubObject(Cell(int, int), i, j); QAxObject* cr cell-querySubObject(Range); cr-setProperty(Text, data[i-1][j-1]); } } // 统一列宽按磅值设置 double totalWidth 420.0; // A4 纸正文宽度约 420 磅 double colWidth totalWidth / cols; QAxObject* columns table-querySubObject(Columns); columns-dynamicCall(SetWidth(float, int), colWidth, 0); return true; }Tables.Add的四个参数里第一个Range用QVariant包一层是因为 COM 的 Range 参数类型是变体第四个参数 1 对应wdWord8TableBehavior意思是表格允许自动调整。随后AutoFitBehavior(0)把它关掉这一步不做的话列宽设置会被后续输入的内容覆盖。SetWidth第二个参数RulerStyle传 0 表示只调整当前列相邻列不动。实践中我发现Cell.Range直接setProperty(Text, ...)比TypeText快得多适合批量灌数据。3.3 图片插入与环绕方式控制图片插入有两个 API 要分清。InlineShapes.AddPicture把图片当作一个字符嵌进文字流前后文字自动绕行适合绝大多数正文插图Shapes.AddPicture插入的是浮动图独立于文字层可以做自由拖拽。qtword 里默认用内嵌图因为浮动图的定位在 COM 里要么基于页边距要么基于段落坐标换算非常容易翻车bool QtWord::insertImage(const QString imagePath, int widthPts) { // 内嵌图随文字流排版不跑位 QAxObject* sel m_word-querySubObject(Selection); QAxObject* rng sel-querySubObject(Range); QAxObject* shapes m_doc-querySubObject(InlineShapes); QAxObject* img shapes-querySubObject( AddPicture(const QString, bool, bool, QVariant), imagePath, false, true, QVariant(rng-asVariant())); // LockAspectRatio -1 (msoTrue)按比例缩放 img-setProperty(LockAspectRatio, -1); img-setProperty(Width, widthPts); return !img-isNull(); }AddPicture四个参数图片路径、是否链接到外部文件、是否随文档保存、插入位置。第二个参数写false会把图片嵌入文档而不是外链否则换机器打开就裂图第三个参数true保证图片体积打进 docx。LockAspectRatio设-1msoTrue后只设宽度高度自动按比例走。这里有个性能坑大分辨率原图直接插入会让 docx 膨胀几十兆。我一般插入前先用QImage把图缩到合适宽度再落盘报告类文档 150dpi 足够生成速度快一半不止。3.4 保存与格式切换docx、PDF 还是老 doc保存是最后一道工序也是容易翻车的地方。Word 的保存格式靠枚举值区分qtword 里通常预置了常见格式常量。SaveAs2的第二个参数传整数常用的几个格式枚举值对应格式wdFormatDocumentDefault16.docxWord 默认wdFormatXMLDocument12.docx严格 XMLwdFormatDocument970.doc老格式wdFormatPDF17.pdfwdFormatText2纯文本bool QtWord::saveAs(const QString path, int format) { if (!m_doc) return false; QAxObject* doc m_doc-querySubObject(Document); // 拿到底层文档对象 bool ok doc-dynamicCall(SaveAs2(const QString, int), path, format); return ok; }导出 PDF 和 docx 走同一条路径只是枚举值不同。注意SaveAs2只存在于 Word 2010 以后的 COM 接口部分精简版或旧版 Word 只有SaveAs稳妥做法是先用querySubObject探测有没有SaveAs2方法没有就退回SaveAs。保存完成后记得closeDocument()里做两件事先m_doc-dynamicCall(Close(bool), false)关闭文档再m_word-dynamicCall(Quit())退出 Word 进程顺序反了容易进程残留。4. 样式与排版控制字体、段落、页眉页脚与目录域4.1 字体和段落设置Com 参数和 Word 界面对照写报告不能全是默认正文样式。字体、字号、加粗、对齐、行距这些手动操作里最常用的动作在 COM 里都是Font和ParagraphFormat对象的属性。先看一段典型的「写完标题后立刻设格式」的代码void QtWord::setHeadingStyle(const QString text, int level) { QAxObject* sel m_word-querySubObject(Selection); sel-dynamicCall(TypeText(const QString), text); sel-dynamicCall(TypeParagraph()); // 选刚才输入的整段 QAxObject* rng m_doc-querySubObject(Range(int, int), sel-asVariant(), sel-asVariant()); // 上面这行示意实际常用 GetRange 传起点终点 QAxObject* font sel-querySubObject(Font); font-setProperty(Name, 微软雅黑); // 中文字体直接传名 font-setProperty(Size, 16); font-setProperty(Bold, true); QAxObject* fmt sel-querySubObject(ParagraphFormat); fmt-setProperty(Alignment, 1); // 1 wdAlignParagraphCenter居中 fmt-setProperty(SpaceAfter, 12); // 段后 12 磅 }字体名要传 Word 认得的字体显示名称比如「微软雅黑」而不是「Microsoft YaHei」否则中文环境会回退。Bold属性在 COM 里是布尔型setProperty直接传true即可。Alignment的值对应界面上五个按钮0 左对齐、1 居中、2 右对齐、3 两端对齐、4 分散对齐。这一段「输入 → 选中 → 设格式」的顺序是手动操作的习惯COM 里也完全一致。4.2 页眉页脚与页码域为什么域字段必须手动更新页眉页脚是文档规范化的重头戏。COM 里通过Sections定位节再取Headers或Footers集合。页眉里写公司名页脚里插页码域——注意页码不是普通文字是 PAGE 域插入后必须更新域才会显示正确的数字void QtWord::setupHeaderFooter(const QString headerText) { QAxObject* section m_doc-querySubObject(Sections(int), 1); // 1 wdHeaderFooterPrimary正文页眉 QAxObject* header section-querySubObject(Headers(int), 1); QAxObject* hr header-querySubObject(Range); hr-setProperty(Text, headerText); // 页脚插页码域wdFieldPage 33 QAxObject* footer section-querySubObject(Footers(int), 1); QAxObject* fr footer-querySubObject(Range); QAxObject* fields fr-querySubObject(Fields); fields-dynamicCall(Add(QVariant, int, QVariant, QVariant), QVariant(fr-asVariant()), 33, PAGE, QVariant(false)); // 页脚域更新 fr-dynamicCall(Fields.Update()); }页眉里如果只是静态文字直接给Range.Text赋值即可。页码必须走Fields.Add第三参数传域指令字符串PAGE。最关键的是最后一行fr-dynamicCall(Fields.Update())不做这一步生成的 docx 打开后页码显示为空或全为 0。手动在 Word 里按 CtrlA 再 F9 更新域对应代码就是这里。很多新手生成的文档页眉有字、页码空白根因就是域没更新。4.3 目录域与分节分页Word「最后一页删不掉」是怎么发生的目录是域不是文字。选好插入点后用Fields.Add插入 TOC 域域指令里带\o 1-3表示提取大纲级别 1 到 3 的标题。如果文档标题用了「标题 1」「标题 2」样式目录就能自动收集void QtWord::insertToc() { QAxObject* sel m_word-querySubObject(Selection); sel-dynamicCall(TypeParagraph()); QAxObject* rng sel-querySubObject(Range); QAxObject* fields m_doc-querySubObject(Fields); // wdFieldTOC 13域指令不带引号外层转义 fields-dynamicCall(Add(QVariant, int, QVariant, QVariant), QVariant(rng-asVariant()), 13, TOC \\o \1-3\ \\h \\z \\u, QVariant(false)); // 目录域必须整体更新否则生成的是空的域外壳 m_doc-querySubObject(Fields)-dynamicCall(Update()); }\h表示目录条目带超链接\z隐藏网页版式里的页码\u使用大纲级别。目录域插入后不更新打开文档会看到一片空白或者提示「错误未找到目录项」。碰到的另一个玄学问题是「word 最后一页死活删不掉」。手动操作时删不掉的大都是分节符或空段落残留。代码生成时同样会发生在文档末尾多打了一个TypeParagraph()或者插入了分节符Selection.InsertBreak。排查方法是打开 Word 显示所有格式标记看到结尾有§或多余的回车符把它们从生成逻辑里去掉别指望用户手动删。4.4 用书签做占位符替换比 Find.Execute 更抗折腾模板报告还有一个高频需求打开一个带占位符的 docx 模板把{{客户名称}}这种标记替换成真实数据。最常见做法是Find.Execute全文替换但那个方法有十一个参数类型和顺序记错一次就翻车。qtword 里我更推荐书签方案模板里预先插好书签代码里找到书签位置直接改写文本bool QtWord::replaceBookmark(const QString name, const QString text) { QAxObject* bookmarks m_doc-querySubObject(Bookmarks); if (!bookmarks-querySubObject(Exists(const QString), name)) { return false; } QAxObject* item bookmarks-querySubObject(Item(const QString), name); QAxObject* rng item-querySubObject(Range); rng-setProperty(Text, text); return true; }Bookmarks.Exists先判断书签存在避免替换空指针。给Range.Text赋值会整体替换书签范围内的内容书签本身保留这意味着可以反复填。相比Find.Execute书签方案不用维护正则转义对模板维护者更友好。模板里插入书签的操作也简单选中占位文字菜单「插入 → 书签」命名用英文或拼音避免编码问题。5. 避坑清单Qt 驱动 Word 的五个高频翻车点5.1 winword.exe 进程残留第二次调用直接失败现象程序第一次生成文档正常第二次运行时报错「文档正由另一用户使用」或 COM 调用超时。打开任务管理器winword.exe 躺了一排。原因QAxObject析构不会自动调用 Word 的Quitm_doc和m_word两个对象只要有一个没释放Word 进程就驻留后台锁住文档和 COM 接口。解决关闭顺序必须固定——先关文档Close(false)再退进程Quit()最后delete m_word。false参数表示不保存更改因为前面已SaveAs2。进程残留后手动taskkill /f /im winword.exe清场再跑我在封装类析构函数里也加了保险if (m_word) { m_word-dynamicCall(Quit()); delete m_word; m_word nullptr; }。5.2 SaveAs 文件 0 字节或打不开枚举值和路径都有问题现象保存成功但生成的文件 0 字节或者在 Word 里打不开报「文件损坏」。原因两类。一是FileFormat传错了枚举比如把 12 和 16 混用老接口不认新枚举二是中文路径或带空格路径没处理COM 接口对路径里的特殊字符敏感。解决路径统一用QDir::toNativeSeparators转成反斜杠枚举值写常量不要散落各处。我用时固定走SaveAs2格式参数枚举写死在头文件里static const int FormatDocx 16; static const int FormatPdf 17;。生产代码里保存后立刻调QFile::exists校验字节数大于零小于 1KB 的基本就是保存失败了。5.3 表格列宽设了却「无法拖动」现象生成文档里表格列宽是对的但用户在 Word 里手动拖动列宽时拖不动或者一输入内容列宽就被撑开乱了。原因表格的AutoFitBehavior仍处于自动调整状态允许内容自适应列宽手动拖拽被布局锁定。解决创建表格后依次执行table-dynamicCall(AutoFitBehavior(int), 0)wdAutoFitFixed和table-setProperty(AllowAutoFit, false)。AllowAutoFit关掉后表格完全听你摆布再配合前面Columns.SetWidth固定每列宽度。还有一个隐藏坑表格最后一列宽度会被 Word 自动补足到页面宽度如果发现列宽总差几磅检查页面PageSetup的左右边距是否与totalWidth一致。5.4 图片插入后把段落挤没或盖住正文现象插入的图片不在预期位置。内嵌图把前后段落间距撑得巨大浮动图直接盖在文字上面背景一片混乱。原因内嵌图插错了Range或者用了Shapes浮动图却没设置环绕方式。浮动图默认环绕是嵌入字上层级高于文字自然压盖。解决正文插图一律用InlineShapes.AddPicture插入位置取当前Selection.Range而不是文档Content开头。一定要浮动图时插入后立刻设置WrapFormat.Type常用值有两个wdWrapSquare 0四周型和wdWrapTopBottom 3上下型。我一般只给封面插图用浮动图正文全部内嵌省心。5.5 目录生成后空白打开文档要手动更新域现象代码生成了目录「外壳」标题都有了但内容是空的用户每次都要 CtrlA 后 F9 刷新才能看到目录。原因TOC 域插入后没有触发域更新。域是一种动态字段不更新就只有一个框架Word 不会自动计算。解决保存前强制更新两处——正文域的m_doc-querySubObject(Fields)-dynamicCall(Update())以及页眉页脚域的footerRange-dynamicCall(Fields.Update())。更新时机必须在所有内容写完、保存之前。如果文档页数多更新调用可能耗时几秒这是正常现象不要在那个位置弹超时提示。6. 进阶把 COM 细节封装成通用接口并写一个自检脚本用熟了QAxObject之后你会意识到真正的效率瓶颈不在调用本身而在业务代码和dynamicCall签名纠缠在一起。我的做法是再包一层「文档模型接口」调用方只传结构体完全不感知 COM。struct ReportSection { QString title; int level; QVectorQVectorQString tableData; QString imagePath; int imageWidth; }; class ReportBuilder { public: void setWord(QtWord *w); void appendSection(const ReportSection s); bool build(const QString outPath); };ReportBuilder内部维护一个当前位置指针每次追加小节自动换页、写标题、插表格、嵌图片。业务代码里只组ReportSection列表生成逻辑和数据逻辑彻底分离测试可以直接对ReportBuilder灌假数据跑集成。交付前我还会跑一个自检脚本生成完毕后用SaveAs2导出 PDF再统计 PDF 页数和预期页数比对。页数不对基本就是表格溢出或图片尺寸异常。这个习惯救过我很多次。从那以后我每次交付之前都强制走一遍「生成 docx → 转 PDF → 核对页数/抽查三个书签内容」的流程不再凭运气发货。qtword 这类资源省了记 COM 签名的时间剩下的活儿就是把这些校验习惯焊死在工程里。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

字体反爬破解实战:从字体文件结构到字形比对还原 2026/10/2 19:23:05

字体反爬破解实战:从字体文件结构到字形比对还原

抓到的网页源码里中文是正常的,渲染出来却是整屏乱码时的那种抓狂感,做过爬虫的人应该都懂。这不是编码问题,大概率是碰上了字体反爬。字体反爬是目前企业信息平台、招聘网站、汽车资讯站点用得比较多的一种反爬手段,核心思路就是…

阅读更多 →
GGUF量化+llama.cpp:5.9GB模型如何仅占2.7GB显存 2026/10/2 19:23:05

GGUF量化+llama.cpp:5.9GB模型如何仅占2.7GB显存

1. 从 5.9GB 到 2.7GB:一个自养 Agent 的显存账本 先把结论摆在前面:我本地跑的这个自养 Agent,模型文件在磁盘上是 5.9GB,加载进显存之后实际占用只有 2.7GB 左右。这不是什么黑魔法,也不是显存统计工具骗人&#xff…

阅读更多 →
双室平衡容器原理与工业汽包水位精准测量 2026/10/2 19:22:58

双室平衡容器原理与工业汽包水位精准测量

1. 什么是双室平衡容器:工业液位测量里那个“不说话但特别靠谱”的老伙计双室平衡容器,这名字听起来像某种实验室里的精密玻璃器皿,其实它压根儿不玻璃,也不娇气,而是锅炉房、化工厂、热电厂这些地方常年蹲守在汽包水位…

阅读更多 →
条件概率从直觉到应用:P(A|B)、P(AB)、P(B)关系精讲 2026/10/2 19:22:58

条件概率从直觉到应用:P(A|B)、P(AB)、P(B)关系精讲

1. 条件概率到底在解决什么问题很多人第一次接触条件概率的时候,公式背得滚瓜烂熟,一遇到具体题目就懵。我自己当年学这块内容也是同样的感受——P(A|B) 这个符号看起来简单,但真要解释清楚它和 P(AB)、P(B) 之间的关系,不少人脑子…

阅读更多 →
Jev 模型如何让 Agent 开发提速:TypeSafe AI 与并发实战 2026/10/2 19:22:57

Jev 模型如何让 Agent 开发提速:TypeSafe AI 与并发实战

1. 从 Jev 的爆火说起:Agent 开发到底卡在哪 最近技术圈里聊得最多的一个词就是 Jev。不管是在做 AI Agent 的群里,还是在各种开发者社区,到处都能看到有人在问 Jev 模型怎么申请、Jev 本地部署怎么做、Jev 在 Codex 里怎么用。我身边好几个做…

阅读更多 →
工厂车间无线覆盖项目方案:勘测、AP选型与验收避坑指南 2026/10/2 19:22:57

工厂车间无线覆盖项目方案:勘测、AP选型与验收避坑指南

简介:工厂车间无线覆盖项目方案是一份面向网络工程师、IT项目人员和企业信息化管理者的完整设计方案,针对车间跨距大、扫码移动终端难以稳定接入的痛点,规划了覆盖三个车间的WLAN无线网络。压缩包包含1个docx格式文档,整体约240KB…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉