[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-excel-export-performance-zh-CN":3,"blog-adjacent-excel-export-performance-zh-CN":29,"blog-related-excel-export-performance-zh-CN":66},{"id":4,"slug":5,"title":6,"excerpt":7,"content":8,"cover":9,"tone":10,"author":11,"publishedAt":12,"updatedAt":12,"readingMinutes":13,"featured":14,"tags":15,"category":19,"seoSettings":28},37,"excel-export-performance","报表导出为什么这么慢","十万行数据导出卡死浏览器，问题往往不在生成文件，而在查询和内存使用方式。","\u003Cp>后台系统里，导出功能几乎一定会被抱怨慢。用户点击导出后页面转圈几十秒，严重时直接超时。我们优化过十几个导出功能，原因集中在三处。\u003C\u002Fp>\n\u003Ch2>三个典型原因\u003C\u002Fh2>\n\u003Cp>一次性把全部数据加载进内存。十万行乘二十列，对象化之后占用几百兆，服务器很快撑不住。\u003C\u002Fp>\n\u003Cp>在循环里查数据库。每行都要查一次关联表，一万行就是一万次查询，耗时成倍增长。\u003C\u002Fp>\n\u003Cp>同步导出。请求一直挂着等文件生成，网关超时后前端报错，实际上文件还在后台继续跑。\u003C\u002Fp>\n\u003Ch2>我们的改造方式\u003C\u002Fh2>\n\u003Cp>改为流式写出，边查边写，内存占用保持在固定范围。\u003C\u002Fp>\n\u003Cp>关联数据提前批量查询，在内存里做映射，避免逐行查库。\u003C\u002Fp>\n\u003Cp>大文件改为异步任务：提交后立即返回任务编号，完成后通知下载，用户不必守着页面。\u003C\u002Fp>\n\u003Cp>导出功能看似简单，实际上是查询、内存和用户体验的综合考题。把它做稳，后台的信任度会明显提升。\u003C\u002Fp>","","indigo","佳益方圆团队","2026-07-25T16:31:00+08:00",1,false,[16,17,18],"报表","导出","性能",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},0,"engineering","技术专栏","架构设计、性能优化、AI 集成与跨端方案等一线技术实践，由研发团队持续分享。","cpu","blue","article",60,{},{"previous":30,"next":48},{"id":31,"slug":32,"title":33,"excerpt":34,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":36,"updatedAt":36,"readingMinutes":13,"featured":14,"tags":37,"category":41},16,"payment-terms-before-kickoff","收款这件事，要在开工前谈好","很多纠纷不是因为做不好，而是因为钱怎么付一开始就没说清楚。","cyan","2026-07-27T15:18:00+08:00",[38,39,40],"创业","合同","回款",{"id":42,"parentId":20,"slug":43,"name":44,"description":45,"icon":46,"cover":9,"tone":25,"kind":26,"sortOrder":47,"count":20},6,"founder-notes","创业手记","创始团队在经营、管理与产品上的思考，记录一家软件公司的成长过程。","pen-tool",10,{"id":49,"slug":50,"title":51,"excerpt":52,"content":9,"cover":9,"tone":53,"author":11,"publishedAt":54,"updatedAt":55,"readingMinutes":13,"featured":14,"tags":56,"category":59},9,"tech-open-day-2026","技术开放日：把架构决策讲给客户听","把内部评审开放给客户，用他们能听懂的语言讲清取舍，是建立长期信任的一部分。","teal","2026-07-24T16:30:00+08:00","2026-10-18T15:58:14.758+08:00",[57,58],"技术开放日","客户交流",{"id":60,"parentId":20,"slug":61,"name":62,"description":63,"icon":64,"cover":9,"tone":25,"kind":26,"sortOrder":65,"count":20},4,"team-culture","团队动态","公司活动、技术分享、团建与招聘文化，了解佳益方圆团队的日常。","users",30,[67,77,89],{"id":65,"slug":68,"title":69,"excerpt":70,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":71,"updatedAt":71,"readingMinutes":13,"featured":14,"tags":72,"category":76},"integration-api-pitfalls","企业系统集成：接口对接最容易踩的五个坑","接口文档写得再全，真正对接时仍然会卡在字段约定、超时和重复推送这些细节上。","2026-10-17T09:00:00+08:00",[73,74,75],"系统集成","接口","工程实践",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},{"id":13,"slug":78,"title":79,"excerpt":80,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":81,"updatedAt":82,"readingMinutes":83,"featured":84,"tags":85,"category":88},"why-enterprise-systems-age","为什么企业系统会在三年后开始“老化”","系统上线时功能齐全，三年后却处处别扭。问题往往不在代码，而在交付时被忽略的那些变化。","2026-10-16T09:30:00+08:00","2026-10-18T15:58:14.648+08:00",2,true,[86,87],"系统演进","架构设计",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},{"id":90,"slug":91,"title":92,"excerpt":93,"content":9,"cover":9,"tone":25,"author":11,"publishedAt":94,"updatedAt":94,"readingMinutes":13,"featured":14,"tags":95,"category":99},31,"idempotent-design-basics","幂等设计：重复提交不只是用户手抖","网络重试、消息重投、用户连点，都会让同一个请求到达多次。幂等应该设计在接口里。","2026-10-05T10:13:00+08:00",[96,97,98],"接口设计","幂等","可靠性",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20}]