NPOI .NET 2.0/4.0 版本选型与Excel读写避坑指南
简介这份资源面向需要在 .NET Framework 2.0 与 4.0 项目中处理 Office 文件的开发者提供 NPOI 预编译 DLL省去自行编译的繁琐步骤可直接集成到老项目或既有系统中。压缩包共 39 个文件以 18 个 dll 为核心运行库辅以 12 个 pdb 调试符号和 9 个 xml 文档说明整体约 11.51MB按 .net2 与 .net4 两个目录分别组织便于按目标框架取用。NPOI 支持 XLS、XLSX、DOC、DOCX 等格式的读写可完成工作簿创建、工作表与单元格数据写入、样式设置、公式计算及图表处理常用于数据导入导出、报表生成与自动化任务。已有 3795 人学习下载说明其在 .NET 办公文档处理场景中具备较高参考价值。拿到 DLL 后只需引用并调用相应类与方法即可快速构建与 Office 文件交互的应用把精力集中在业务逻辑上。1. 从一次 Excel 导出翻车说起NPOI 到底解决什么问题去年帮一个做工业质检的团队排查问题他们的 WinForm 客户端在导出检测报表时只要数据超过 8000 行Excel 就报「文件已损坏无法打开」。代码用的是Microsoft.Office.Interop.Excel服务器上还专门装了 Office。这种依赖 COM 组件的方案在客户端机器上部署时经常因为 Office 版本差异、权限问题、进程残留而翻车。后来换成 NPOI问题直接消失——不需要装 Office不依赖 COM纯托管代码读写 xls 和 xlsx。NPOI 是 Apache POI 的 .NET 移植版核心价值就一句话在 .NET 环境里不装 Office 也能读写 Excel 文件。它支持两种格式——HSSF 处理 .xlsExcel 97-2003XSSF 处理 .xlsxExcel 2007。这次要拆的资源包就是 NPOI 的 .NET 2.0 和 4.0 两个版本下载。为什么这两个版本值得单独拎出来因为 .NET 2.0 对应的是还在维护的老旧工控系统、WinCE 衍生项目而 .NET 4.0 则是目前大多数企业内网桌面应用的主力框架。选错版本轻则编译报错重则运行时FileNotFoundException找不到程序集。这份资源适合谁正在维护 .NET 2.0/4.0 老项目的工程师、需要离线部署 Excel 导出功能的桌面端开发者、以及被 COM 方案坑过想换纯托管库的人。如果你用的是 .NET Core 或 .NET 5那应该去找 NPOI 的 Standard 版本这份资源不是给你的。2. 版本选型与程序集依赖2.0 和 4.0 到底差在哪2.1 两个版本的编译目标与运行时边界NPOI 的 .NET 2.0 版本编译目标是v2.0.50727能在 .NET Framework 2.0/3.0/3.5 上跑。.NET 4.0 版本编译目标是v4.0.30319需要 .NET Framework 4.0 及以上。这里有个常见的误解有人觉得 4.0 版本能向下兼容 2.0 项目实际上不行。如果你的项目 Target Framework 是 3.5引用 4.0 编译的 NPOI 程序集Visual Studio 会直接拒绝添加引用或者运行时抛BadImageFormatException。反过来2.0 版本的程序集能不能在 4.0 项目里用技术上可以因为 .NET 4.0 支持加载 2.0 程序集。但我不建议这么干——2.0 版本的 NPOI 功能较老缺少一些后续修复的 bug 补丁而且混用不同运行时版本的程序集容易在序列化和反射场景下出玄学问题。判断该用哪个版本看三个地方项目属性里的 Target Framework、部署环境的 .NET 版本、以及是否有其他依赖库强制了框架版本。我一般会先跑一句命令确认# 查看已安装的 .NET Framework 版本 reg query HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full /v Version如果返回4.0.30319或更高就用 4.0 版本。如果返回3.5.30729或更低或者键不存在那就得用 2.0 版本。注意 32 位系统要查Wow6432Node路径。2.2 程序集清单与引用方式NPOI 不是单个 DLL它有一组依赖。下载包解压后你至少需要引用这几个程序集作用2.0 版本是否必需4.0 版本是否必需NPOI.dll核心读写逻辑是是NPOI.OOXML.dllxlsx 格式支持是若处理 xlsx是若处理 xlsxNPOI.OpenXml4Net.dllOOXML 底层包处理是若处理 xlsx是若处理 xlsxICSharpCode.SharpZipLib.dll压缩解压是4.0 版本已合并通常不需要单独引用2.0 版本的依赖关系更松散SharpZipLib 需要单独放。4.0 版本做了整合但如果你下载的是某些第三方重新打包的版本可能还是拆开的。引用时在 Visual Studio 里右键「添加引用」→「浏览」把这几个 DLL 一起选上。不要只加 NPOI.dll 就以为完事了处理 xlsx 时缺 OOXML 相关程序集会报TypeInitializationException。提示如果项目是 Web 应用部署在 IIS 上确保这些 DLL 的「复制本地」属性设为 True否则发布后 bin 目录里缺文件。2.3 用 NuGet 还是手动引用NPOI 在 NuGet 上有官方包但老版本的 .NET Framework 项目经常因为 NuGet 源配置问题装不上。我一般会先试 NuGet# 在 Package Manager Console 中安装指定版本 Install-Package NPOI -Version 2.5.6 -ProjectName YourProject但注意NuGet 上的 NPOI 版本号跟「.NET 2.0/4.0」不是一一对应的。NuGet 包会根据你的 Target Framework 自动选择对应的 lib 目录。如果你项目是 .NET 4.0装最新版 NPOI 可能会提示不兼容因为新版已经转向 .NET Standard。这时候手动引用下载包里的 DLL 反而更直接。手动引用的坑在于DLL 版本号和文件版本号可能不一致导致运行时绑定错误。解决办法是在app.config或web.config里加绑定重定向configuration runtime assemblyBinding xmlnsurn:schemas-microsoft-com:asm.v1 dependentAssembly assemblyIdentity nameNPOI publicKeyToken0e8f5b4b5c5c5c5c cultureneutral / bindingRedirect oldVersion0.0.0.0-2.5.6.0 newVersion2.5.6.0 / /dependentAssembly /assemblyBinding /runtime /configurationpublicKeyToken 要根据实际 DLL 用sn -T命令查别照抄。绑定重定向是解决「明明引用了却找不到方法」这类问题的后悔药。3. 用 NPOI 读写 Excel从建工作簿到落盘的完整链路3.1 创建 xlsx 并写入数据先看一个最小可运行示例用 4.0 版本创建一个 xlsx 文件并写入表头和数据行using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using System.IO; // 创建工作簿xlsx 用 XSSFWorkbookxls 用 HSSFWorkbook IWorkbook workbook new XSSFWorkbook(); ISheet sheet workbook.CreateSheet(检测记录); // 创建表头行 IRow headerRow sheet.CreateRow(0); string[] headers { 序号, 检测项, 结果, 时间 }; for (int i 0; i headers.Length; i) { ICell cell headerRow.CreateCell(i); cell.SetCellValue(headers[i]); } // 写入数据行 for (int rowIdx 1; rowIdx 100; rowIdx) { IRow row sheet.CreateRow(rowIdx); row.CreateCell(0).SetCellValue(rowIdx); row.CreateCell(1).SetCellValue(外观检查); row.CreateCell(2).SetCellValue(rowIdx % 2 0 ? 合格 : 不合格); row.CreateCell(3).SetCellValue(System.DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)); } // 落盘 using (FileStream fs new FileStream(D:\output\result.xlsx, FileMode.Create, FileAccess.Write)) { workbook.Write(fs); }逻辑说明XSSFWorkbook对应 xlsxHSSFWorkbook对应 xls两者都实现IWorkbook接口所以业务代码可以面向接口写切换格式时只改实例化那一行。CreateSheet的参数是工作表名称不能超过 31 个字符不能包含\ / ? * [ ]这些字符否则抛ArgumentException。参数说明SetCellValue有多个重载传 string、double、bool、DateTime 都行。但注意 DateTime 直接传会被存成数字格式需要配合ICellStyle设置日期格式才能正常显示。我一般直接传格式化后的字符串省去样式配置的麻烦。3.2 读取已有 Excel 并处理空行读取比写入更容易踩坑尤其是遇到空行、合并单元格、公式单元格时using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using System.IO; using (FileStream fs new FileStream(D:\input\source.xlsx, FileMode.Open, FileAccess.Read)) { IWorkbook workbook new XSSFWorkbook(fs); ISheet sheet workbook.GetSheetAt(0); // 取第一个工作表 // 遍历物理行LastRowNum 可能包含空行 for (int i 0; i sheet.LastRowNum; i) { IRow row sheet.GetRow(i); if (row null) continue; // 空行跳过 // 读取第一列判断单元格类型 ICell cell row.GetCell(0); if (cell null) continue; string value; switch (cell.CellType) { case CellType.String: value cell.StringCellValue; break; case CellType.Numeric: value cell.NumericCellValue.ToString(); break; case CellType.Formula: // 公式单元格需要先求值 value cell.CachedFormulaResultType CellType.String ? cell.StringCellValue : cell.NumericCellValue.ToString(); break; default: value string.Empty; break; } // 处理 value... } }逻辑说明LastRowNum返回的是最后一行的索引从 0 开始但它可能包含格式为空的行。所以必须用GetRow(i) null判断。GetCell同样可能返回 null直接调cell.StringCellValue会抛NullReferenceException。参数说明CellType枚举在 2.0 和 4.0 版本中略有差异。2.0 版本用cell.CellType属性4.0 版本也是但枚举值名称从CELL_TYPE_STRING变成了CellType.String。如果你从 2.0 迁移到 4.0这部分代码必须改。注意读取 xls 文件时用HSSFWorkbook读取 xlsx 用XSSFWorkbook。如果不想判断格式可以用WorkbookFactory.Create(fs)它会自动识别。但WorkbookFactory在 2.0 版本中可能不存在需要确认。3.3 样式与大数据量写入的性能取舍给单元格加边框、背景色、字体是导出报表的刚需。但样式对象不能每个单元格都新建否则内存暴涨// 正确做法样式创建一次复用 ICellStyle style workbook.CreateCellStyle(); style.BorderBottom BorderStyle.Thin; style.BorderLeft BorderStyle.Thin; style.BorderRight BorderStyle.Thin; style.BorderTop BorderStyle.Thin; style.FillForegroundColor NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; style.FillPattern FillPattern.SolidForeground; IFont font workbook.CreateFont(); font.FontName 微软雅黑; font.FontHeightInPoints 10; style.SetFont(font); // 在循环外创建循环内复用 for (int i 0; i 10000; i) { IRow row sheet.CreateRow(i); ICell cell row.CreateCell(0); cell.SetCellValue(数据 i); cell.CellStyle style; // 复用同一个样式对象 }逻辑说明CreateCellStyle和CreateFont每次调用都会在工作簿中注册新对象。xlsx 格式对样式数量有硬限制约 64000 个超过就报错。xls 格式限制更严。所以务必把样式创建提到循环外面。参数说明FillForegroundColor需要配合FillPattern使用只设颜色不设图案背景不会显示。HSSFColor是 xls 时代的颜色索引xlsx 也兼容但更推荐用XSSFColor传 RGB 值。大数据量写入时SXSSFWorkbook是更好的选择——它只保留少量行在内存中其余刷到磁盘临时文件。但SXSSFWorkbook在 NPOI 的 2.0 版本中可能不完整4.0 版本支持较好。4. 避坑与排查版本混用、内存溢出、格式兼容的五个血泪教训4.1 现象编译通过但运行时找不到方法原因项目引用了 4.0 版本的 NPOI.dll但 bin 目录下实际加载的是 2.0 版本可能被其他库依赖带入或者 GAC 里有旧版本。解决用 Fusion Log Viewer 查看程序集绑定日志或者在代码里打印typeof(NPOI.WorkbookFactory).Assembly.FullName确认实际加载版本。然后在 config 里加绑定重定向强制指向正确版本。4.2 现象导出 10 万行时 OutOfMemoryException原因XSSFWorkbook把所有行都保留在内存中10 万行 × 20 列的数据量轻松超过 2GB32 位进程直接崩。解决换SXSSFWorkbook并设置滑动窗口大小// 只保留 100 行在内存其余刷磁盘 SXSSFWorkbook workbook new SXSSFWorkbook(100); workbook.TrackAllColumnsForAutoSizing false; // 关闭自动列宽省内存注意SXSSFWorkbook写完必须调workbook.Dispose()清理临时文件否则磁盘会残留poifiles目录。4.3 现象xls 文件用 XSSFWorkbook 打开报错原因文件扩展名是 .xls但实际内容是 xlsx 格式有些系统导出时改了扩展名但没改内容或者反过来。解决不要靠扩展名判断格式用WorkbookFactory.Create(fs)自动探测。如果 2.0 版本没有WorkbookFactory就读文件头前 8 个字节xls 是D0 CF 11 E0xlsx 是50 4B 03 04ZIP 头。4.4 现象日期单元格读出来是数字 44562原因Excel 内部用序列号存储日期1900 年 1 月 1 日是 1。直接读NumericCellValue拿到的是序列号。解决用DateUtil.GetJavaDate(double)转换double numericValue cell.NumericCellValue; DateTime date NPOI.SS.UserModel.DateUtil.GetJavaDate(numericValue);注意 1900 年闰年 bugExcel 认为 1900 年是闰年所以 1900 年 3 月 1 日之前的日期转换会差一天。NPOI 的DateUtil已经处理了这个偏移但如果你手动算要留意。4.5 现象中文字体在服务器上显示为方框原因服务器没装对应字体或者 NPOI 创建字体时指定的字体名在服务器上不存在。解决用通用字体名如「宋体」「Arial」或者在部署时确保服务器安装了所需字体。更稳妥的做法是导出时不设字体让 Excel 打开时用默认字体渲染。5. 进阶技巧用 NPOI 做模板填充与公式计算的验证方法模板填充是 NPOI 最实用的进阶场景。做法是先用 Excel 做好一个带占位符的模板文件然后代码读取模板、替换占位符、另存为新文件。这样样式、合并单元格、打印区域都保留在模板里代码只负责填数据。// 读取模板 IWorkbook workbook; using (FileStream fs new FileStream(D:\template\report_template.xlsx, FileMode.Open, FileAccess.Read)) { workbook new XSSFWorkbook(fs); } ISheet sheet workbook.GetSheetAt(0); // 替换占位符遍历所有行和单元格 for (int i 0; i sheet.LastRowNum; i) { IRow row sheet.GetRow(i); if (row null) continue; for (int j 0; j row.LastCellNum; j) { ICell cell row.GetCell(j); if (cell null || cell.CellType ! CellType.String) continue; string text cell.StringCellValue; if (text.Contains({{ProjectName}})) { cell.SetCellValue(text.Replace({{ProjectName}}, 某检测项目)); } if (text.Contains({{Date}})) { cell.SetCellValue(text.Replace({{Date}}, DateTime.Now.ToString(yyyy年MM月dd日))); } } } // 另存为新文件 using (FileStream fs new FileStream(D:\output\report_filled.xlsx, FileMode.Create, FileAccess.Write)) { workbook.Write(fs); }逻辑说明模板填充的关键是「只改文本不动样式」。SetCellValue会保留单元格原有的样式对象所以边框、字体、对齐方式都不会丢。但如果占位符在公式里比如SUM(B2:B{{RowCount}})就不能用字符串替换需要改公式字符串后调cell.SetCellFormula()。参数说明LastCellNum返回的是最后一列的索引加一注意与LastRowNum不同所以循环条件用而不是。如果模板中有空单元格但需要保留格式GetCell可能返回 null这时候要用row.CreateCell(j)先创建再设值但创建会丢失原有样式需要手动复制样式。公式计算的验证是个容易忽略的点。NPOI 写入公式后Excel 打开时会自动计算但如果你在代码里需要读取公式结果必须调workbook.GetCreationHelper().CreateFormulaEvaluator().Evaluate(cell)。这个求值器在 2.0 版本中可能不支持所有函数4.0 版本支持度更好。我一般会在写入公式后用求值器跑一遍把结果写回单元格作为缓存值这样即使对方用不支持公式的阅读器打开也能看到数字。从那以后我每次用 NPOI 做模板导出都会先拿一个最小模板跑通「读取→替换→求值→落盘」全链路确认版本和依赖没问题再上真实数据。这个习惯帮我省了至少三次通宵排查。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

S7-200 PLC在变压器强油循环风冷控制中的应用与组态王监控设计

S7-200 PLC在变压器强油循环风冷控制中的应用与组态王监控设计

很多人一听到S7-200,第一反应就是“西门子停产多年的老型号了”。但在我经手过的变电站变压器自动化改造里,这个老型号依然活跃在大量主变冷却控制柜中。就拿变压器强迫油循环风冷控制来说,潜油泵让变压器油强制循环,风机把热量吹…

2026/10/16 13:31:02 阅读更多 →
Spring AI Java AI工程化实战:协议抽象与RAG生产落地

Spring AI Java AI工程化实战:协议抽象与RAG生产落地

1. 一个被误读的“停更”:Spring AI Alibaba到底发生了什么?“Spring AI Alibaba已停更了,Java还有希望吗?”——这个标题在技术社区里刷屏时,我正调试着一个用Spring AI 阿里云百炼API跑通的RAG服务。第一反应不是焦…

2026/10/16 13:31:02 阅读更多 →
CDMA扩频序列实战:Walsh码与m序列的正交性原理及多址干扰排查

CDMA扩频序列实战:Walsh码与m序列的正交性原理及多址干扰排查

简介:这份文档面向通信工程、无线通信课程学习者及CDMA系统入门研究者,系统梳理扩频序列中m序列与Walsh码的原理与实现。内容涵盖m序列的线性移位寄存器生成机制、反馈系数与起始状态对序列的影响,Walsh码基于Hadamard矩阵的正交构造及64阶序…

2026/10/16 13:31:02 阅读更多 →

最新新闻

security-audit-skill:为编码智能体注入安全审计能力

security-audit-skill:为编码智能体注入安全审计能力

1. 从"security-audit-skill"这个名字说起:它到底在解决什么问题第一次看到security-audit-skill这个命名,我的直觉是:这大概率是一个面向编码智能体(coding-agent)的技能包,而不是一个独立的扫描…

2026/10/16 14:53:05 阅读更多 →
Codex桌面版实测:多智能体编排如何重塑AI编程工作流

Codex桌面版实测:多智能体编排如何重塑AI编程工作流

深夜一点多,一个同行给我丢来一张截图,我当时刚把手头那个定时任务脚本调完,准备关电脑。结果看了一眼截图就坐起来了——Codex 桌面版发布了。说实话,过去几个月我用 Codex 的方式还是那个老路子:在终端里敲命令&…

2026/10/16 14:53:05 阅读更多 →
PHP-FPM多进程模型详解:master与worker协作机制、参数配置及故障排查

PHP-FPM多进程模型详解:master与worker协作机制、参数配置及故障排查

1. 面试官到底在考察什么:先看问题的分层“PHP-FPM多进程模型”这道题,在PHP面试里属于必问经典。但这道题的考察深度可以拉得很开,面试官通常不是在等你背一个“master进程 worker进程”的结论,而是在区分三种人。第一种人&…

2026/10/16 14:53:05 阅读更多 →
Fabric 1.4.4联盟链手动搭建全流程:从证书到链码调用

Fabric 1.4.4联盟链手动搭建全流程:从证书到链码调用

Fabric 1.4.4 是我带过不少入门项目后,依然觉得最适合“从零讲清楚联盟链”的一个版本。它虽然是 2019 年的 LTS,但模块边界非常干净:身份怎么生成、排序服务怎么启动、通道怎么创建、链码怎么装上去,每一层都能单独拆开看。这篇文…

2026/10/16 14:53:05 阅读更多 →
STM32G474 HRTIM触发ADC中间时刻采样实战:避开PWM开关噪声

STM32G474 HRTIM触发ADC中间时刻采样实战:避开PWM开关噪声

简介:基于STM32G474的HRTIM触发多路ADC采样工程包,面向需要处理PWM开关噪声的嵌入式开发者。工程在NUCLEO-G474RE官方开发板上验证,使用CubeIDE完成配置与调试,实现HRTIM事件触发多路ADC、DMA自动搬运以及串口打印显示&#xff0c…

2026/10/16 14:53:05 阅读更多 →
EasyExcel百万级数据导出实战:从内存优化到异步架构

EasyExcel百万级数据导出实战:从内存优化到异步架构

做后端开发这些年,Excel导出算是我见过“翻车率”最高的功能之一。尤其是当数据量从几千行涨到几十万行时,很多系统就像被卡住喉咙一样,要么内存直接溢出,要么前端页面卡死,要么用户等了好几分钟最后下载下来一个损坏的…

2026/10/16 14:52:02 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* 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 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →