Skip to content

About

金蝶云星空多表单据/报表导出 Skill|销售/存货/采购/银行流水/AR-AP(Kingdee Cloud data exporter)

Topics

Resources

Stars

8 stars

Watchers

0 watching

Forks

Repository files navigation

本项目采用「小河狸工作室非转售许可 1.0」—— 个人使用与企业内部使用免费(含内部办公、财务与会计处理、内部系统集成); 对外销售、集成进收费产品或服务、托管 / SaaS / 代运营、以及向第三方交付成果或提供服务,须事先取得书面授权。 许可全文见 LICENSE。商业授权:https://littlebeaver.top

License

金蝶云星空数据导出 Skill

把金蝶云星空中的单据和报表批量导出为一个多工作表 Excel 文件。适合需要定期取数、经营分析、财务核对或给其他 AI Skill 提供数据的中文用户。

✨ 能做什么

  • 按日期和组织导出数据
  • 一次导出多个单据或报表
  • 使用中文名称或 form_id 精确选择内容
  • 查询全部组织编码
  • 连接自检:六步定位"依赖/配置/网络/账套/登录/权限"到底卡在哪
  • 账套自动发现:不用问实施商要账套 ID,只填账套名称即可
  • 对象探查:列子系统 → 列业务对象(含 FormId)→ 体检能否取数,清单外的对象也能定位
  • 按已保存的方案导出:金蝶列表里存好的过滤方案(条件 + 显示列 + 排序)一条命令原样复用
  • 字段核对:查出某个单据在当前账套的权威字段清单,避免猜字段
  • 追加官方字段说明中的字段(支持直接写中文名)
  • 导出全组织数据后再按条件筛选
  • 交付友好的 Excel:表头加粗、首行冻结、列宽自适应、自动筛选
  • 审计日志:每次取数留一行元数据记录(时间/对象/行数),不记业务内容

依赖只有两个:pandas + openpyxl。网络、加密、日期全部走 Python 标准库, 不需要 requests / python-dateutil —— 受控内网装不上轮子时这一条很关键。

目前覆盖销售、采购、库存、应收应付、收付款、费用、资金、总账和三大财务报表等常用数据。实际清单以这条命令为准:

python data_exporter.py --show-config

🚀 三步开始

1. 安装依赖

python -m pip install -r requirements.txt

2. 填写配置

推荐:配置向导(弹窗,明文不落盘)

python setup_credentials.py

弹窗里只需填 3 项:公司名(账套名称)、用户名、密码。凭据用 Windows 系统加密(DPAPI) 保存到 ~/.workbuddy/kingdee/credentials.bin —— 绑当前 Windows 用户,同机其它用户读不出、 拷到别的机器解不开、不在任何 git 仓库内。不写明文、不进对话记录、不落日志。

只看状态不开窗:python setup_credentials.py --check;改密码:--change-key(要求输两次,避免打错撞锁号)

不需要用户装 Python 或 tkinter:当前解释器没带 tkinter 时,先找本机已装的另一个 Python, 再不行就用内置的原生 Windows 表单(win32_form.py,纯 ctypes),最后才降级成文字向导 —— 全程零安装。窗口关掉 = 没有保存(退出码 10),不会被当成配置成功。

这份凭据全系列共用:分析类技能、报销助手都读它,谁都不另存一份;发票云密钥不在这个文件里 (在 piazzone.bin,归报销助手自己管),所以两边不会互相覆盖。

从旧版明文迁移:若本机已有 ~/.workbuddy/kingdee/config.json(密码明文),跑一次向导即可 —— 读入旧值 → 加密保存 → 默认勾选删除该明文文件 → 提示到金蝶后台修改一次密码。

备选:写用户级配置文件(旧版写法,兼容保留,不推荐)

~/.workbuddy/kingdee/config.json(Windows:C:\Users\<你>\.workbuddy\kingdee\config.json)

{
  "base_url": "https://你的域名/k3cloud/",
  "acct_name": "账套名称",
  "username": "取数账号",
  "password": "密码"
}
  • 账套 ID 不用自己找 —— 只填 acct_name(账套名称)会自动解析;想直接填 acctid 就先跑 --list-datacenters。
  • 也可以用环境变量 KINGDEE_BASE_URL / KINGDEE_ACCTID / KINGDEE_ACCT_NAME / KINGDEE_USERNAME / KINGDEE_PASSWORD。 ⚠️ 环境变量不会被误提交进 git,但本地并不保密(同用户其它进程可读、会进日志与崩溃转储); 本机保密请用上面的向导。
  • 兼容旧写法:复制 config.example.py 为 config.py 并填写。
  • 需要多个账套时用 profiles 结构 + KINGDEE_PROFILE 切换,详见 SKILL.md。

读取优先级:环境变量 > 系统加密凭据 > 明文 config.json > 技能目录 config.py。

🔐 无论哪种方式,都不要把真实账号、密码或账套 ID 提交到公开仓库。

3. 自检,然后运行导出

python data_exporter.py --doctor      # 先确认接通(配置→连通→账套→登录→取数冒烟)
python data_exporter.py               # 再导出

不知道从哪开始配,或忘记配置方式时:

python data_exporter.py --help-config

完成后会在当前目录生成类似下面的文件:

云星空经营数据_2026年07月_20260715_120000.xlsx

经营数据可能包含敏感信息。建议保存到访问权限受控的目录:

python data_exporter.py --output-dir "D:/secure/kingdee-exports"

🧭 推荐使用顺序

第一次使用时,按下面顺序最省事。

查看可导出的内容

python data_exporter.py --show-config

获取组织编码

python data_exporter.py --list-orgs

生成的组织列表中:

  • number:组织编码,用于 --org
  • name:组织名称

按期间和组织导出

python data_exporter.py --start 2026-06-01 --end 2026-06-30 --org ORG001

只导出一种单据或报表

使用中文名称:

python data_exporter.py --start 2026-06-01 --end 2026-06-30 --org ORG001 --only 销售出库单

使用 form_id:

python data_exporter.py --start 2026-06-01 --end 2026-06-30 --org ORG001 --only SAL_OUTSTOCK

多个组织或多个项目使用英文逗号分隔:

python data_exporter.py --org ORG001,ORG002 --only SAL_OUTSTOCK,AR_receivable

全组织导出

python data_exporter.py --org all --only 应收单

⚠️ 全组织数据可能很多,建议同时使用 --only 缩小范围。

💾 可复用查询模板

财务每月结账的取数条件(组织、期间、单据类型)几乎不变,把这套组合存成命名模板,下个月直接调,不用每个月重新说一遍参数。模板只存「取什么 / 给谁」,不存凭据。

# 保存当前参数组合为模板(period 用相对期间,模板才能长期有效)
python data_exporter.py --only SAL_OUTSTOCK --org 101 --period last-month --output-dir D:/月结 --save-query 月结销售出库

# 下个月直接调用,期间自动往前滚一个月
python data_exporter.py --query 月结销售出库

# 查看已保存的模板
python data_exporter.py --list-queries
  • --period 支持:last-month / this-month / last-quarter / this-quarter / last-year / this-year / YYYY-MM(该月整月)。务必用相对期间,固定日期的模板第二个月就失效。
  • 模板文件在 ~/.workbuddy/kingdee/queries.json,可手改、可进 git 与同事共享。
  • 还没填凭据、想先看「这个对象会导出哪些列」?用 --preview-fields(读本地字段说明,不联网):
python data_exporter.py --preview-fields SAL_OUTSTOCK        # 按 FormId
python data_exporter.py --preview-fields 销售出库单           # 或按中文名

🗂️ 按已保存的过滤方案导出

在金蝶列表页【过滤】→ 设好条件 →【保存方案】存下来的方案(比如应收单的「日报表」), 可以直接拿来取数:条件、显示列、排序全套照搬,不用在命令行重复描述一遍。

# 看这个对象下有哪些方案(中文表单名也认)
python data_exporter.py --list-schemes 应收单

# 按方案导出
python data_exporter.py --form-id AR_receivable --scheme "日报表" --output-dir D:/取数

# 方案名全账套唯一时,--form-id 也可以省(自动定位表单)
python data_exporter.py --scheme "日报表"
  • 方案存在金蝶基础对象 BOS_FilterScheme 里,<FilterSetting> 的结构就是取数接口 FilterString 的原生结构, 所以是原样透传,不去翻译 63/92/105/106 这类比较符编码 —— 翻译表猜错就是静默错数。
  • 同一字段的多选状态(比较符 106 = 属于)会合并成一次 IN,与界面口径一致。
  • 方案里有本账套已删的列会自动跳过并提示;同名方案有多个用 --scheme-index 选。
  • 与 --query 模板的区别:--query 存的是本工具的参数组合(~/.workbuddy/kingdee/queries.json), --scheme 读的是金蝶里的方案 —— 财务在金蝶改一次,下次取数立刻生效。
  • ⚠️ 只对单据类对象有效;报表的方案是版式方案,不能当列表过滤条件用(代码会提前拦下提示,改走 --only)。

🧩 追加默认字段

field-docs/ 保存了各类单据和报表的字段参考(每个对象一个文件,按 FormId 命名,如 AR_receivable.txt)。需要临时增加默认未导出的字段时,使用 --fields:

python data_exporter.py --only AR_receivable --fields "AR_receivable:FNOINVOICEAMOUNT"

也支持直接写中文名(对照表里有的字段):

python data_exporter.py --only 应收单 --fields "应收单:价税合计"

目录用 ASCII 文件名(FormId)而不是中文名,是为了压缩包跨系统解压时不出现乱码。 2.3.x 及更早的 官方字段说明/<中文名>.txt 布局仍然兼容,代码会自动回退。

Windows 控制台遇到中文参数编码问题时,优先使用字段 key。

常用特殊配置

限制银行存款流水账的银行账号时,在本地 config.py 中填写:

KINGDEE_CONFIG["bank_account_numbers"] = ["银行账号1", "银行账号2"]

财务报表默认按导出期间生成月报,并拆分为资产负债表、利润表和现金流量表。需要季报、半年报或年报时,在 KINGDEE_CONFIG["financial_report"] 中调整 CycleType:

  • 4:月报
  • 5:季报
  • 6:半年报
  • 7:年报

合并报表还需要根据本企业的云星空报表模板,补充报表编号、会计体系、会计政策和合并范围等参数。

收票单、银行存款流水账 等项目的可选字段,均可在 field-docs/ 中查看。

🧭 清单外的对象怎么导(对象探查)

凭证、资产卡片、即时库存、二开单据这些不在内置清单里的对象,用 --form-id 取数即可, 前提是知道 FormId。不知道就走这条链:

python data_exporter.py --list-subsystems                      # ① 有哪些模块(GL / AR / STK …)
python data_exporter.py --list-objects --object-sub GL          # ② 该模块下有哪些对象
python data_exporter.py --list-objects --object-kw 凭证         # ③ 只知道名字就跨模块搜
python data_exporter.py --test-form GL_Voucher                 # ④ 体检:元数据 + 取数两关
python data_exporter.py --form-id GL_Voucher --filter-string "FDate>='2026-09-01'"   # ⑤ 取数

两个容易踩的点:

  • 别按 FormId 前缀猜模块。动态建模生成的对象 FormId 是数字码或 GUID,不带 GL / AR 前缀, 按前缀筛会漏一大片。子系统归属存在 FSubSystemId 里,用 --object-sub 才筛得全。
  • 在册 ≠ 能取数。注册表里混着单据转换规则、打印模板等非表单对象,--form-id 一定失败。 所以第 ④ 步不能省,--test-form 会分开告你卡在「元数据」还是「取数」。

清单可落盘成 JSON,便于脚本化:

python data_exporter.py --list-objects --object-sub AR --json-out ar_objects.json

📝 审计日志

每次导出、导出失败、登录失败都会在 ~/.workbuddy/kingdee/audit.log 追加一行 JSON:

{"ts": "2026-10-17 19:02:47", "action": "export_form", "version": "2.4.1",
 "form": "BD_MATERIAL", "rows": 2908, "output": "BD_MATERIAL_BD_MATERIAL_20261017_190246.xlsx"}

只记元数据(时间 / 动作 / 对象 / 组织 / 行数 / 成功与否),不记业务数据内容、不记账号密码。 目的是事后能回答「这批数据是什么时候、导了哪个对象、多少行、成功与否」。 不记录账号名 —— 按本技能的原则「真实账号不进任何日志」,要追到人请结合操作系统的登录审计。 不需要就设 KINGDEE_AUDIT=0 关掉。

🔎 筛选已导出的 Excel

按组织和单据类型筛选:

python scripts/filter_export_excel.py --input "导出文件.xlsx" --org ORG001 --bill-type "应收单"

只处理一个工作表:

python scripts/filter_export_excel.py --input "导出文件.xlsx" --sheet "应付单" --org ORG001

默认会在原文件旁生成带 _filtered 后缀的新文件。

🤖 让 AI 工具识别这个 Skill

仓库采用“一个仓库一个 Skill”的通用结构,SKILL.md 位于仓库根目录:

KingdeeDataExporter/
├── SKILL.md
├── README.md
├── CHANGELOG.md
├── data_exporter.py
├── setup_credentials.py
├── win32_form.py        # 原生 Windows 表单(纯 ctypes,缺 tkinter 时用)
├── credstore.py
├── config.example.py
├── requirements.txt
├── scripts/
├── references/
└── field-docs/          # 字段参考,按 FormId 命名(ASCII 文件名)

支持从 GitHub 扫描 Skill 的工具,可以直接使用仓库地址:

https://github.com/LittleBeaverStudio/KingdeeDataExporter

识别后可这样发起任务:

请使用 kingdee-data-exporter,先帮我查询组织编码,再导出上个月的销售出库单。

SkillHub / 其他管理器

能递归扫描 SKILL.md 的 SkillHub 或桌面管理器可以直接识别本仓库。若平台要求上传压缩包,请压缩整个仓库,并确认解压后根目录中仍有 SKILL.md。

🛠️ 常见问题

连接报错,不知道卡在哪

python data_exporter.py --doctor

会逐步判定 运行环境 → 配置 → 服务器连通 → 账套定位 → 登录 → 取数冒烟,哪一步失败就给哪一步的修复动作。 最常见的两种:WebAPI 白名单没配(报 MsgCode 11,与账号密码无关)和 密码大小写错。 (openpyxl 缺失会在第 0 步就报出来 —— 否则要等到最后写 Excel 才炸,最难排查。) 完整判读表见 references/error-playbook.md。

⚠️ 密码连续错约 5 次会锁账号。本工具判读为凭据问题时不自动重试,连续 2 次即中止。

不知道账套 ID(acctid)

python data_exporter.py --list-datacenters

这个接口免账号密码,第 1 列就是 acctid。或者干脆只填 acct_name,由脚本自动解析。

不知道组织编码

python data_exporter.py --list-orgs

注意区分:账套(acctid,一台服务器上的一个数据中心)≠ 组织(账套内的核算组织,--org 用的编码)。

不知道 --only 填什么

python data_exporter.py --show-config

字段导不出来 / 报"字段不存在"

python data_exporter.py --inspect-fields ER_ExpReimbursement --filter 发票

这是当前账套的权威字段清单,查不到就说明该字段确实不存在,不要继续猜。

要不要自己加环境变量?(export PATH=... 那行)

本 Skill 不需要任何环境变量。 凭据在 python setup_credentials.py 的弹窗里填一次,用 Windows DPAPI 加密存到 ~/.workbuddy/kingdee/,跟环境变量无关。KINGDEE_BASE_URL / KINGDEE_USERNAME 这类环境变量只是「不想写配置文件时可以代替」的可选项。

如果你在别处看到 export PATH="$HOME/.local/bin:$PATH",那是 SkillHub 命令行工具自己的安装目录不在 PATH 里, 和取数没有关系;只有手工跑过 SkillHub 的 install.sh 才需要补,写进 ~/.bashrc 可永久生效。 用 WorkBuddy 里的一键安装不需要管这一行(Skill 会落到 ~/.workbuddy/skills/)。

检查是否有新版本

python data_exporter.py --check-update

版本检查默认关闭,只有 --check-update 会访问 GitHub Releases API,日常导出不产生额外网络请求。

📁 主要文件

SKILL.md                 AI 执行说明与触发描述
README.md                中文使用介绍
CHANGELOG.md             版本变更记录
data_exporter.py         主程序
setup_credentials.py     凭据向导(DPAPI 加密)
credstore.py             凭据存取
config.example.py        安全配置示例
requirements.txt         Python 依赖(仅 pandas + openpyxl)
scripts/                 Excel 二次处理脚本
field-docs/              金蝶字段参考(按 FormId 命名)
references/              排障手册与查询实战
  error-playbook.md      错误判读与自愈(含白名单配置路径)
  query-cookbook.md      载荷格式、去重口径、状态码、场景配方
agents/openai.yaml       AI 客户端展示信息

本工具仅用于你有权访问的金蝶环境。使用者需要自行负责凭据保管、权限控制和数据合规。

About

金蝶云星空多表单据/报表导出 Skill|销售/存货/采购/银行流水/AR-AP(Kingdee Cloud data exporter)

Topics

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages