[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XBPA32F4KAECRFDT3BT9XV":3,"skill-same:01M6XBPA32F4KAECRFDT3BT9XV":59},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":13,"repositoryHtmlUrl":36,"repositoryHomepageUrl":6,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":38,"install":39,"resources":52},"01M6XBPA32F4KAECRFDT3BT9XV","openpyxl-merged-cell-safe-write",null,"Safe pattern for writing values to merged cells in openpyxl spreadsheets","UF-gzj\u002Fopenspace-claude-evolution","UF-gzj","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F272393507?v=4","01M6XBCZB755P01VVYGQWPYZY3","01M6XBCZFJA5AREA17WGETA3FW",0,"MIT","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fopenpyxl-merged-cell-safe-write\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27],"safe","write","cell","openpyxl","openpyxl merged cell safe write","writing","spreadsheets","pattern","values","for","2026-11-10 10:12:30",false,"---\nname: openpyxl-merged-cell-safe-write\ndescription: Safe pattern for writing values to merged cells in openpyxl spreadsheets\n---\n\n# OpenPyXL Merged Cell Safe Write Pattern\n\n## Problem\n\nWhen creating formatted spreadsheets with openpyxl, merging cells and then assigning values to them causes `MergedCell` errors. This is a common pitfall that can consume multiple failed iterations.\n\n## Core Rule\n\n**Always assign values to the top-left cell of a merge range BEFORE applying the merge**, or avoid assigning to merged cells entirely after the merge is applied.\n\n## Correct Pattern\n\n```python\nfrom openpyxl import Workbook\n\nwb = Workbook()\nws = wb.active\n\n# CORRECT: Set value first, then merge\nws['A1'] = 'Quarterly Revenue Report'  # Assign to top-left cell first\nws.merge_cells('A1:D1')                # Then apply merge\n\n# Also set formatting after merge\nws['A1'].font = Font(bold=True, size=16)\nws['A1'].alignment = Alignment(horizontal='center')\n```\n\n## Incorrect Pattern (Causes MergedCell Error)\n\n```python\n# WRONG: Merge first, then assign value\nws.merge_cells('A1:D1')\nws['A1'] = 'Quarterly Revenue Report'  # This raises MergedCell error!\n```\n\n## Step-by-Step Procedure\n\n1. **Identify merge ranges** you need for headers, titles, or grouped data\n2. **Write values to the top-left cell** of each range before merging\n3. **Apply the merge** using `ws.merge_cells()`\n4. **Apply formatting** (font, alignment, borders) to the top-left cell\n5. **Verify** by checking that only the top-left cell holds the value\n\n## Additional Guidelines\n\n### For Multiple Merged Regions\n\n```python\n# Define all merges with their values\nmerges = [\n    ('A1', 'D1', 'Quarterly Revenue Report'),\n    ('A3', 'B3', 'Product'),\n    ('C3', 'D3', 'Sales Data'),\n]\n\nfor start_col, end_col, value in merges:\n    cell_ref = f'{start_col}'  # Top-left cell\n    ws[cell_ref] = value       # Set value first\n    ws.merge_cells(f'{start_col}:{end_col}')  # Then merge\n```\n\n### When Modifying Existing Merged Cells\n\nIf you need to update a value in an already-merged range:\n\n```python\n# Get the top-left cell of the merged range\ntop_left = 'A1'  # Know your merge structure\nws[top_left] = 'New Value'  # Only modify the top-left cell\n```\n\n### Checking for Merged Cells\n\n```python\n# Check if a cell is within a merged range\ndef is_cell_merged(ws, cell_ref):\n    for merged_range in ws.merged_cells.ranges:\n        if cell_ref in merged_range:\n            return True\n    return False\n\n# Or check before writing\nif not is_cell_merged(ws, 'A1'):\n    ws['A1'] = 'Value'\n    ws.merge_cells('A1:D1')\n```\n\n## Common Use Cases\n\n| Use Case | Pattern |\n|----------|---------|\n| Title headers | Write to A1, then merge A1:D1 |\n| Section headers | Write to first cell, then merge across columns |\n| Grouped labels | Write to top-left, merge the group range |\n| Centered content | Write, merge, then apply center alignment |\n\n## Quick Reference\n\n```python\n# ✅ DO: Value → Merge → Format\nws['A1'] = 'Title'\nws.merge_cells('A1:E1')\nws['A1'].alignment = Alignment(horizontal='center')\n\n# ❌ DON'T: Merge → Value\nws.merge_cells('A1:E1')\nws['A1'] = 'Title'  # Error!\n```\n\n## Testing Your Spreadsheet\n\nAfter creation, verify merged cells work correctly:\n\n```python\n# Save and reload to confirm no errors\nwb.save('test.xlsx')\n\n# Reload and check\nwb2 = load_workbook('test.xlsx')\nws2 = wb2.active\nprint(ws2['A1'].value)  # Should show the title value\n```","# OpenPyXL Merged Cell Safe Write Pattern\n\n## Problem\n\nWhen creating formatted spreadsheets with openpyxl, merging cells and then assigning values to them causes `MergedCell` errors. This is a common pitfall that can consume multiple failed iterations.\n\n## Core Rule\n\n**Always assign values to the top-left cell of a merge range BEFORE applying the merge**, or avoid assigning to merged cells entirely after the merge is applied.\n\n## Correct Pattern\n\n```python\nfrom openpyxl import Workbook\n\nwb = Workbook()\nws = wb.active\n\n# CORRECT: Set value first, then merge\nws['A1'] = 'Quarterly Revenue Report'  # Assign to top-left cell first\nws.merge_cells('A1:D1')                # Then apply merge\n\n# Also set formatting after merge\nws['A1'].font = Font(bold=True, size=16)\nws['A1'].alignment = Alignment(horizontal='center')\n```\n\n## Incorrect Pattern (Causes MergedCell Error)\n\n```python\n# WRONG: Merge first, then assign value\nws.merge_cells('A1:D1')\nws['A1'] = 'Quarterly Revenue Report'  # This raises MergedCell error!\n```\n\n## Step-by-Step Procedure\n\n1. **Identify merge ranges** you need for headers, titles, or grouped data\n2. **Write values to the top-left cell** of each range before merging\n3. **Apply the merge** using `ws.merge_cells()`\n4. **Apply formatting** (font, alignment, borders) to the top-left cell\n5. **Verify** by checking that only the top-left cell holds the value\n\n## Additional Guidelines\n\n### For Multiple Merged Regions\n\n```python\n# Define all merges with their values\nmerges = [\n    ('A1', 'D1', 'Quarterly Revenue Report'),\n    ('A3', 'B3', 'Product'),\n    ('C3', 'D3', 'Sales Data'),\n]\n\nfor start_col, end_col, value in merges:\n    cell_ref = f'{start_col}'  # Top-left cell\n    ws[cell_ref] = value       # Set value first\n    ws.merge_cells(f'{start_col}:{end_col}')  # Then merge\n```\n\n### When Modifying Existing Merged Cells\n\nIf you need to update a value in an already-merged range:\n\n```python\n# Get the top-left cell of the merged range\ntop_left = 'A1'  # Know your merge structure\nws[top_left] = 'New Value'  # Only modify the top-left cell\n```\n\n### Checking for Merged Cells\n\n```python\n# Check if a cell is within a merged range\ndef is_cell_merged(ws, cell_ref):\n    for merged_range in ws.merged_cells.ranges:\n        if cell_ref in merged_range:\n            return True\n    return False\n\n# Or check before writing\nif not is_cell_merged(ws, 'A1'):\n    ws['A1'] = 'Value'\n    ws.merge_cells('A1:D1')\n```\n\n## Common Use Cases\n\n| Use Case | Pattern |\n|----------|---------|\n| Title headers | Write to A1, then merge A1:D1 |\n| Section headers | Write to first cell, then merge across columns |\n| Grouped labels | Write to top-left, merge the group range |\n| Centered content | Write, merge, then apply center alignment |\n\n## Quick Reference\n\n```python\n# ✅ DO: Value → Merge → Format\nws['A1'] = 'Title'\nws.merge_cells('A1:E1')\nws['A1'].alignment = Alignment(horizontal='center')\n\n# ❌ DON'T: Merge → Value\nws.merge_cells('A1:E1')\nws['A1'] = 'Title'  # Error!\n```\n\n## Testing Your Spreadsheet\n\nAfter creation, verify merged cells work correctly:\n\n```python\n# Save and reload to confirm no errors\nwb.save('test.xlsx')\n\n# Reload and check\nwb2 = load_workbook('test.xlsx')\nws2 = wb2.active\nprint(ws2['A1'].value)  # Should show the title value\n```",{"name":5,"description":7},"main","0650921d63895de3997bc81f1ff1d0ac67032072","gdpval_bench\u002Fskills\u002Fopenpyxl-merged-cell-safe-write","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution","https:\u002F\u002Fgithub.com\u002FUF-gzj","2026-04-16 09:31:03",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add UF-gzj\u002Fopenspace-claude-evolution --skill openpyxl-merged-cell-safe-write",{"tool":45,"command":46},"bunx","bunx skills add UF-gzj\u002Fopenspace-claude-evolution --skill openpyxl-merged-cell-safe-write",{"tool":48,"command":49},"pnpm","pnpm dlx skills add UF-gzj\u002Fopenspace-claude-evolution --skill openpyxl-merged-cell-safe-write","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fopenpyxl-merged-cell-safe-write\u002FSKILL.md",true,[53],{"path":54,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":57,"sourceHtmlUrl":58},".skill_id","OTHER","其他",45,"https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fopenpyxl-merged-cell-safe-write\u002F.skill_id",[60,83,100,109,139,155],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":28},"01M6XCCXD3NCM2YKR3WNGBASPC","write-special-chars-ts-check","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, plus a reliable TypeScript type-checking step that filters output to only the newly-written files to avoid being misled by pre-existing errors.","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[67,19,68,69,70,71,72,73,27,74,75,76,77,78,79,80,81,82],"check","write special chars ts check","typescript","filters","characters","Existing","type-checking","errors","script","output","type","files","only","template","file","python",{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":28},"01M6XCCT7E3J922Q345PBGSHPN","write-special-chars-readback","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, with mandatory post-write verification via read_file and cleanup of \u002Ftmp helper scripts.","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[90,91,19,81,92,82,93,94,95,96,97,80,98,99,71,27,75],"readback","write special chars readback","helper","post","via","scripts","cleanup","read","verification","with",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":28},"01M6XCCMQX1R8B6FECWB3P63T7","write-special-chars-heredoc","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) by using a Python heredoc script executed via shell.","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-heredoc\u002FSKILL.md",[],[107,19,71,108,75,94,80,81,82,27],"write special chars heredoc","shell",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":120,"publishedAt":28},"01M6XCCG41M994JJEX6VN52PEP","worldmonitor-reference","Curated architecture index of the WorldMonitor open-source dashboard. Reference for extracting patterns — vanilla TypeScript, Panel class hierarchy, service layer, CSS grid, API edge functions, refresh scheduler, and 60+ data source integrations.","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fworldmonitor-reference\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[121,122,123,124,125,69,126,127,128,129,130,27,131,132,133,134,135,136,137,138],"reference","worldmonitor","worldmonitor reference","architecture","dashboard","css","scheduler","layer","hierarchy","source","extracting","panel","patterns","edge functions","integrations","open","api","data",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":28},"01M6XCCCHWNKG2W4VH9E6A10HF","virtual-list","Implement efficient virtual scrolling for rendering large lists with DOM recycling, chunk-based rendering, and performance optimizations","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fvirtual-list\u002FSKILL.md",[],[146,147,148,149,27,150,99,151,152,153,154],"virtual list","list","virtual","chunk","dom","rendering","recycling","implement","performance",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":28},"01M6XCC7X8PKMR2DEW91XGHYSV","verify-directory-structure","Diagnose and resolve file access issues by first verifying the directory structure.","https:\u002F\u002Fgithub.com\u002FUF-gzj\u002Fopenspace-claude-evolution\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fverify-directory-structure\u002FSKILL.md",[],[162,163,164,165,166,167,81,168,169,170],"directory","verify directory structure","structure","verify","access","first","issues","diagnose","file access"]