新闻详情

新闻详情

首页 / 资讯中心 / 详情

Univer接入指南:用开源办公套件构建在线协同表格

发布时间:2026/9/30 0:56:31来源:尧图网络
Univer接入指南:用开源办公套件构建在线协同表格
最近在给团队搭内部数据中台的时候表格选型又把我拉回“自己造轮子还是借轮子”的老问题。业务方要求 Excel 的操作习惯不能丢浏览器打开就能改还要能把数据直接写回后端。看了一圈老牌表格库要么重编辑轻 API要么编辑体验停留在上个时代。直到有个同事甩给我一个开源项目叫 Univer。它不只是一个“表格组件”而是一整套可以在线运行、可以嵌入自己系统的办公套件。我花了一周时间从零接入把原来后台里的静态报表换成了能直接操作的在线工作表。这篇就围绕 Univer 的选型、接入和踩坑做个记录给准备做在线表格、协同编辑或者内部数据工具的同学一个参考。1. Univer 到底是什么先搞清楚它的三条技术主线1.1 一个能装进任何应用的“Excel”如果只能一句话介绍 Univer我会说一套用 TypeScript 开发的开源办公套件能在浏览器里提供类似 Excel 的编辑能力同时也能像普通前端库那样嵌入现有系统。目前它主要覆盖三块电子表格、文档、演示文稿。其中电子表格是社区用得最多、功能成熟度最高的模块这也是为什么大家讨论 Univer 时经常会把它和“在线表格”画等号。Univer 解决的核心问题是把你自己的产品从一个“只能展示数据的网页”升级成“能编辑、能计算、能协同的数据工作台”。你不需要让用户另外打开一个云文档平台也不需要把他引到其他工具上直接在业务系统里操作表格数据。这对很多做低代码平台、内部管理系统、数据看板后台的团队来说价值非常直接。我第一次需要用到它是在一个低代码平台的项目上。业务方希望管理员在后台维护一张多行配置表每个字段都要有校验规则而且多个管理员同时修改时不能互相覆盖。当时市面上能选择的表格方案不多Univer 正好把所有点都覆盖了数据校验、公式计算、协同编辑UI 还能直接嵌进后台页面不需要再维护一个独立的 iframe 服务。当然越是功能全的东西使用门槛越不低。Univer 的文档和示例在很多细节上仍在快速变化如果不理解底层设计初期的确会走弯路。1.2 一条核心渲染管线Canvas 不是炫技Univer 的表格区域不是用普通 HTML 表格渲染的而是用 Canvas 自己绘制单元格、选区、滚动条。这个设计第一眼可能只是觉得“更流畅”但实际上它对架构产生了很深的影响。传统 DOM 表格在页面里维护数千个 DOM 节点后重排、事件绑定都会明显变慢。Univer 把整个表格当成一块画布只绘制当前视口内能看到的格子滚动时对画布进行重绘这样即使有上万行甚至更多数据时交互帧率依然能保持在一个可接受的范围。不过Canvas 并非没有代价。既然是画出来的浏览器默认的文本查找、复制、无障碍功能就不完全适用。Univer 通过叠加多个 Canvas 层和隐藏辅助层来解决这类问题公式栏、工具栏这些传统 UI 元素还是用 DOM 实现。这意味着如果你要自定义悬浮提示、右键菜单或者做无障碍适配需要先理解它的分层机制而不是像普通网页一样操作 DOM 就能搞定。我在最开始做自定义导出按钮时就因为没有搞清楚工具栏和画布的分层关系导致按钮被盖住后来才发现问题出在样式覆盖而不是 Univer 本身。从体验角度说这种渲染路径更适合高频交互的场景。用户在格子里输入、拖动、选择区域、滚动查看所有这些操作都发生在画布上。只要你的场景里表格数据有几千行以上Univer 的渲染优势就能体现出来。如果你的表格只有几十行其实用什么技术渲染差别不大没必要为这个特性买单。1.3 命令模式为什么协同要先从操作抽象开始Univer 内部把用户的每次操作比如改值、合并单元格、加样式、插入行列都封装成一个 Command也就是命令。命令会进入一个调度器执行调度器负责记录命令历史、支持撤销重做。这种设计初看有点重实际在开发中却极其关键。假如你直接让用户“改一下 state”那么撤销和重做很难做操作日志也很难记录。命令模式让一切操作都变成了可序列化的数据。得益于这一点你在前端调用 Univer 的时候不需要直接摸它内部复杂的数据结构只需要构造命令并发送。Univer 提供的 Facade API 可以简化命令操作你把它理解成给后台开了一个“遥控器”你说一句“把 A1 单元格的值改成 100”它会自动生成命令、执行、记录然后你还能拿到执行后的结果。如果后续协同模块接入这条命令还可以原封不动地发给其他客户端。命令模式还有一个额外的好处审计。在企业管理场景里经常要知道谁在什么时候改了什么数据。有了统一操作日志这些都不需要额外开发。我之前做一个报表中心时直接记录了系统产生的命令流水出了问题可以重放查找责任或者排查数据异常都非常方便。否则如果只有数据库最终值你根本不知道数据是怎么被改成现在的样子的。1.4 插件是一把双刃剑Univer 的功能几乎都以插件形式存在公式、协同、权限、查找替换、工具栏、图表等都是独立插件。这套插件体系让你可以按需加载按需打包。比如一个内部工具只需要表格编辑不需要图表和权限那引入的核心包体积就可以控制在很小的范围。这在现代前端工程里既是优点也是学习成本来源。优点是灵活缺点是不知道要装什么的时候特别容易踩坑。我之前遇到过一个奇怪的问题公式输入后永远不出结果。查了半天才发现是页面里只加载了基础表格 preset没有注册公式插件。Univer 不会因为你界面看起来像表格就自动给你带公式能力。类似的还有协同协同功能需要额外引入协同插件并且要配合服务端才能工作不是打开就能用。插件化还会影响打包体积和复杂度。如果你的组件库还引入了其他图表库、UI 库树摇优化需要处理得很小心。我的建议是在项目初期就按文档把插件列表列出来明确业务需要哪些能力尽量避免“先全量引入再慢慢删”的做法。全量加载一时爽上线性能火葬场这一点在 Univer 身上体现得特别明显。2. 表格选型怎么选Univer、Luckysheet、SheetJS、OnlyOffice 的取舍2.1 一张表看懂四个方案的定位在确定 Univer 之前我列了四个候选方案Univer、Luckysheet、SheetJS、OnlyOffice。它们的定位差异很大不能简单比较“谁好用”。Univer 是办公套件 SDK强调嵌入能力Luckysheet 是开源的在线表格轻量但协同能力弱SheetJS 本质上是一个 Excel 解析和生成库根本不提供交互编辑OnlyOffice 则是完整的办公服务产品协同成熟但要额外维护服务端。方案定位交互编辑协同能力嵌入难度适合场景Univer开源办公套件强接近桌面插件支持中内嵌在线表格深度定制需要协同Luckysheet开源在线表格较好需要自研低简单在线表格轻量项目SheetJSExcel 解析/生成库无无低只做文件导入导出OnlyOffice办公服务全家桶很强内置高自建完整办公系统接受额外服务表格不是绝对的真正到选型时要从业务需求反推。比如你只是需要把后端的 Excel 文件在前端生成、下载SheetJS 就够了。你不需要一个交互编辑器引入 Univer 反而增加页面体积。如果你要在系统内嵌一个能编辑、能算公式的表格SheetJS 显然不满足。于是选型范围缩小到 Univer、Luckysheet、OnlyOffice 之间。Luckysheet 在国内开发者圈子里知名度不低交互也比较不错很多早期项目都在用很多人可能都踩过它的坑。但它的问题是维护节奏不太稳定协同、权限这类能力需要自己造轮子。对于个人项目或者简单后台它是一个快速方案一旦团队能力和时间有限后面升级和修 bug 的成本会偏高。OnlyOffice 功能完善自带文档、表格、幻灯片全家桶协同也很成熟但它是一套重量级服务端产品部署和维护成本不是一般团队愿意承担的。2.2 我为什么把票投给 Univer我当时的业务需求有四个硬指标。第一用户必须无缝延续 Excel 操作习惯拖动填充、快捷键、右键菜单都要有。第二表格要嵌在现有管理后台里不能让用户跳去另一个系统。第三要能接入我们自己的登录和权限体系不只是“能改”。第四多人要同时编辑同一套报表改动要实时同步。这四个指标一起提出来可选项其实就不多了。OnlyOffice 能满足协同但要额外维护一套服务器并且如果你只想内嵌它的表格模块整个集成体验并不轻。Luckysheet 能满足前两条后两条几乎从零开始。Univer 的架构天然就为命令和插件设计协同是其中一环权限又可以借助命令拦截来做同时它是 TypeScript 写的 SDK跟前端工程的语言栈一致遇到问题可以直接看源码调试。综合下来Univer 成了最匹配的选项。当然选 Univer 也有风险。当时它的版本迭代很快API 调整频繁社区资料也不算多。为了降低风险我在项目里用了一个很土的办法在 Univer 外面套了一层自己定义的数据访问层。不管 Univer 内部 API 怎么变业务代码只调用我们这层的 loadSheet、saveSheet、registerCellChange 等方法。后面升级版本时只需要改这一层。这个习惯后来救了我很多次也建议所有深度使用开源 SDK 的团队都这么做。2.3 哪些场景用不上 UniverUniver 很强但不是万金油。如果你的需求只是在一张静态网页里展示表格数据根本用不上它。直接写一个 HTML table或者用一个轻量的虚拟滚动表格库加载速度更快、代码更简单。Univer 自带工具栏、公式栏、标签页这些对纯展示场景是多余功能还会增加学习成本。另外如果核心需求是服务端批量生成 Excel 文件你不应该在任何前端引入 Univer。服务端用 SheetJS 或类似的库处理数据生成文件让它下载效率和稳定性都高得多。Univer 是一个面向用户交互的编辑器而不是数据处理管道。还有就是原生移动端场景Univer 目前主要服务 Web 端手机上的触控体验还有不少限制如果你要在 iOS/Android 里做内嵌表格编辑建议先做移动端适配验证不要头脑一热把整个套件打包进去。选型这件事最重要的是把“我要解决什么问题”想清楚。办公套件非常多没有哪一个方案在所有维度上都赢。你需要的是在“功能丰富、嵌入成本、协同能力、维护成本”四者之间找平衡点。我个人选择 Univer是因为它的方向和我团队的技术栈、业务需求足够贴合而不是因为它听起来最厉害。3. 快速实操把 Univer 集成到现有前端项目3.1 从 npm 安装到页面出现第一个表格我以 Web 项目为例直接采用 npm 安装。官方现在提供预设包尽量用预设包而不是零散引入预设包会把常用模块组合好减少配置量。在我使用的版本中装核心组件和样式后就可以初始化npm install univerjs/preset-sheets然后在前端入口引入并创建一个容器div idsheetContainer stylewidth: 100%; height: 600px;/div再写初始化逻辑。这里我刻意不贴太长的代码因为 Univer 的 API 版本迭代频繁照抄旧版本代码很可能会直接报错。我安装版本里的初始化看起来类似这样import { Univer } from univerjs/preset-sheets; import { LocaleType } from univerjs/core; const univer new Univer({ locale: LocaleType.ZH_CN, container: document.getElementById(sheetContainer), });正确的姿势是去官方文档或 GitHub 仓库的 examples 目录找你安装版本一致的示例。包名不同、构造函数参数不同是最常见的问题。我在接入时就看到社区里有大量旧示例比如早期版本用Univer.newInstance后来改成new Univer如果你混着看很容易陷入“明明照做了但运行不起来”的境地。初始化之后表格不会自己出现数据需要创建 Workbook代码很简单const workbook univer.createWorkbook({ name: Demo }); const sheet workbook.getActiveSheet();到这里页面上已经有一个带空表格的 Univer 实例了。你可以手动输入、拖拽、合并单元格几乎和打开一个新的 Excel 文件一样。这一步如果顺利后面所有功能都建立在它之上如果不顺利先检查版本和依赖再检查容器高度。3.2 初始化配置里最容易踩的参数在实际接入时有一些配置会直接影响使用体验文档往往一笔带过但实操中一定要确认。我把最需要关注的几个参数整理成了一个表格方便快速对照。配置项作用我的建议locale界面语言中国团队用 zh-CN避免函数名、菜单变成英文container挂载容器容器必须有明确高度否则白屏插件列表功能开关需要公式就注册公式插件需要协同再注册协同插件worker计算和渲染线程数据量大开启能避免 UI 卡死主题配置外观定制和业务系统保持统一后期再做也行最容易被忽略的是容器高度。Univer 渲染时如果容器高度为 0会直接白屏或者只显示工具栏。这不是组件 bug而是 Canvas 画布没有可用空间。所以我在所有接入页面里都会给容器写死高度或者在上层布局里用 flex 分配高度而不是依赖内容撑开。公式插件也是高频问题。如果业务里要输入SUM(A1:A10)你需要确认公式插件已经注册。没有注册时手动输入公式会被当成普通文本存进去这个现象特别容易让人误以为“不支持公式”实际上只是插件没开。还有 worker 配置如果打开大数据文件感觉界面卡顿可以尝试把计算放到 Web Worker 里缺点是调试公式、断点会麻烦一些需要接受异步化的复杂度。3.3 把后端数据灌进表格再把结果读回来产品里实际场景是后端返回 JSON前端渲染成表格用户编辑后提交回后端。这个流程看起来简单但要注意批量操作和读取效率。下面用简化 API 举例具体方法名请对照你当前版本文档。假设后端返回[ { month: 2024-01, sales: 120 }, { month: 2024-02, sales: 150 } ]前端先拿到 sheet然后把表头和数据写入。这里最简单的方式是构造二维数组const rows [ [月份, 销售额], [2024-01, 120], [2024-02, 150], ]; sheet.setRangeValues(0, 0, rows);批量写入比逐格 setValue 高效得多。写完数据后设置首行加粗、加背景色、冻结首行这些操作可以通过 Univer 提供的工作表样式接口完成。要注意如果一次 setRangeValues 的数据量特别大比如几万行建议分批次写入否则初始化那一下会明显掉帧。用户编辑完之后把工作表内容读出来。简单做法是遍历行和列读取单元格值。实际工程里可以用快照接口拿到整个工作区的数据快照再在后端解析。核心提醒是不要在每次单元格 change 事件里都去全量读取一遍表格那样既慢又容易造成前端卡顿。最好只在用户停止操作时保存比如防抖 500ms或者等用户点“保存”按钮再提交。4. 实战拆解造一个支持协同的在线报表中心4.1 需求拆解一个报表中心到底要解决什么问题一个报表中心听起来简单真正落地要回答的问题是谁在维护数据数据从哪里来多个用户同时改同一格怎么处理改坏了能不能恢复我把需求拆成五块。账号与权限复用企业现有登录体系区分只读和编辑角色。数据初始化打开页面时从服务端拉取当前工作表快照。本地编辑Univer 负责交互所有改动触发命令事件。自动保存把命令日志和定期快照同步到服务端。协同广播在线客户端互相接收命令实时刷新。这五块不是线性的而是互相交织。我建议架构上把 Univer 视为纯前端交互层所有业务逻辑都在它外部完成。比如权限判断不要在 Univer 内部强行判断角色而是通过统一封装来检查当前用户能否执行某个命令。这样如果未来换编辑器业务逻辑不必推倒重来。实际操作中我先从“单机版”开始只实现前三块不碰协同。等确认数据落库、加载、编辑、保存都没问题后再加大协同。这样做的原因是每次变更范围小问题定位快。如果你一上来就同时接权限、协同和保存出了 bug 很难排查是因为 Univer 配置问题还是服务端同步问题。4.2 前后端的命令流协同一致性的关键协同编辑的核心思路不是同步“最终画面”而是同步“操作命令”。用户 A 执行了一个改值命令在本地生效后命令会通过 WebSocket 发给服务端。服务端做三件事身份校验、命令合法性校验、给命令分配一个全局递增序号然后把带序号的消息广播给房间内所有客户端。客户端收到消息后按序号顺序执行命令从而保持一致。为什么要分配全局序号因为在网络环境下不同客户端发出的命令到达服务端的时间不同。如果只按“先到先得”顺序执行不同客户端可能因为网络延迟收到不同的命令顺序最终结果对不上。统一的序号是分布式系统里最简单的排序手段。配合“快照加命令日志”还可以实现断线重连客户端先收到一个基础快照然后依次应用自己缺席期间的所有命令。我做的第一期没有复杂的协同协议只是用命令日志加一个乐观锁。每个工作表维护一个版本号前端保存数据时要带上自己拿到的版本号服务端发现版本过期就要求客户端先拉最新快照再合并本地修改。这个方案对多人改不同区域的情况完全够用但对多人同时改同一个单元格依然会变成后写覆盖前写。如果你的业务不能接受这种结果就必须引入 OT 或 CRDT。4.3 并发冲突OT、CRDT 与“够用就好”的方案OT 和 CRDT 是两种不同的协同模型。OT 的核心是在服务端对操作做转换让并发操作可以合并Google Docs 这类产品用的就是这个思想。CRDT 则让每个节点都维护一份无冲突的数据结构不需要中心节点做复杂转换。表格这个场景行和列会插入、删除CRDT 需要处理坐标映射复杂度比纯文本高得多。对大多数内部报表场景我的建议是不要一上来就追求工业级协同算法。先把产品需求想清楚你们真的需要多人同时编辑同一个 Sheet 吗还是说仅仅需要一个“在线分享、轮流编辑”的体验如果多人编辑只发生在不同 sheet 标签页那冲突概率极低用版本号和最后写入覆盖就够了。如果多人会聚焦同一片区域操作那就老老实实考虑引入成熟协同后端或者找 Univer 官方协同方案。自己写 CRDT 的团队通常会把大量时间消耗在数据同步算法上反而没有精力迭代业务功能。即便不用复杂协同命令日志也有很大价值。我做的报表中心里每个单元格变更都记录一条带用户、时间、命令数据的日志。后端可以做精确的审计知道某个数字在周五下午被谁改成了多少。这个能力在很多业务系统里是刚需但它几乎不增加开发成本因为 Univer 已经把命令抽象出来了。4.4 权限、审计和断线恢复权限最好在命令层做。Univer 的插件系统允许你在命令执行前插入拦截逻辑一旦发现当前用户没有目标区域的操作权限就直接拒绝。这比只靠按钮显隐更安全。配合后端再次校验形成双重保险。前端做权限主要是提升用户体验后端校验才是安全底线这个原则在接入 Univer 时同样成立。断线恢复我采用“定期快照 增量命令日志”的策略。每 5 分钟服务端保存一份完整工作表快照并记录从快照版本之后的所有命令。客户端断线重连时先取快照再应用缺失命令。如果快照版本太旧、命令日志过长就重新生成快照再下发。这个策略很朴素但非常稳也容易排查问题。还有审计。所有命令日志都带上用户信息、操作时间、命令名称。不要小看这些字段一旦出现数据事故你能立刻定位到是哪个页面、哪个浏览器、哪个用户触发的。我在项目里还加了一个回放功能输入起始时间就能把这段时间的数据库变更新走一遍。这个功能在排查“莫名数据被改”时简直是救命稻草。5. 避坑篇从 Demo 到生产环境我踩过的那些问题5.1 常见问题速查表把我在社区和项目中遇到的问题整理成一个速查表希望能帮你少走几步弯路。现象常见原因解决办法页面白屏容器高度为 0或样式文件未引入给容器固定高度确认样式包加载公式不计算没有注册公式插件按官方文档注册公式插件撤销没用代码直接用内部 API 改数据统一走命令接口操作而不是直接改状态协同数据不一致命令顺序未统一服务端全局排序客户端按序号应用导出 Excel 样式丢失样式被精简或字体缺失检查序列化配置保留字体映射加载大文件卡死全量塞进一张 Sheet分批渲染视口按需加载白屏问题是最常见的。很多时候开发和测试环境正常一到生产就白屏多半是资源配置或者容器高度不同。记得在生产环境预发布前先检查父级容器有没有被压缩成 0。公式不计算则要看 Univer 是不支持还是没注册通常注册插件后立刻就能用这一点需要团队里的前端同事重点确认。撤销没用属于比较隐蔽的坑。如果你自己用了一些非官方接口直接改单元格数据绕过命令系统Univer 不知道如何撤销。所以团队里必须约定所有对工作表的修改都要通过命令或 Facade API而不是直接操作内部对象。一旦有个别同学绕过就可能出现“撤销按钮是灰的”或者“撤销乱了套”的情况。5.2 大数据量性能优化的一手经验我拿 5 万行、10 列的数据测过 Univer。默认全量写入时页面初始化会明显停顿滚动过程中偶尔有掉帧。这个问题不是 Univer 渲染不行而是“一次性数据灌入”和“实时重绘大量单元格”双重压力。我尝试了几种优化后最终效果最好的是分页加载和视口预取。具体做法是只把当前可视区域附近的数据通过接口加载到前端滚动停止后再请求下一段数据。前端通过监听滚动事件判断当前行的范围。这里要注意做防抖否则滚动一次会触发几十次请求。配合 Web Worker 做公式计算用户在等待数据时界面不会完全卡死。还有几个小细节关闭不需要的插件不要在工作簿里保留多余的历史版本如果只是展示少量表格数据别用 Univer。这些听起来像废话但在实际项目中经常被忽略。性能优化优先级我认为是“先少做功能再提速”而不是把所有模块堆上去之后再做减法。5.3 版本升级与团队协作的注意点Univer 的版本更新非常快升级大版本时 API 可能不兼容。团队里最好指定一位同学负责更新评估建立一个升级清单检查破坏性变更、跑一遍核心用例、验证导出的文件格式、确认协同模块没有回归。不要直接在业务分支上升级依赖而是先在单独分支做兼容测试。另一个注意点是要锁定版本号。如果你在 package.json 里写的是带^的范围npm install 会自动装到新的 minor 或者 patch 版本。对于还在快速迭代的开源 UI 类项目自动升级可能引入你根本不知道的变化。我会在项目里锁定精确版本至少是核心包避免“今天好好的明天部署炸了”的情况。还有代码层面的隔离。我前面提到的数据访问层在这里会发挥大作用。团队其他成员不要直接 import Univer 的内部模块所有代码走封装接口。这样升级主版本时只有封装层需要改业务层实现不受影响。这个习惯很朴素但确实是少数团队能做到的“好设计”。6. 关于 Univer 的两个问题和我的判断6.1 现在能不能用于生产环境有些人看到 Univer 还在快速迭代会担心能不能上生产。我的答案是可以但有条件。如果你的场景只是“后台嵌入表格编辑”不需要协同那么用 Univer 完全没问题。它已经支撑了不少社区里的实际项目基础的渲染、公式、样式等功能已经稳定。只要提前做好核心流程回归测试生产使用风险是可控的。如果你要的是多人实时协同、复杂权限、离线编辑这种强一致性的场景我建议把协同模块的集成工期单独排出来。不要假设装一个插件就能解决一切。协同需要服务端配合需要定义协议需要处理冲突和重连这些是工程问题不是插件问题。先小范围试点再全量推广会更稳妥。我在生产环境的体验是稳定性和可控性比两三年前的同类项目好很多但离“一键部署、什么都不用管”还有距离。把它当成一个需要团队投入维护的开源基础设施心态就会平衡很多。这也是开源软件的正常状态你享受它的灵活性和可定制性同时要承担它的 bug 和 API 变动。6.2 团队要具备哪些能力才建议上手如果团队里有一个能读懂 TypeScript 源码的前端并且对命令模式、Canvas 渲染有一定理解那 Univer 会是比较顺畅的选择。如果团队只会调 npm 包的 API遇到问题只能上社区搜答案那建议谨慎。因为 Univer 的很多问题不是改两行配置就能解决的需要从源码层面定位。另外最好有后端配合做协同和权限设计。我见过很多前端同学把 Univer 接进来结果因为没有后端命令流接口协同彻底无法落地最后只能把它当单机表格用。单机表格并非不行但如果你选 Univer 的初衷之一就是协同后端能力就要提前想好。否则协同这个卖点完全发挥不出来。最后说一点个人的实操体会不要被官网支持的功能列表迷惑。功能列表只代表官方实现了这个模块不代表你的项目里已经接入并能稳定运行。任何复杂开源项目都要先跑通最小闭环再逐步加功能。我用 Univer 的过程中最有效的做法就是先实现“创建工作簿、加载数据、编辑、保存、导出”五步然后再决定要不要加协同、权限和图表。我现在的报表中心就是从这五步长出来的每次加新功能之前都会先回到这条主线上验证一次避免被复杂的插件配置拖住。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

56. 合并区间(扫描线) 2026/9/30 1:40:30

56. 合并区间(扫描线)

解决方法: 56. 合并区间 - 力扣(LeetCode) 按照区间的左边界排序 假如有区间已经按照左边界排好序,[i,j] [k,g] 如果[i,j] [k,g], 如果k大于j,则[i,j]和[…

阅读更多 →
C++ 实用网站(推荐) 2026/9/30 1:40:29

C++ 实用网站(推荐)

目录 1.官方网站 2.参考手册(官方-中文版) 3.基础知识 4.在线工具 5. 学习博客 1.官方网站 http://www.cplusplus.com/ http://cpp.sh/(Online Execution Tool) 2.参考手册(官方-中文版) https://zh.cppreference.com/w/c…

阅读更多 →
SQL 复杂中位数与平滑移动窗口极致写法:基于 PERCENTILE_DISC 与动态 Frame 边界 2026/9/30 1:40:22

SQL 复杂中位数与平滑移动窗口极致写法:基于 PERCENTILE_DISC 与动态 Frame 边界

SQL 复杂中位数与平滑移动窗口极致写法:基于 PERCENTILE_DISC 与动态 Frame 边界在企业核心薪酬统计、高频接口响应耗时监控(P50 / P90 / P99)、以及消除异常离群点干扰的平滑趋势分析中,中位数(Median / 50th Percent…

阅读更多 →
DeepSeek生成MIDI:从API到多轨编曲的AI作曲工作流 2026/9/30 1:40:16

DeepSeek生成MIDI:从API到多轨编曲的AI作曲工作流

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

阅读更多 →
政务大模型落地指南:DeepSeek选型、部署与避坑实践 2026/9/30 1:40:16

政务大模型落地指南:DeepSeek选型、部署与避坑实践

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

阅读更多 →
C++结构体排序全解析:从sort原理到比较器写法与避坑指南 2026/9/30 1:40:16

C++结构体排序全解析:从sort原理到比较器写法与避坑指南

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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