[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EEYVFZ72SYRHCSKJ4B4E9J":3,"skill-same:01M6EEYVFZ72SYRHCSKJ4B4E9J":61},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EEYVFZ72SYRHCSKJ4B4E9J","exceljs",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fexceljs\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# ExcelJS\n\nRead and write Excel files in Node.js. Full support for styles, formulas, images, and streaming.\n\n## Setup\n\n```bash\n# Install ExcelJS for spreadsheet generation and parsing.\nnpm install exceljs\n```\n\n## Creating a Workbook\n\n```typescript\n\u002F\u002F src\u002Fexcel\u002Fcreate.ts — Create an Excel workbook with a styled header row and data.\nimport ExcelJS from \"exceljs\";\n\nconst workbook = new ExcelJS.Workbook();\nworkbook.creator = \"Report System\";\nworkbook.created = new Date();\n\nconst sheet = workbook.addWorksheet(\"Sales Data\", {\n  properties: { tabColor: { argb: \"FF3498DB\" } },\n});\n\n\u002F\u002F Define columns\nsheet.columns = [\n  { header: \"Product\", key: \"product\", width: 25 },\n  { header: \"Revenue\", key: \"revenue\", width: 15 },\n  { header: \"Units Sold\", key: \"units\", width: 12 },\n  { header: \"Growth\", key: \"growth\", width: 12 },\n];\n\n\u002F\u002F Style header row\nsheet.getRow(1).font = { bold: true, color: { argb: \"FFFFFFFF\" } };\nsheet.getRow(1).fill = {\n  type: \"pattern\",\n  pattern: \"solid\",\n  fgColor: { argb: \"FF3498DB\" },\n};\n\n\u002F\u002F Add data\nconst data = [\n  { product: \"Widget Pro\", revenue: 45000, units: 1200, growth: 0.12 },\n  { product: \"Gadget Plus\", revenue: 32000, units: 800, growth: 0.08 },\n  { product: \"Tool Basic\", revenue: 18000, units: 2400, growth: -0.03 },\n];\n\ndata.forEach((row) => sheet.addRow(row));\n\n\u002F\u002F Format numbers\nsheet.getColumn(\"revenue\").numFmt = \"$#,##0\";\nsheet.getColumn(\"growth\").numFmt = \"0.0%\";\n\nawait workbook.xlsx.writeFile(\"sales-report.xlsx\");\n```\n\n## Formulas\n\n```typescript\n\u002F\u002F src\u002Fexcel\u002Fformulas.ts — Add formulas for totals, averages, and derived values.\nimport ExcelJS from \"exceljs\";\n\nconst workbook = new ExcelJS.Workbook();\nconst sheet = workbook.addWorksheet(\"Financials\");\n\nsheet.columns = [\n  { header: \"Item\", key: \"item\", width: 20 },\n  { header: \"Q1\", key: \"q1\", width: 12 },\n  { header: \"Q2\", key: \"q2\", width: 12 },\n  { header: \"Total\", key: \"total\", width: 12 },\n];\n\nsheet.addRow({ item: \"Revenue\", q1: 100000, q2: 120000 });\nsheet.addRow({ item: \"Expenses\", q1: 80000, q2: 85000 });\nsheet.addRow({ item: \"Profit\" });\n\n\u002F\u002F Formula references\nsheet.getCell(\"D2\").value = { formula: \"B2+C2\" } as any;\nsheet.getCell(\"D3\").value = { formula: \"B3+C3\" } as any;\nsheet.getCell(\"B4\").value = { formula: \"B2-B3\" } as any;\nsheet.getCell(\"C4\").value = { formula: \"C2-C3\" } as any;\nsheet.getCell(\"D4\").value = { formula: \"D2-D3\" } as any;\n\nawait workbook.xlsx.writeFile(\"financials.xlsx\");\n```\n\n## Conditional Formatting\n\n```typescript\n\u002F\u002F src\u002Fexcel\u002Fconditional.ts — Highlight cells based on value thresholds.\nimport ExcelJS from \"exceljs\";\n\nconst workbook = new ExcelJS.Workbook();\nconst sheet = workbook.addWorksheet(\"KPIs\");\n\nsheet.columns = [\n  { header: \"Metric\", key: \"metric\", width: 20 },\n  { header: \"Value\", key: \"value\", width: 15 },\n];\n\nsheet.addRows([\n  { metric: \"Uptime\", value: 99.9 },\n  { metric: \"Error Rate\", value: 2.3 },\n  { metric: \"Response Time (ms)\", value: 450 },\n]);\n\n\u002F\u002F Green for values above target, red for below\nsheet.addConditionalFormatting({\n  ref: \"B2:B4\",\n  rules: [\n    {\n      type: \"cellIs\",\n      operator: \"greaterThan\",\n      formulae: [95],\n      style: { fill: { type: \"pattern\", pattern: \"solid\", bgColor: { argb: \"FF27AE60\" } } },\n      priority: 1,\n    },\n  ],\n});\n\nawait workbook.xlsx.writeFile(\"kpis.xlsx\");\n```\n\n## Reading Excel Files\n\n```typescript\n\u002F\u002F src\u002Fexcel\u002Fread.ts — Parse an uploaded Excel file and extract data as objects.\nimport ExcelJS from \"exceljs\";\n\nexport async function parseExcel(filePath: string) {\n  const workbook = new ExcelJS.Workbook();\n  await workbook.xlsx.readFile(filePath);\n\n  const sheet = workbook.getWorksheet(1)!;\n  const headers: string[] = [];\n  const rows: Record\u003Cstring, any>[] = [];\n\n  sheet.eachRow((row, rowNumber) => {\n    if (rowNumber === 1) {\n      row.eachCell((cell) => headers.push(String(cell.value)));\n    } else {\n      const obj: Record\u003Cstring, any> = {};\n      row.eachCell((cell, colNumber) => {\n        obj[headers[colNumber - 1]] = cell.value;\n      });\n      rows.push(obj);\n    }\n  });\n\n  return rows;\n}\n```\n\n## Streaming Large Files\n\n```typescript\n\u002F\u002F src\u002Fexcel\u002Fstream.ts — Write large datasets without holding everything in memory.\n\u002F\u002F Uses ExcelJS streaming writer for millions of rows.\nimport ExcelJS from \"exceljs\";\nimport fs from \"fs\";\n\nexport async function streamLargeExport(data: AsyncIterable\u003Cany[]>, outputPath: string) {\n  const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({\n    stream: fs.createWriteStream(outputPath),\n    useStyles: true,\n  });\n\n  const sheet = workbook.addWorksheet(\"Data\");\n  sheet.columns = [\n    { header: \"ID\", key: \"id\", width: 10 },\n    { header: \"Name\", key: \"name\", width: 30 },\n    { header: \"Value\", key: \"value\", width: 15 },\n  ];\n\n  for await (const batch of data) {\n    for (const row of batch) {\n      sheet.addRow(row).commit();\n    }\n  }\n\n  sheet.commit();\n  await workbook.commit();\n}\n```\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fexceljs",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill exceljs",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill exceljs",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill exceljs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fexceljs\u002FSKILL.md",true,[45,51,57],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"checklist.md","REFERENCE","参考文档",1298,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fgds-sprint-planning\u002Fchecklist.md",{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"customize.toml","OTHER","其他",1637,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fgds-sprint-planning\u002Fcustomize.toml",{"path":58,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":59,"sourceHtmlUrl":60},"sprint-status-template.yaml",1750,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fgds-sprint-planning\u002Fsprint-status-template.yaml",[62,76,86,95,101,108],{"skillNo":63,"name":64,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":72,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[67],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[73,74,75],"model","model hierarchy","model hierarchy skill",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":82,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[81],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},[83,84,85],"MCP","zoom","zoom mcp",{"skillNo":87,"name":88,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[92,93,94,84],"sdk","zoom apps sdk","apps",{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[97],{"skillNo":102,"name":103,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":107,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[106],{"categoryNo":68,"categoryName":69,"taxonomyType":70,"taxonomyTypeDesc":71},[103],{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[110]]