周报

SKILL研究检索
研究检索 未标注权限 许可证不明确
安装这个技能

This skill should be used when building a single-file, offline HTML website/report from an Excel (.xlsx) table — especially recurring reports where the user uploads a new file each period (e.g. weekly bank-flow / 周报 queries). Covers: reading xlsx with pandas (header on row 2 → header=1), normalizing rows, embedding normalized data as `const DATA = {...}` in a `<script>` tag with `</script>` escaping, inlining SheetJS for browser-side upload parsing, IndexedDB (localStorage fallback) for per-key / per-period storage, user-defined custom categories, clean amount display with click-to-copy, a scrollable searchable dropdown (replacing <datalist>), and a layered classification pipeline (autoCat → expand internal transfers, then explicit RPA classification, then dictReClassify via keyword rules). Also covers HTTPS publishing via the sites skill and the python-venv gotcha on this machine.

一句话选型结论

按资料字段整理

周报是研究检索类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类研究检索 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_82733122/xlsx-to-offline-html-report
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

研究检索
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_82733122仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791660220
正文体量9.7 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
查资料并整理出处

让模型按主题查资料,并把引用来源整理成清单。

网页与文献要点提炼

把长文、论文、网页压成能直接看的要点。

竞品与行业汇总

按关键词汇总竞品动态与行业信息。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在研究检索场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
周报当前 未标注权限 未标注 未标注 未标注 有
寻找技能 浏览器控制 GitHub 仓库 3120.0 万 Codex、Claude、Cursor 有
自我改进 Agent 接触敏感数据 ClawHub 市场 1646.4 万 OpenClaw 有
灵魂追踪 联网访问 GitHub 仓库 758.9 万 Codex、Claude、Cursor 有
自我完善 联网访问 ClawHub 市场 682.9 万 OpenClaw 有
微软代工厂 调用外部服务 GitHub 仓库 661.4 万 Codex、Claude、Cursor 有

SKILL.md 全文

9.7 KB
模型实际读到的说明书原文,来自技能仓库

xlsx-to-offline-html-report

Build a self-contained, offline-capable HTML report from an Excel sheet. The output is a single
.html file the user double-clicks to open — no server, no internet. Data is embedded inline so
the first load works offline; newly uploaded files are parsed in the browser (SheetJS) and stored
locally (IndexedDB) so each period stacks up and can be switched.

When to use

  • User wants a website/report generated from an .xlsx (bank flows, ledgers, weekly queries,
    inventory, any tabular dump).
  • Recurring cadence: "我每周都会有新的表" / "每个月上传一次" → needs upload + per-period storage.
  • User wants classification/grouping beyond raw rows (e.g. 工程款/管理费/税金 bucketing, expand
    vague "内部往来" into concrete counterparties).
  • Deliverable must open offline by double-click (single file, everything inlined).

Workflow

1. Read & normalize the source xlsx (Python/pandas)

  • Python gotcha (this machine): the managed python 3.13 has no pandas. Use the venv:
    C:\Users\刘甜\.workbuddy\binaries\python\envs\default\Scripts\python.exe (has pandas 3.0.5).
  • Chinese bank-export tables often put the header on row 2, so read with pd.read_excel(SRC, header=1).
  • Normalize each row to a flat dict with stable keys (idx, d date, dir 收/支, amt float,
    pa/pn payer-account/name, ra/rn receiver-account/name, sum, rem, rf RPA流水分类,
    rl RPA往来分类, bp/op 本方/对方). Coerce amounts with float(re.sub(r&#x27;[,\s]&#x27;,&#x27;&#x27;,s)).
  • Build accounts (sorted unique account numbers) and accName (account → name, first seen wins).
  • Emit a DATA dict: {id, name, file, ts, builtin:true, records, accounts, accName, cat:{}}.

2. Embed data safely

  • json.dumps(DATA, ensure_ascii=False) then .replace(&#x27;&lt;/script&gt;&#x27;,&#x27;&lt;\\/script&gt;&#x27;) (twice for
    case variants) before injecting into the template's &lt;script&gt;const DATA = __DATA__;&lt;/script&gt;.
    This prevents a &lt;/script&gt; inside data from terminating the block.
  • Prefer const DATA = {...} over &lt;script type=&quot;application/json&quot;&gt; — easier to reach from JS and
    the escaping above makes it safe.

3. Inline SheetJS for browser-side upload

  • Download once: curl -L https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js -o xlsx.full.min.js.
  • Inline it into a &lt;script&gt;__XLSX_LIB__&lt;/script&gt; block, first escaping &lt;/script → &lt;\/script.
  • In the app: XLSX.read(new Uint8Array(buf),{type:&#x27;array&#x27;}) then
    XLSX.utils.sheet_to_json(sheet,{header:1,defval:&#x27;&#x27;}).

4. Robust upload parser (parseSheet)

  • Find the header row by matching ≥3 known columns (交易日期/付款账号/收款账号/交易方向/摘要/...).
  • Map columns by a candidate list (e.g. [&#x27;付款账号&#x27;,&#x27;付款账户&#x27;] → first hit), with includes()
    fallback so column-name variants in future files still map.
  • Skip rows with neither payer nor receiver account. Coerce Excel dates (number 20000–60000) and
    serial amounts. Produce the same DATA-shape object with builtin:false and cat:{}.

5. Per-period storage (IndexedDB + localStorage fallback)

  • openDB() opens indexedDB (store weeks, keyPath:&#x27;id&#x27;). If indexedDB absent, fall back
    to a localStorage JSON array.
  • putWeek(w) / getWeeks() / delWeek(id) wrap the store with .transaction.
  • On init: load stored weeks; for the builtin week, ALWAYS use the freshly embedded BUILTIN
    (so regenerated data is current) but merge in the stored cat map (per-record idx) so the
    user's manual edits persist. Uploaded weeks are not embedded — only in IndexedDB.
  • Top bar: a week &lt;select&gt; to switch, an upload button, and a delete button (disable delete for
    the builtin week).

6. Layered classification (autoCat → dictReClassify)

Order matters — evaluate top-down, return on first hit:

  1. Expand internal transfers when RPA往来分类 ∈ {省内调入, 总部调入, 省内调出, 归集总部}:
    produce 省内调入|来自 {对方户名}({对方账号}) etc. Never emit a bare "内部往来" — the
    user rejects vague labels; always name the concrete counterparty.
  2. Use explicit RPA classification if RPA流水分类 is set and not 未匹配/empty.
  3. Dictionary re-classify (dictReClassify) for the rest, via keyword rules over
    摘要 + 备注 + 付款户名 + 收款户名. Common buckets: 税金, 银行手续费, 保证金, 工程款, 管理费.
    - Engineering-payment strengthening for bank flows: accept if any of:
    • gc pattern (工程款/施工合同/总包/进度款/材料款/结算款/工程合同/水土保持补偿费/监理/设计…);
    • pay pattern (支付…项目 / 支付…第…期 / 支付…工程);
    • counterparty name (co: 建设/工程/建筑/施工/钢构/劳务/建材…) and 摘要 has 支付/第X期/合同.
      Exclude when text contains 税金/手续费/社保.
  4. Anything still unmatched → {cat:&#x27;未识别&#x27;, unrec:true} for manual review.

toOption(cat) maps the display category back to a fixed dropdown value (e.g.
省内调入|来自 X(123) → 内部往来) so the &lt;select&gt; options stay stable.

7. Manual re-classification (common bug to avoid)

  • Store manual overrides in ACTIVE.cat[idx] = classification; getCat checks manual first.
  • Rendering bug to avoid: a summary row is an aggregate, not a raw record. Do NOT call
    getCat(summaryObj, role) on it (the record fields are undefined → JS crash → whole render
    aborts, making "不能再次分类" appear). Instead render from the summary's own cat/unrec/count/sum
    and compute a "已改" flag via summary.rows.some(r =&gt; ACTIVE.cat[r.idx]).
  • Redraw with innerHTML after each change; persist via putWeek(JSON.parse(JSON.stringify(ACTIVE))).

8. Layout conventions (Chinese finance UI)

  • 4 summary cards: 收入笔数/金额, 支出笔数/金额, 净流量, 未识别笔数.
  • Money in two columns: 元 and 万 (÷10000). Amounts render as clean numbers the user can
    click-copy: 4,000,000 (元列) / 400 (万元列) — no ¥, no forced .00, no 万 suffix.
    Click copies the raw digits (4000000 / 400) via navigator.clipboard.writeText + a toast.
  • 收入汇总 and 支出汇总 sections; each category row has 详情 → drawer expanding per-row detail.
  • 收 = record where 收款账号 === acc &amp;&amp; 方向 === 收; 支 = 付款账号 === acc &amp;&amp; 方向 === 支
    (mirrors of 资金下拨 would double-count otherwise).

9. User-defined custom categories

  • Keep CAT_OPTIONS (fixed) plus a persistent CUSTOM_CATS array in localStorage
    (wb_custom_cats). allOptions() = CAT_OPTIONS.concat(CUSTOM_CATS).
  • Every category &lt;select&gt; is built by buildOpts(selected): allOptions + a trailing
    &lt;option value=&quot;__add__&quot;&gt;+ 新增分类…&lt;/option&gt; entry.
  • setCat/setGroup intercept val === &#x27;__add__&#x27; → addCustomCat(role, idxArr): prompt for a
    name, strip &quot;&#x27;&lt;&gt;&amp; (prevents HTML-attribute breakage), push to CUSTOM_CATS, save, and apply it
    immediately to the selected rows/group.
  • toOption(cat) must check allOptions().includes(cat) FIRST, otherwise a custom category
    falls through to the 未识别 mapping and the select loses its selection.
  • On init, scan all stored weeks' cat maps and re-register unknown values into CUSTOM_CATS —
    recovers definitions even if localStorage was cleared.

10. Account picker: custom dropdown, not <datalist>

Native &lt;datalist&gt; breaks with hundreds of options (the arrow won't scroll). Build a custom
component: input + ▾ button + absolutely-positioned scrollable list. Support live filtering,
click to choose, ↑↓ + Enter keyboard navigation, Esc / outside-click to close.

11. Publish as HTTPS link (sites skill)

  • Deploy the output directory with workbuddy_sites_deploy (language:&quot;static&quot;,
    a short appName, and userAskedToPublish:true ONLY when the user asked in their latest
    message — re-deploying over an existing link needs fresh consent every turn).
  • The same sandbox serves two domain aliases: &lt;sandboxId&gt;.app.workbuddy.host and
    &lt;sandboxId&gt;.app.workbuddy.link — both work, content identical, no re-deploy needed to switch.
  • curl gotcha: curl against the published link returns HTTP 200 with a 0-byte body (the
    proxy dislikes CLI clients). Verify with WebFetch instead — it renders the full page.
  • Browser-side data (manual cats, custom categories, uploaded weeks) lives in that browser's
    IndexedDB/localStorage — it does NOT sync across devices. Offer import/export if needed.

Bundled script

scripts/build_report.py — a runnable template: reads a source xlsx, builds DATA, inlines
SheetJS, and writes a single index.html. Copy it next to the source file and adjust the column
list + classification rules per report. Run with the venv python above.

常见问题

5 问
答案由本站依据条目字段整理
周报怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_82733122/xlsx-to-offline-html-report。安装方式为未标注。装完刷新技能列表或重开客户端。

周报支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

周报权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

周报收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

周报用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。