JS/TS电子表格引擎:SheetJS、ExcelJS、Hucre
SheetJS英文官网中文官网开源GitHub36.4K Star7.9K Fork。GitHub已不再维护查看源码新地址https://git.sheetjs.com/SheetJS/sheetjs中文文档。ExcelJS开源GitHub15.5K Star2.1K Fork。Hucre零依赖的 TypeScript 电子表格引擎支持读写多种电子表格格式。特点零依赖没有任何第三方依赖多格式支持XLSX、CSV、ODS、JSON、NDJSON、XML旧格式支持支持读取 XLSExcel 97-2003和 XLSB二进制格式纯 TypeScript原生 TypeScript 编写类型安全Tree Shaking按需导入减小打包体积流式处理支持大文件的流式读写跨平台Node.js、Deno、Bun、浏览器、Edge Runtime安全不使用 eval符合 CSP 要求对比特性hucreSheetJSCEExcelJSxlsx-js-style依赖数量00*90*包体积gzip4-129KB†~300KB~500KB~300KB原生ESM✅部分❌CJS部分TypeScript原生后加后加后加EdgeRuntime✅❌❌❌CSP兼容✅✅❌eval✅npm发布✅❌仅CDN停滞✅读写支持✅✅付费版$✅✅样式✅❌付费版$✅✅条件格式13种❌付费版$✅❌流式读写✅仅CSV✅仅CSVODS支持✅§✅❌✅往返保留✅部分部分部分迷你图✅❌❌❌解读SheetJS 已从 npm 下架必须从 CDN 安装取决于导入内容完全可 Tree ShakeODS 支持值、公式、合并和六种样式属性特性hucre(TS)openpyxl(Py)XlsxWriter(Py)rust_xlsxwriterApachePOI(Java)读取XLSX✅✅❌❌✅写入XLSX✅✅✅✅✅流式处理读写读写const_memoryconst_memorySXSSF写图表往返保留15种9种12种有限数据透视表读写骨架只读❌❌有限条件格式13种✅✅✅✅迷你图✅✅✅✅❌公式计算❌❌❌❌✅多格式XLSX/ODS/CSV仅XLSX仅XLSX仅XLSXXLS/XLSX零依赖✅lxml可选❌✅❌实战基于npm安装npm install hucre入门示例import{readXlsx,writeXlsx}fromhucre// 读取 XLSX 文件constworkbookawaitreadXlsx(buffer)console.log(workbook.sheets[0].rows)// 写入 XLSX 文件constxlsxawaitwriteXlsx({sheets:[{name:Products,columns:[{header:Name,key:name,width:25},{header:Price,key:price,width:12,numFmt:$#,##0.00},{header:Stock,key:stock,width:10},],data:[{name:Widget,price:9.99,stock:142},{name:Gadget,price:24.5,stock:87},],},],})Tree Shaking按需导入// 只使用XLSXimport{readXlsx,writeXlsx}fromhucre/xlsx// 只使用 CSV仅 ~2 KB gzippedimport{parseCsv,writeCsv}fromhucre/csv// 只使用ODSimport{readOds,writeOds}fromhucre/ods// 只使用JSON/NDJSONimport{parseJson,writeNdjson}fromhucre/json// 只使用XMLimport{readXml,writeXml}fromhucre/xml导入内容Gzipped体积CSV读写~3.7KBXLSX读取~34KBXLSX读写~68KB完整库~129KB支持多种数据类型import{readXlsx}fromhucre/xlsxconstwbawaitreadXlsx(uint8Array,{sheets:[0,Products],// 按索引或名称过滤工作表readStyles:true,// 解析单元格样式dateSystem:auto,// 自动检测日期系统1900/1904})for(constsheetofwb.sheets){console.log(sheet.name)// 工作表名称console.log(sheet.rows)// CellValue[][]console.log(sheet.merges)// MergeRange[]}基本写入import{writeXlsx}fromhucre/xlsxconstbufferawaitwriteXlsx({sheets:[{name:Report,columns:[{header:Date,key:date,width:15,numFmt:yyyy-mm-dd},{header:Revenue,key:revenue,width:15,numFmt:$#,##0.00},{header:Active,key:active,width:10},],data:[{date:newDate(2026-01-15),revenue:12500,active:true},{date:newDate(2026-01-16),revenue:8900,active:false},],freezePane:{rows:1},autoFilter:{range:A1:C3},},],defaultFont:{name:Calibri,size:11},})单元格级样式awaitwriteXlsx({sheets:[{name:Report,rows:[[{value:Region,style:{font:{bold:true}}},Revenue],[EU,{value:12500,style:{numFmt:$#,##0.00}}],[Total,{formula:SUM(B2:B2)}],],},],})根据内容自动计算最优列宽constbufferawaitwriteXlsx({sheets:[{name:Products,columns:[{header:Name,key:name,autoWidth:true},{header:Price,key:price,autoWidth:true,numFmt:$#,##0.00},{header:SKU,key:sku,autoWidth:true},],data:products,},],})数据验证constbufferawaitwriteXlsx({sheets:[{name:Sheet1,rows:[[Status,Quantity],[active,10],],dataValidations:[{type:list,values:[active,inactive,draft],range:A2:A100,showErrorMessage:true,errorTitle:Invalid,errorMessage:Pick from the list,},{type:whole,operator:between,formula1:0,formula2:1000,range:B2:B100,},],},],})超链接import{writeXlsx,link}fromhucre/xlsxawaitwriteXlsx({sheets:[{name:Summary,columns:[{header:Link,key:link},{header:ID,key:id},],data:[{link:link(Open,https://example.com/items/abc-123),id:abc-123},{link:{text:Open,hyperlink:https://example.com/items/def-456},id:def-456},],},],})提供了完整的流式 API可以处理超大文件而不占用过多内存。import{streamXlsxRows}fromhucre/xlsx// 逐行读取不一次性加载整个文件forawait(constrowofstreamXlsxRows(buffer)){console.log(row.index,row.values)}// 从网络流读取constresawaitfetch(https://example.com/huge.xlsx)forawait(constrowofstreamXlsxRows(res.body!)){console.log(row.index,row.values)}// 限制读取行数预览/采样forawait(constrowofstreamXlsxRows(buffer,{maxRows:100})){console.log(row.index,row.values)}// 读取指定范围forawait(constrowofstreamXlsxRows(buffer,{range:B2:D1000})){console.log(row.values)// 只包含 B/C/D 列}流式写入import{writeXlsxStream}fromhucre/xlsx// 生成器函数提供数据源function*rows(){for(leti0;i5_000_000;i)yield[i1,Math.random()]}// 流式写入内存占用恒定returnnewResponse(writeXlsxStream(rows(),{name:BigData,columns:[{header:ID},{header:Value}],freezePane:{rows:1},},),{headers:{content-type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,},},)行数writeXlsxStream内存XlsxStreamWriter内存300,00041 MB328 MB1,000,00067 MB1,037 MB3,000,00070 MB不可行支持读写加密的 XLSX 文件ECMA-376 Agile 加密import{writeXlsx,readXlsx,EncryptedFileError,DecryptionError}fromhucre// 写入加密文件constencryptedawaitwriteXlsx({sheets:[{name:Secret,rows:[[pin,1234]]}],encryption:{password:hunter2},})// 读取加密文件constwbawaitreadXlsx(encrypted,{password:hunter2})// 错误处理try{awaitreadXlsx(encrypted)}catch(e){if(einstanceofEncryptedFileError)console.log(需要密码)}XLSB二进制 Excel读取.xlsb文件比.xlsx更小更快import{readXlsb}fromhucreconstwbawaitreadXlsb(bytes)XLSExcel 97-2003读取传统的.xls文件import{readXls}fromhucreconstwbawaitreadXls(bytes)旧格式仅支持读取支持单元格值和合并单元格。往返保留Round-trip Preservation。打开、修改、保存文件而不丢失图表、宏等 hucre 不原生处理的功能import{openXlsx,saveXlsx}fromhucre/xlsxconstworkbookawaitopenXlsx(buffer)workbook.sheets[0].rows[0][0]Updated!constoutputawaitsaveXlsx(workbook)// 图表、VBA、主题都被保留区别readXlsx/writeXlsx创作路径从模型重建工作簿openXlsx/saveXlsx编辑路径保留 hucre 不建模的部分数据透视表import{writeXlsx}fromhucreconstxlsxawaitwriteXlsx({sheets:[{name:Data,rows:[[Region,Product,Revenue],[EU,A,100],[EU,B,50],[US,A,200],[US,B,75],],},{name:Pivot,pivotTables:[{name:SalesPivot,sourceSheet:Data,rows:[Region],columns:[Product],values:[{field:Revenue,function:sum}],},],},],})图表import{addChart,writeXlsx}fromhucreconstdashboard{name:Dashboard,rows:[[Quarter,Revenue,Forecast],[Q1,12000,11500],[Q2,15500,15000],[Q3,14000,14500],[Q4,17800,17200],],}addChart(dashboard,{type:column,title:Quarterly Revenue,series:[{name:Revenue,values:B2:B5,categories:A2:A5,color:1F77B4},{name:Forecast,values:C2:C5,categories:A2:A5,color:FF7F0E},],axes:{x:{title:Quarter},y:{title:Revenue (USD),numberFormat:{formatCode:$#,##0}},},legend:bottom,dataLabels:{showValue:true,position:outEnd},})awaitwriteXlsx({sheets:[dashboard]})

相关新闻

研究数据从采集到存档:把八个环节衔接起来的数据管理方法

研究数据从采集到存档:把八个环节衔接起来的数据管理方法

数据管理出问题,很少是因为某个环节做得差,而是因为环节之间没有对齐。采集时随手写的字段名,到整理阶段对不上号;分析脚本当时跑通了,半年后复现不出同一张图;等到归档,才发现原始记录里缺了那…

2026/10/3 13:56:11 阅读更多 →
Android 布局:实现 Title + Tag 横向布局效果。Title 标题末尾跟随 Tag 标签。当标题长度超过横向可用空间时,则 Tag 固定在屏幕右侧。

Android 布局:实现 Title + Tag 横向布局效果。Title 标题末尾跟随 Tag 标签。当标题长度超过横向可用空间时,则 Tag 固定在屏幕右侧。

一、需求:需求目标如标题所属。想要实现的效果图如下:1、当 Title 标题的长度较短时,则右侧的 Tag 标签跟随在 TItle 标题的末尾。2、当 Title 标题的长度大于横向可用空间时,超出部分以 ... 显示。右侧的 Tag 标签固定在屏幕右侧…

2026/10/3 13:55:11 阅读更多 →
LM25143RHAR的外围电路设计

LM25143RHAR的外围电路设计

创作背景:我在为项目设计电源板。系统整体由 12V 供电,需要同时为多个子系统提供稳定的能量:一路 5V 需要持续输出 5A,用于驱动 DRV8874 电机驱动芯片;另一路需要约 7.4V(7V~9V区间)&#xff0c…

2026/10/3 13:55:11 阅读更多 →

最新新闻

2027届数学与应用数学秋招:商业化运营收入指标的拆解逻辑与分析路径

2027届数学与应用数学秋招:商业化运营收入指标的拆解逻辑与分析路径

先给判断:数学与应用数学专业做商业化运营,理解收入指标的核心不是会算数,而是能回答一个业务问题——钱从哪里来、为什么是这个数、下一步让这个数变大。2026年秋招中,字节跳动广告行业运营岗位把对数据有敏感度、善于从数据结论…

2026/10/3 14:30:53 阅读更多 →
OpenShell 深度定制指南:从开始菜单到任务栏的效率重构

OpenShell 深度定制指南:从开始菜单到任务栏的效率重构

1. 从一个空输入框说起:OpenShell 到底在解决什么问题 第一次看到 "OpenShell" 这个词,是在一个终端工具讨论帖里。有人丢出一句"OpenShell 比默认 shell 好用太多",底下跟了几十条回复,但真正把"它是什…

2026/10/3 14:30:53 阅读更多 →
Hindsight记忆架构实战:MCP与Docker部署Agent长期记忆

Hindsight记忆架构实战:MCP与Docker部署Agent长期记忆

1. 从“hindsight”这个词说起:为什么它值得单独拿出来聊“hindsight”直译过来是“后见之明”,但在技术语境里,它指向一个非常具体的东西:让智能体在任务执行完之后,回头审视自己走过的路,把当时的判断、踩…

2026/10/3 14:30:53 阅读更多 →
FOC电流采样方案对比与NXP实战:单/双/三电阻选型指南

FOC电流采样方案对比与NXP实战:单/双/三电阻选型指南

做FOC(磁场定向控制)这几年,我最深的体会是:算法再花哨,电流采样如果拉胯,整个系统性能就全废了。很多刚入门的同学调PMSM无感FOC,启动抖动、高速发飘、带载跑不动,折腾半天发现不是…

2026/10/3 14:30:53 阅读更多 →
AI Infra零基础学习路线:从分布式训练到推理优化

AI Infra零基础学习路线:从分布式训练到推理优化

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

2026/10/3 14:30:53 阅读更多 →
智能体长期记忆实战:从hindsight事后复盘到MCP与Docker落地

智能体长期记忆实战:从hindsight事后复盘到MCP与Docker落地

1. 从"hindsight"这个词说起:为什么它值得单独拿出来聊 第一次看到"hindsight"作为项目名,我脑子里蹦出来的不是技术,而是一句老话——事后诸葛亮。但恰恰是这个"事后"的视角,在当下的智能体&#…

2026/10/3 14:29:53 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →