VB.NET WinForms实战:Excel数据读取、去重与Listbox绑定全解析
1. 从Excel到Listbox一个看似简单却暗藏玄机的需求做过WinForms桌面开发的人几乎都绕不开一个经典场景用户手里有一份Excel表格想把其中某一列的数据读出来塞进界面上的Listbox控件里而且还要自动去掉重复项。这个需求听起来简单得像是教科书里的练习题但真正动起手来你会发现坑远比想象中多——Excel文件的格式差异、数据类型的隐式转换、去重逻辑的选择、界面卡顿的处理每一个环节都可能让你在调试器里多耗上几个小时。我自己第一次接这类需求的时候以为用几行代码就能搞定结果在实际项目中反复返工了三次才稳定下来。第一次是因为没考虑Excel里空行的处理第二次是去重之后顺序乱了第三次是数据量一大界面直接假死。后来我把这套流程沉淀成了一套比较稳妥的方案这篇文章就把整个思路和实现细节完整地拆开讲一遍。这篇文章适合谁看如果你正在用VB.NET做WinForms开发手头恰好有“读取Excel数据填充到列表控件”这类需求或者你之前写过类似代码但总觉得不够健壮那这篇内容应该能帮你省下不少试错时间。我会从技术选型开始讲然后一步步拆解读取、清洗、去重、绑定这四个核心环节最后再聊聊实际项目中那些文档里不会写的经验教训。2. 读取Excel的几种技术路线到底该选哪条2.1 常见方案对比OLEDB、Interop、第三方库在VB.NET里读取Excel文件主流方案大致有三种每种都有自己的适用场景和明显的优缺点。我先把它们放在一起对比一下这样你在选型的时候心里有数。方案核心原理优点缺点适用场景OLEDB把Excel当数据库用SQL查询速度快、无需安装Office、代码简洁驱动版本依赖强、混合数据类型列容易出问题数据量大、格式规整的xls/xlsxOffice Interop调用Excel COM组件功能最全、能处理复杂格式必须装Office、速度慢、进程残留风险需要读写格式、公式、多Sheet复杂操作第三方库如EPPlus、NPOI直接解析Open XML不依赖Office、功能强、跨平台需要引入外部依赖、学习成本略高服务端处理、xlsx格式为主我个人的选择逻辑是这样的如果只是单纯读取数据而且Excel文件格式比较规整优先用OLEDB代码量最少性能也够用。如果项目里已经引入了NPOI或EPPlus那就直接用现成的库省得再折腾驱动。Interop方案我现在基本不推荐用在纯数据读取场景启动Excel进程的开销太大而且一旦忘记释放COM对象后台就会残留一堆Excel进程用户那边看起来就是“电脑越用越卡”。2.2 OLEDB连接字符串的细节与驱动版本陷阱选定了OLEDB方案之后第一个要面对的就是连接字符串。这里有个非常关键的细节Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0是两个不同的驱动前者只能读xlsExcel 97-2003后者才能读xlsxExcel 2007及以上。而且ACE驱动还分32位和64位版本如果你的程序编译成AnyCPU在64位系统上跑的时候如果装的ACE驱动是32位的就会直接报“未在本地计算机上注册”的错误。 读取xls文件的连接字符串 Dim connStrXls As String ProviderMicrosoft.Jet.OLEDB.4.0; Data Source filePath ; Extended PropertiesExcel 8.0;HDRYES;IMEX1 读取xlsx文件的连接字符串 Dim connStrXlsx As String ProviderMicrosoft.ACE.OLEDB.12.0; Data Source filePath ; Extended PropertiesExcel 12.0 Xml;HDRYES;IMEX1这里面的HDRYES表示第一行是标题行IMEX1表示“导入模式”这个参数非常重要。如果不加IMEX1当某一列里既有数字又有文本的时候OLEDB会按照前8行的数据类型来推断整列的类型导致后面的文本数据被读成空值。这个坑我在一个客户项目里踩过当时那一列前几行都是编号数字后面突然出现几个带字母的编码结果读出来全是空白排查了半天才定位到是IMEX参数的问题。注意IMEX1只是让驱动以文本方式读取混合列但并不能保证所有情况都完美。如果数据里既有日期又有文本仍然可能出现意外。最稳妥的做法是在读取之后自己做一次类型清洗。2.3 用DataTable承接查询结果的正确姿势连接建立之后读取数据本身倒是很直接用OleDbDataAdapter填充到一个DataTable里就行。但这里有个细节值得说一下查询语句里最好明确指定Sheet名称和列范围不要用SELECT *。Dim dt As New DataTable() Using conn As New OleDbConnection(connStr) conn.Open() 明确指定Sheet名和列避免读取到多余的空列 Dim sql As String SELECT [姓名] FROM [Sheet1$] Using adapter As New OleDbDataAdapter(sql, conn) adapter.Fill(dt) End Using End Using为什么要明确列名因为Excel的Sheet里经常会有一些隐藏的空白列或者辅助列用SELECT *会把这些列也读进来后面处理的时候还得额外过滤。另外Sheet名称如果包含空格或特殊字符需要用方括号包起来末尾还要加$符号这是OLEDB的语法约定。还有一点如果Excel文件正在被用户打开着OLEDB读取的时候可能会报“文件被占用”的错误。这种情况下要么提示用户先关闭文件要么用文件流的方式先把文件复制一份再读。我在实际项目里一般会加一个简单的重试机制或者直接给用户一个友好的提示。3. 数据清洗从DataTable到干净的数据列表3.1 空值、空白行与格式异常的过滤从Excel读出来的DataTable表面上看数据都在但实际上里面可能混着各种“脏数据”。最常见的就是空行——Excel里用户可能在某一行按了回车但没填内容OLEDB读出来就是一行全是DBNull或者空字符串。如果不处理这些空行会直接进入Listbox用户看到的就是一堆空白项。Dim rawList As New List(Of String)() For Each row As DataRow In dt.Rows 取第一列的值根据实际情况调整列索引 Dim value As Object row(0) 过滤DBNull和空白字符串 If value IsNot DBNull.Value AndAlso Not String.IsNullOrWhiteSpace(value.ToString()) Then rawList.Add(value.ToString().Trim()) End If Next这段代码看起来简单但有两个地方容易忽略。第一是Trim()Excel里用户输入的时候经常会在末尾多敲一个空格肉眼看不出来但去重的时候“张三”和“张三 ”就会被当成两个不同的值。第二是IsNullOrWhiteSpace它比单纯的IsNullOrEmpty更严格能过滤掉全是空格的行。3.2 数据类型转换中的隐性陷阱Excel最让人头疼的地方在于它的“智能”类型推断。同一个单元格用户输入“001”的时候Excel可能自动把它变成数字1前面的零就丢了。如果这一列是产品编号或者工号丢了前导零就是大问题。 如果列里可能有前导零需要特殊处理 Dim cellValue As String row(0).ToString() 如果原始数据是数字类型但需要保留格式考虑用ToString(D4)之类的方式补零 但更稳妥的做法是在Excel端就把该列设置为文本格式我的经验是能控制Excel源文件格式的情况下尽量让用户把关键列设置为文本格式。如果控制不了那就在代码里做兼容处理。比如对于编号类的数据可以判断如果转换后是纯数字且长度变短了就按固定位数补零。但这终究是补救措施不如从源头规范。另外还有一个经典问题日期列。Excel里的日期本质上是一个浮点数OLEDB读出来可能是2024/1/15 0:00:00这种格式也可能是一个数字序列号。如果Listbox里要显示日期最好在读取之后统一格式化一遍。3.3 把清洗后的数据装进List(Of String)的意义为什么我不直接把DataTable绑定到Listbox而是要先转成一个List(Of String)原因有三个。第一Listbox的数据源如果直接绑DataTable显示的是DataRowView对象默认调用的是ToString()显示出来的内容往往不是你想要的那一列。虽然可以通过DisplayMember指定但灵活性不如自己控制。第二去重操作在List(Of String)上做比在DataTable上做要直观得多。DataTable去重要么用DataView的ToTable(true)要么自己写循环比较都不如List配合HashSet来得干净。第三中间加一层List后续如果要对数据进行排序、筛选、分组操作起来都更方便。这一层看起来是多了一步实际上是给后面的处理留出了空间。4. 去重策略的选择HashSet、LINQ还是循环比较4.1 三种去重方式的性能与语义差异去重这件事VB.NET里至少有三种常见写法它们的效果和性能差别不小。第一种HashSet去重Dim uniqueList As List(Of String) rawList.Distinct().ToList()这是LINQ的写法底层用的就是HashSet代码最简洁。Distinct()默认使用相等比较器对于字符串来说就是区分大小写的精确匹配。第二种显式HashSetDim seen As New HashSet(Of String)() Dim uniqueList As New List(Of String)() For Each item As String In rawList If seen.Add(item) Then uniqueList.Add(item) End If Next这种写法比LINQ多几行但好处是你能清楚地控制“保留第一次出现”还是“保留最后一次出现”。seen.Add()返回True表示这个元素之前没出现过那就加入结果列表。第三种双重循环比较Dim uniqueList As New List(Of String)() For Each item As String In rawList If Not uniqueList.Contains(item) Then uniqueList.Add(item) End If Next这种写法在小数据量下没问题但数据量一上来就是O(n²)的复杂度。我见过一个项目里用这种方式处理几千条数据界面直接卡了十几秒。所以除非数据量确定很小比如几十条否则不建议用这种方式。4.2 大小写敏感与前后空格去重前必须想清楚的问题去重之前有一个问题必须先想清楚“ABC”和“abc”算不算重复“张三”和“张三 ”算不算重复默认情况下Distinct()和HashSet对字符串都是区分大小写的所以“ABC”和“abc”会被当成两个不同的值。如果你的业务场景里这两者应该合并那就需要传入一个不区分大小写的比较器。 不区分大小写的去重 Dim uniqueList As List(Of String) rawList. Distinct(StringComparer.OrdinalIgnoreCase).ToList()至于前后空格前面清洗阶段已经用Trim()处理过了这里就不用再操心。但如果你在清洗阶段漏掉了去重的时候就会出问题。所以清洗和去重是有先后顺序的一定要先清洗再去重反过来做的话去重完了再清洗可能又会产生新的重复项。4.3 保留顺序还是保留首次出现业务语义决定实现还有一个容易被忽略的点去重之后元素的顺序怎么定Distinct()和上面写的HashSet方案都是保留第一次出现的顺序。也就是说如果原始列表是[B, A, B, C]去重后是[B, A, C]。这个行为在大多数场景下是符合直觉的。但有些业务场景可能要求去重后按字母顺序排列那就需要额外加一步排序Dim uniqueList As List(Of String) rawList. Distinct(). OrderBy(Function(s) s). ToList()我的建议是去重的顺序策略应该在需求阶段就和业务方确认清楚不要自己默认一个行为就完事。我曾经遇到过一个场景用户期望去重后保持Excel里的原始顺序但另一个用户期望按拼音排序最后只能做成可配置的。5. 把数据绑定到Listbox细节决定体验5.1 直接赋值 vs 数据源绑定把数据放进Listbox有两种方式。一种是直接操作Items集合ListBox1.BeginUpdate() ListBox1.Items.Clear() For Each item As String In uniqueList ListBox1.Items.Add(item) Next ListBox1.EndUpdate()另一种是绑定数据源ListBox1.DataSource Nothing ListBox1.DataSource uniqueList两种方式各有优劣。直接添加的方式更直观而且可以在添加过程中做一些额外的判断。数据源绑定的方式代码更少但要注意每次重新绑定前必须先把DataSource设为Nothing否则会抛异常。我通常会用第一种方式因为配合BeginUpdate()和EndUpdate()可以避免每添加一项就重绘一次界面数据量大的时候性能差异非常明显。BeginUpdate()告诉控件“先别急着画”EndUpdate()再一次性刷新这个技巧在处理几百条以上数据的时候效果立竿见影。5.2 大数据量下的界面卡顿与异步处理说到性能就不得不提一个现实问题如果Excel里有几万行数据即使做了去重往Listbox里塞几千条数据界面也会卡住。因为Listbox每添加一项都要触发重绘和布局计算数据量大了就是灾难。解决思路有两个方向。第一个方向是虚拟模式Listbox支持VirtualMode只渲染当前可见的项数据存在后台列表里。这个方案性能最好但实现起来稍微复杂一点需要处理RetrieveVirtualItem事件。第二个方向是异步加载把读取和去重放到后台线程处理完了再一次性更新UI。这样至少界面不会假死用户能看到进度提示。 简单的异步加载示例 Private Async Sub LoadDataAsync(filePath As String) Dim result As List(Of String) Await Task.Run( Function() 在这里做读取和去重 Return ReadAndDistinct(filePath) End Function) 回到UI线程更新控件 ListBox1.BeginUpdate() ListBox1.Items.Clear() For Each item As String In result ListBox1.Items.Add(item) Next ListBox1.EndUpdate() End Sub这里用Await Task.Run把耗时操作放到线程池处理完了自动回到UI线程。注意在后台线程里不能直接操作控件必须等Await返回之后再更新。5.3 去重后数量提示与用户反馈还有一个体验上的小细节去重之后最好给用户一个反馈告诉他一共读了多少条、去掉了多少条重复的。这个信息看起来不起眼但用户会很在意。Dim originalCount As Integer rawList.Count Dim uniqueList As List(Of String) rawList.Distinct().ToList() Dim removedCount As Integer originalCount - uniqueList.Count LabelStatus.Text $共读取 {originalCount} 条去重后 {uniqueList.Count} 条移除重复 {removedCount} 条这样做的好处是如果用户发现去重后的数量和预期不符他能立刻意识到可能是数据本身有问题而不是程序出了bug。我在项目里加了这个提示之后用户反馈“数据不对”的工单少了很多因为大部分情况下他们自己一看数量就明白是怎么回事了。6. 实际项目中踩过的坑与应对经验6.1 Excel文件被占用导致的读取失败这个坑我踩过不止一次。用户双击打开了Excel文件然后直接在程序里点“导入”结果程序报错说文件被另一个进程占用。OLEDB读取的时候会以独占方式打开文件如果Excel已经打开了这个文件就会冲突。应对方式有几种。最简单的是在读取之前先检测文件是否可写Private Function IsFileLocked(filePath As String) As Boolean Try Using fs As New FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None) Return False End Using Catch ex As IOException Return True End Try End Function如果检测到文件被占用就提示用户先关闭Excel。另一种方式是把文件复制到一个临时目录再读取这样就不受原文件占用状态的影响。我一般会根据项目情况选择如果是内部工具直接提示用户关闭文件就够了如果是面向外部用户的产品复制临时文件的方式更友好。6.2 不同Excel版本与Sheet名称的兼容处理Excel文件的Sheet名称也是个容易出问题的地方。默认情况下新建的Excel文件Sheet名叫“Sheet1”但用户可能改成了“数据”、“名单”之类的。如果你的代码里写死了[Sheet1$]换个文件就读不到了。更稳妥的做法是先查询所有Sheet名称然后再动态拼接SQL 获取所有Sheet名称 Dim schemaTable As DataTable conn.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, TABLE}) Dim sheetNames As New List(Of String)() For Each row As DataRow In schemaTable.Rows Dim sheetName As String row(TABLE_NAME).ToString() If sheetName.EndsWith($) Then sheetNames.Add(sheetName) End If Next拿到Sheet名称列表之后可以让用户选择或者默认取第一个。这样无论Sheet叫什么名字程序都能正确读取。另外xls和xlsx的驱动不同这个问题可以通过判断文件扩展名来动态选择连接字符串。虽然多写几行代码但兼容性会好很多。6.3 去重逻辑与业务规则的冲突案例最后分享一个比较有意思的案例。有个项目里用户要求对一列“客户名称”去重但去重之后发现数量不对。排查后发现Excel里有些客户名称是全角字符有些是半角字符比如“”和“(”肉眼看起来几乎一样但程序认为是不同的字符串。这种问题没有通用的解决方案只能根据具体业务规则来处理。常见的做法是在清洗阶段做一次字符规范化把全角转半角、把各种不可见字符去掉。 简单的全角转半角处理针对常见标点 Private Function NormalizeString(input As String) As String Dim result As New StringBuilder() For Each c As Char In input If c ChrW(65281) AndAlso c ChrW(65374) Then 全角字符转半角 result.Append(ChrW(AscW(c) - 65248)) ElseIf c ChrW(12288) Then 全角空格转半角空格 result.Append( c) Else result.Append(c) End If Next Return result.ToString().Trim() End Function这个函数不一定适用于所有场景但思路是通用的在去重之前先把数据规范化到统一的格式。至于规范化的规则需要和业务方一起确认不能自己拍脑袋决定。6.4 内存释放与资源管理的注意事项OLEDB读取Excel的时候OleDbConnection、OleDbDataAdapter、DataTable这些对象都实现了IDisposable接口用完必须释放。虽然.NET有垃圾回收机制但数据库连接这种资源如果不及时释放可能会导致文件句柄一直被占用后续操作就会失败。我习惯用Using语句块来管理这些资源确保无论是否发生异常资源都能正确释放。另外DataTable如果数据量很大用完之

相关新闻

AnyPS5跨平台串流实战:低延迟游戏串流架构与优化指南

AnyPS5跨平台串流实战:低延迟游戏串流架构与优化指南

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计野心第一次看到“AnyPS5”这个命名,我的直觉是:这大概率是一个围绕主机游戏串流展开的跨平台工具项目。名字里的“Any”是核心——它暗示的不是单一平台、单一设备,而是“任…

2026/10/13 1:39:10 阅读更多 →
VirtualBox虚拟机与主机互通,并且虚拟机又能上网

VirtualBox虚拟机与主机互通,并且虚拟机又能上网

## 四种网络模式1、NAT 网络地址转换模式(NAT,Network Address Translation) 2、Bridged Adapter 桥接模式 3、Internal 内部网络模式 4、Host-only Adapter 主机模式 版本一:## 设置1、关闭虚拟机,VirtualBox->偏好设置->网络NAT网络,…

2026/10/13 1:38:10 阅读更多 →
副队长CSS教程(1)–初识CSS

副队长CSS教程(1)–初识CSS

本文目录0. 写在前面1. HTML与CSS区别2. CSS有哪些功能3. 如何学习CSS0. 写在前面 这段话是这个系里教程完结后写的,CSS教程一共39篇,终于是完结了。 我用个人认为的合理顺序,介绍了CSS技术主要的技能点,并且对比较复杂的知识点…

2026/10/13 1:38:10 阅读更多 →

最新新闻

Reclilisib:从PI3K激动剂到选择性辐射保护剂的双重角色

Reclilisib:从PI3K激动剂到选择性辐射保护剂的双重角色

做肿瘤放疗研究的朋友应该都有过这种纠结:治疗窗口太窄,射线过去,肿瘤细胞和正常组织一起遭殃。我们这些年一直在找"选择性辐射保护剂"——最好能保护正常细胞,却不给肿瘤细胞留活路。我第一次注意到Reclilisib&#xf…

2026/10/13 2:18:27 阅读更多 →
MFC连接MySQL实战:ODBC封装、CRUD与避坑手册

MFC连接MySQL实战:ODBC封装、CRUD与避坑手册

简介:这是一套面向MFC桌面应用开发者的MySQL数据库访问示例工程,核心演示如何借助ODBC标准数据库接口,在C程序中完成连接建立、SQL查询、结果集遍历与数据更新等常用操作。压缩包内共含117个文件,压缩后约181KB;其中49…

2026/10/13 2:18:27 阅读更多 →
从Java转运营第5天:用技术思维做抖音新号,先学会拆解对标账号

从Java转运营第5天:用技术思维做抖音新号,先学会拆解对标账号

今天是我从 Java 转运营的第 5 天,也是正式开始折腾抖音新号起号的日子。说实话,从写完第一版账号简介到研究“到底该发什么”,我踩的坑比写的需求还多。如果把起号比作一次系统上线,那我 Day05 最大的收获就是:先别急…

2026/10/13 2:18:27 阅读更多 →
安卓手机跑 Windows 应用完整指南:Winlator 安装、配置与排障实操

安卓手机跑 Windows 应用完整指南:Winlator 安装、配置与排障实操

安卓手机跑 Windows 应用完整指南:Winlator 安装、配置与排障实操 【免费下载链接】winlator Android application for running Windows applications with Wine and Box86/Box64 项目地址: https://gitcode.com/GitHub_Trending/wi/winlator 手机里下了个 .…

2026/10/13 2:18:27 阅读更多 →
eksctl v0.149.0 发布解析:AWS 区域环境变量修复与 eksctl-io 组织迁移

eksctl v0.149.0 发布解析:AWS 区域环境变量修复与 eksctl-io 组织迁移

云原生容器编排DevOps 【免费下载链接】eksctl The official CLI for Amazon EKS 项目地址: https://gitcode.com/gh_mirrors/ek/eksctl 点击查看 免费下载 本指南围绕 eksctl 官方 CLI 的 v0.149.0 发布说明展开,逐项解析该版本引入的功能更新、两个关…

2026/10/13 2:18:27 阅读更多 →
Win11升级后应用打不开?从升级机制到修复方案全解析

Win11升级后应用打不开?从升级机制到修复方案全解析

最近一段时间,我这边处理最多的求助不是软件本身崩溃,而是同一句话:升完 Win11 之后,XX 应用打不开了。有的是设备厂商的配置工具,点开就没反应;有的是行业软件启动后直接闪退;还有的是虚拟机一…

2026/10/13 2:17:27 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →