FastReport Excel模板引擎:用.xlsx做报表设计源文件
简介本资源面向Delphi中高级开发者聚焦Excel与FastReport报表组件的深度集成实践解决在Delphi项目中快速构建数据驱动型报表的实际难题。资源包共10个文件含Delphi核心工程文件.dpr、.dfm、.pas、可直接运行的编译产物.exe、模板数据.xls、说明文档.txt、.htm及3个外部源码参考链接覆盖从环境配置、数据连接、字段映射到报表预览与导出的完整链路835KB体积轻量实用便于快速导入IDE验证。已有574人学习下载适合需在企业级Delphi系统中复用Excel结构化数据、规避数据库依赖、快速交付定制化报表的开发场景。包内提供可运行示例工程、标准化模板文件及清晰注释的源码模块辅以【源码说明】文本与网页指引显著降低FastReport Excel数据源接入门槛助力开发者掌握表达式应用、条件格式设置及事件驱动报表逻辑等进阶能力。1. 用Excel做FastReport报表不是导出Excel而是把Excel当报表引擎来用你有没有遇到过这种场景客户死磕Excel格式——表头要合并单元格、数字列必须带千分位和负号红字、汇总行要加粗居中、打印时每页固定带标题栏还要求双击某单元格能跳转到明细数据这时候如果还用FastReport原生设计器硬拖Band、写Pascal脚本、调OnBeforePrint事件去拼接样式三天都调不完。而「用Excel做FastReport报表」这个方案本质是反向操作不把Excel当输出结果而是把它当报表模板源文件——用Excel本身完成90%的排版、公式、条件格式、打印设置再让FastReport读取这个Excel仅负责填充数据、触发计算、导出PDF/打印。它特别适合Delphi老项目升级、政企类报表改造、以及需要快速响应业务部门Excel样式的场景。这不是偷懒是把Excel的成熟排版能力借过来绕开FastReport在复杂样式渲染上的历史包袱。我第一次在某高校教务系统里落地这个方案时原来3天改一个课表报表现在2小时就能交付带动态学分统计和跨年级对比的Excel模板连教务处老师自己都能用Excel改样式。2. FastReport与Excel协同的底层逻辑为什么Excel能当模板而不是只当导出目标2.1 FastReport的Excel模板机制TfrxXLSXExport不是唯一出口TfrxExcelDataSet才是入口很多人误以为FastReport对Excel的支持仅限于导出TfrxXLSXExport其实从FastReport 5.6.18起官方就内置了TfrxExcelDataSet组件——它能把一个.xlsx文件当作结构化数据源加载进报表引擎。关键点在于这个Excel文件不是空白表格而是预先设计好的「带占位符的模板」。比如A1单元格写[StudentName]B2写[Score:0.00]C3写SUM([Score])D4写IF([Score]90,优秀,)。FastReport运行时会扫描所有单元格文本识别方括号内的字段名如[StudentName]并绑定到数据集字段识别冒号后的格式如:0.00并应用NumberFormat识别等号开头的公式如SUM([Score])并交由内置Excel公式引擎计算。这背后依赖的是FastReport封装的Apache POI兼容层Windows下用COM跨平台用纯Delphi实现的XLSX解析器所以它不依赖本地Office安装但也不支持VBA宏或ActiveX控件。提示TfrxExcelDataSet只支持.xlsx格式Office 2007不支持.xls。如果你的客户还在用Excel 2003必须先用Excel另存为.xlsx或者用第三方库如xlsxwriter预生成兼容版本。2.2 模板Excel的三大设计规范字段占位符、格式标记、公式引用模板Excel不是随便画个表就行必须遵守三类语法规范否则FastReport会静默忽略字段占位符必须用英文方括号包裹如[ClassID]、[TotalScore]。支持嵌套字段[Student.Name]、数组索引[Scores[0]]、方法调用[GetGrade(Score)]。注意空格会被视为字段名一部分[ StudentName ]和[StudentName]是两个不同字段。格式标记紧跟在字段后用英文冒号分隔如[Score:¥#,##0.00]货币格式、[BirthDate:yyyy-mm-dd]日期格式、[Status:#通过;#未通过;未知]自定义数字格式。这里复用了Excel原生NumberFormat语法所以你在Excel里按Ctrl1看到的格式代码直接粘贴过来就能用。公式引用以等号开头内部字段仍需方括号如SUM([Score])、AVERAGE([Score1],[Score2])。支持Excel大部分函数SUM/AVERAGE/IF/VLOOKUP等但不支持OFFSET、INDIRECT等易变函数因为FastReport计算时没有活动单元格上下文。下面是一个真实模板片段保存为report_template.xlsxA列学生姓名B列成绩C列等级D列总分[StudentName][Score:0.00]IF([Score]90,A,IF([Score]80,B,C))SUM([Score])[StudentName2][Score2:0.00]IF([Score2]90,A,IF([Score2]80,B,C))—注意D列最后一行的SUM([Score])会自动跨所有数据行求和不需要手动拉公式——FastReport在填充时会动态扩展区域。2.3 Delphi端数据绑定从TClientDataSet到TfrxExcelDataSet的四步桥接在Delphi工程中不能直接把TClientDataSet丢给TfrxExcelDataSet——它们数据模型不兼容。必须通过TfrxUserDataSet做中间转换。以下是标准四步法基于Delphi 10.4 FastReport 6.7// 步骤1准备数据源假设已有一个填充好的TClientDataSet var cds: TClientDataSet; begin cds : TClientDataSet.Create(nil); cds.LoadFromFile(student_data.cds); end; // 步骤2创建TfrxUserDataSet并绑定字段映射 var userDS: TfrxUserDataSet; frxReport: TfrxReport; begin userDS : TfrxUserDataSet.Create(frxReport); userDS.DataSet : cds; // 关键指向原始数据集 // 手动声明字段必须与Excel模板中的占位符完全一致 userDS.AddField(StudentName, ftString, 50); userDS.AddField(Score, ftFloat, 0); userDS.AddField(StudentName2, ftString, 50); userDS.AddField(Score2, ftFloat, 0); end; // 步骤3配置TfrxExcelDataSet指向模板文件 var excelDS: TfrxExcelDataSet; begin excelDS : TfrxExcelDataSet.Create(frxReport); excelDS.FileName : report_template.xlsx; // 模板路径 excelDS.DataSet : userDS; // 绑定到用户数据集 excelDS.FirstRow : 1; // 从第1行开始读跳过标题行可设为2 excelDS.LastRow : 0; // 0表示不限制自动识别数据区 end; // 步骤4在报表中引用excelDS作为主数据源 begin frxReport.LoadFromFile(main_report.frx); frxReport.DataSets.Clear; frxReport.DataSets.Add(excelDS); frxReport.ShowReport(); end;这段代码的关键在于userDS.AddField()必须与Excel里的[FieldName]严格对应。如果模板写了[StuName]但代码里AddField的是StudentName运行时不会报错但该字段永远为空——这是新手最常翻车的地方。3. Excel模板制作实操从零搭建一个带分组汇总的课表报表3.1 模板结构设计用Excel原生功能实现分页标题、跨页重复、动态分组我们以「学期课表」为例需求包括每页顶部显示学院名称和学期如“计算机学院 · 2024春”每门课单独一页课程内按周次分组每组显示上课时间、教室、教师并在组尾显示该课程总学时。传统FastReport做法要建Master-Detail Band、写OnBeforePrint判断分组变化、手动累加学时。而Excel模板方案只需三步分页控制在Excel中选中A1:D1 → 页面布局 → 打印标题 → “顶端标题行”填$1:$1。这样每页都会重复显示第1行含学院和学期占位符。分组标识在数据区第一列如A列插入辅助列写IF([CourseID][CourseID_1],● [CourseName],)其中[CourseID_1]是上一行的CourseID用OFFSET模拟实际用[CourseID]和[PrevCourseID]字段更稳妥。组汇总在每组最后一行如E列写SUMIF(A:A,*[CourseName]*,D:D)前提是D列是学时列且A列有课程名称标记。最终模板结构如下前5行示意A列课程标识B列周次C列时间D列学时E列小计[College] · [Semester]————● [CourseName][Week][Time][Hours]——[Week2][Time2][Hours2]—————SUMIF(A:A,● [CourseName],D:D)[NextCourseName][Week][Time][Hours]—注意[PrevCourseID]这类“上一行字段”需要在Delphi端通过TfrxUserDataSet的OnGetValue事件手动提供。FastReport不自动提供行偏移字段必须自己缓存上一行值。3.2 字体与条件格式迁移如何把Excel里设置的红色负数、加粗标题在FastReport中保留Excel模板里的字体、边框、背景色、条件格式默认不会被FastReport继承。必须显式启用渲染开关// 在报表加载后、ShowReport前执行 frxReport.FindObject(DataBand1) as TfrxBand).Style.Font.Size : 10; // 更关键的是开启Excel样式导入 excelDS.ImportStyles : True; // 默认False必须设为True excelDS.ImportConditionalFormatting : True; // 条件格式也要手动开ImportStyles开启后FastReport会解析Excel中每个单元格的xfId样式索引并映射到内部样式表。但有个血泪经验如果Excel模板是用WPS或LibreOffice保存的xfId可能错乱导致字体全变成宋体10号。解决方案只有两个① 模板必须用Microsoft Excel 2016保存② 在Delphi中用TfrxExcelDataSet.OnGetCellFormat事件手动修正procedure TForm1.excelDSOnGetCellFormat(Sender: TObject; const ACellRef: string; var AFormat: TfrxCellFormat); begin if ACellRef A1 then // 强制A1用黑体14号 begin AFormat.Font.Name : 微软雅黑; AFormat.Font.Size : 14; AFormat.Font.Style : [fsBold]; end; end;3.3 动态图表嵌入用Excel图表对象替代FastReport Chart组件FastReport的Chart组件渲染慢、样式少、导出PDF常变形。而Excel原生图表插入 → 图表 → 柱形图在模板中是drawing节点只要图表数据源绑定到占位符字段FastReport就能在填充时自动重绘。操作步骤在Excel模板中选中数据区如B2:C10→ 插入柱形图右键图表 → 选择数据 → 编辑水平分类轴标签将范围改为Sheet1!$A$2:$A$10即课程名称列编辑系列值改为Sheet1!$B$2:$B$10即学时列在图表标题中写[CourseName] 学时分布。关键点图表的数据源区域必须是绝对引用带$符号否则FastReport填充时无法定位。如果要用相对引用必须用命名区域Name Manager里定义ChartData指向$B$2:$C$10然后在图表数据源中写Sheet1!ChartData。4. 避坑指南五个让Delphi开发者抓狂的Excel模板问题及解法4.1 现象Excel模板中[FieldName]显示正常但导出PDF时该位置为空白原因字段名大小写不匹配。FastReport字段绑定默认区分大小写而Excel单元格文本是全小写但Delphi的TClientDataSet字段名可能是StudentName首字母大写。解决在TfrxUserDataSet的OnGetValue事件中统一转小写或在Excel模板中严格使用[studentname]全小写并在AddField时也用小写userDS.AddField(studentname, ftString, 50)。4.2 现象[Score:0.00]在Excel里显示85.50但FastReport导出PDF时变成85.5丢失末尾0原因Excel的NumberFormat0.00在FastReport中被解析为浮点数格式但导出PDF时调用的是GDI文本绘制不走Excel公式引擎。解决改用字符串格式化在占位符中加TEXT函数[TEXT(Score,0.00)]。注意TEXT是Excel函数必须以等号开头所以实际写TEXT([Score],0.00)而非[Score:0.00]。4.3 现象模板中设置了“跨页重复标题行”但FastReport导出PDF时只在第一页显示原因ImportStyles : True只导入单元格样式不导入页面设置。Excel的“顶端标题行”属于PageSetup属性FastReport不解析。解决放弃Excel页面设置改用FastReport的PageHeaderBand。在报表中添加PageHeaderBand里面放一个TfrxMemoViewText属性设为[College] · [Semester]并设置KeepTogether : True防止跨页断开。4.4 现象Excel模板中有VLOOKUP公式引用另一个SheetFastReport报错“找不到工作表”原因TfrxExcelDataSet默认只加载当前活动Sheet通常是Sheet1。其他Sheet需显式指定。解决在TfrxExcelDataSet中设置SheetName : LookupTable或用Sheets属性加载多个SheetexcelDS.Sheets.Add(LookupTable); excelDS.Sheets.Add(DataSheet);。4.5 现象Delphi程序启动时报错“EOleSysError: 错误的参数”发生在excelDS.LoadFromStream调用时原因模板.xlsx文件被其他程序如Excel进程、杀毒软件独占锁定或文件损坏。常见于开发机上双击打开过模板又没关闭。解决① 重启Delphi IDE② 用Process Explorer检查EXCEL.EXE进程是否残留③ 换一个干净的.xlsx文件测试④ 在代码中加异常捕获并提示具体文件路径try excelDS.LoadFromStream(...); except on E: Exception do ShowMessage(加载模板失败 excelDS.FileName #13#10 E.Message); end;5. 进阶技巧用FastReport脚本动态生成Excel模板实现“报表即代码”5.1 为什么需要动态生成模板应对高频变更的报表需求某公司每月要出200份不同格式的税务报表每份模板由财务部用Excel手工调整——字体、列宽、公式、条件格式全不同。如果每次变更都让Delphi程序员改代码、发新版本运维成本爆炸。更好的做法是把Excel模板本身当作可编程对象用FastReport脚本Pascal Script在运行时生成模板再加载。这样财务人员只需维护一个JSON配置文件程序员零代码修改。5.2 核心实现用TfrxExcelDataSet的OnBeforeLoad事件注入动态模板FastReport 6.5支持在OnBeforeLoad事件中不从文件加载而是用TfrxExcelDataSet.LoadFromStream从内存流加载动态生成的.xlsx。我们用开源库xlsxwriterDelphi版生成流uses xlsxwriter, Classes, SysUtils; procedure TForm1.excelDSOnBeforeLoad(Sender: TObject); var workbook: TXlsxWorkbook; worksheet: TXlsxWorksheet; format_title, format_data: TXlsxFormat; i: Integer; jsonConfig: string; begin // 1. 读取配置实际从JSON文件或数据库读 jsonConfig : {title:增值税申报表,columns:[纳税人名称,销项税额,进项税额,应纳税额],widths:[30,15,15,15]}; // 2. 创建内存Excel流 workbook : TXlsxWorkbook.Create; try worksheet : workbook.AddWorksheet(Data); // 3. 写标题行带格式 format_title : workbook.AddFormat; format_title.SetBold; format_title.SetFontSize(12); worksheet.WriteString(0, 0, 【 ExtractStr(jsonConfig, title:, ) 】, format_title); // 4. 写列头从JSON解析columns var cols : ExtractStr(jsonConfig, columns:, ]); for i : 0 to Length(cols) - 1 do begin worksheet.WriteString(1, i, Trim(cols[i]), format_title); worksheet.SetColumn(i, i, StrToIntDef(ExtractStr(jsonConfig, widths:, ])[i], 12)); end; // 5. 写占位符数据行关键让FastReport能识别字段 worksheet.WriteString(2, 0, [TaxpayerName]); worksheet.WriteString(2, 1, [OutputTax:0.00]); worksheet.WriteString(2, 2, [InputTax:0.00]); worksheet.WriteString(2, 3, [TaxPayable:0.00]); // 6. 保存到流并注入 var stream : TMemoryStream.Create; try workbook.SaveToStream(stream); stream.Position : 0; excelDS.LoadFromStream(stream); // 替代LoadFromFile finally stream.Free; end; finally workbook.Free; end; end;这段代码实现了JSON配置驱动模板生成、列宽动态设置、占位符自动写入、标题加粗。财务人员改JSON程序自动出新模板。5.3 模板版本管理用SHA256哈希校验确保模板一致性当模板由脚本生成时如何确保每次生成的.xlsx内容一致靠人工比对不可能。我们在生成后计算SHA256并存入报表文件元数据function CalcSHA256(const AStream: TStream): string; var ctx: TSHA256; hash: TArrayByte; begin ctx : TSHA256.Create; try ctx.Update(AStream); hash : ctx.Final; Result : BytesToString(hash, TEncoding.UTF8); finally ctx.Free; end; end; // 在生成模板后 stream.Position : 0; excelDS.TemplateHash : CalcSHA256(stream); // 自定义属性存入报表.frx文件下次加载时先校验哈希不一致则强制重新生成——避免缓存污染导致的“明明改了JSON却没生效”。从那以后我每次上线新报表都强制走一遍模板哈希校验日志记录哪怕多花200ms。因为曾经有一次生产环境模板被杀毒软件静默修改导致全公司增值税报表金额错位排查了两天才发现是Excel文件CRC变了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

年会抽奖程序从零到一:技术选型、公平算法与现场落地指南

年会抽奖程序从零到一:技术选型、公平算法与现场落地指南

这年头还搞年会抽奖,简直良心企业,既然请了我,少不得给客户弄个年会抽奖程序 我今年陆续接了几个小项目,其中一个特别有意思——帮客户做年会抽奖程序。说实话,接之前我心里还在嘀咕:现在好多公司年会都是线…

2026/10/16 9:47:04 阅读更多 →
comm命令详解:从sort到diff,玩转Linux文件集合比较

comm命令详解:从sort到diff,玩转Linux文件集合比较

1. 先从一次真实的文件比较说起 上个月帮朋友排查两个服务器上的软件包差异,一个跑着生产业务,一个准备做灾备切换,两边按理说应该是同一套环境,但总让人不放心。最简单的办法是把两边已安装的软件包列表导出来,然后对…

2026/10/16 9:47:04 阅读更多 →
25G交换机切GE模式全攻略:让SFP28口兼容千兆老设备

25G交换机切GE模式全攻略:让SFP28口兼容千兆老设备

1. 为什么要把25G交换机切成GE模式先说个场景。机房上线了一批25G交换机,结果今天运维同事抱着三台旧设备过来,说对接测试一直起不来。一查,对面的设备只有千兆电口,连光模块都没条件上。说白了就是新设备太“前卫”,老…

2026/10/16 9:47:04 阅读更多 →

最新新闻

C#面向对象:Person类、Student类继承与构造函数全解析

C#面向对象:Person类、Student类继承与构造函数全解析

1. 面向对象的第一步:从Person类的设计说起很多人学C#敲的第一段面向对象代码,就是从定义人类Person开始的。这个题目看着简单,但背后其实藏着一堆值得掰扯清楚的细节——构造函数怎么写、字段和属性有什么区别、继承之后构造函数怎么联动。我…

2026/10/16 10:41:46 阅读更多 →
Tailwind CSS组件库v6.23:纯CSS驱动的62个可复用UI模块

Tailwind CSS组件库v6.23:纯CSS驱动的62个可复用UI模块

简介:本资源是 Tailwind CSS 6.23 版本的完整组件实践包,面向前端开发者、UI 工程师及响应式项目快速搭建者,解决传统 CSS 开发效率低、定制难、响应式适配繁琐等痛点。压缩包含 2007 个文件,主体为 1304 个 HTML 示例页&#xff…

2026/10/16 10:41:46 阅读更多 →
线性加权滑移平均精准捕捉局部小峰值的Matlab实现与调参

线性加权滑移平均精准捕捉局部小峰值的Matlab实现与调参

前阵子处理一段传感器信号时,我遇到一个特别典型的困境:数据里明明有很关键的局部小峰值,结果一用常规的滑动平均去噪,峰值幅度被削掉一大半,位置还往后偏移了好几个采样点。后来换成线性加权滑移平均算法,…

2026/10/16 10:41:46 阅读更多 →
用Niagara制作逼真火焰:噪声、颜色曲线与透明淡出全解析

用Niagara制作逼真火焰:噪声、颜色曲线与透明淡出全解析

从小我就觉得粒子特效是门“骗术”:喷泉喷的是水,火焰烧的是粒子,但只要观感对了,没人会在意那是不是真的流体。喷泉那一篇发出来后,不少人问我能不能把发射器关掉重力、换个橙色贴图,直接当火焰用。我的回…

2026/10/16 10:41:46 阅读更多 →
Utilman.exe丢失或找不到怎么办?系统自带安全修复方法全解析

Utilman.exe丢失或找不到怎么办?系统自带安全修复方法全解析

系统突然出现“Utilman.exe文件丢失或找不到”的报错,登录界面右下角的“轻松使用”按钮点了没反应,甚至开机就卡在欢迎界面。这个问题在Windows 7到Windows 11上都可能出现,不少朋友第一反应是去第三方下载站找个exe文件补上——我劝你千万打…

2026/10/16 10:41:46 阅读更多 →
AI逆向工程实战:大语言模型如何将二进制翻译为伪代码

AI逆向工程实战:大语言模型如何将二进制翻译为伪代码

这个标题是我在刷开源社区动态的时候看到的,第一反应是“又来了个套壳项目”,但点进去翻了源码和论文之后,我承认我小看它了。这个项目目前在 GitHub 上拿下了 31.2K Star,热度确实不是刷出来的。我花了两天时间把它部署到本地&am…

2026/10/16 10:40:41 阅读更多 →

日新闻

个人 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/15 9:49:14 阅读更多 →