从供应链Excel报表的"整体库存"工作表中,自动提取指定的核心字段,生成精简的数据表格。适用于日常库存监控、数据分享和报表制作。
适用场景:
数据来源:鱼跃品牌供应链全品类库存报表
从"整体库存"工作表中提取以下14个字段(按列名精确匹配):
| 序号 | 字段名 | 说明 |
|---|---|---|
| ------ | -------- | ------ |
| 1 | SAP代码 | 产品唯一标识 |
| 2 | SAP代码2 | 备用产品标识 |
| 3 | 京东库存(截止前一日24点) | 京东平台实时库存 |
| 4 | 京东在途+商家所有(含开单未提货及今日入库) | 京东在途及商家库存 |
| 5 | 股份库存 | 股份公司库存 |
| 6 | 京东近7天/7*30 | 京东近7天销量折算月销 |
| 7 | 京东周转 | 京东库存周转率 |
| 8 | 2026-5_排产数量 | 2026年5月计划排产数量 |
| 9 | 2026-5_入库数量 | 2026年5月实际入库数量 |
| 10 | 2026-5_待入库数量 | 2026年5月待入库数量 |
| 11 | 2026-6_排产数量 | 2026年6月计划排产数量 |
| 12 | 2026-5_京东销量 | 2026年5月京东平台销量 |
| 13 | 2026-5_天猫销量 | 2026年5月天猫平台销量 |
| 14 | 2026-5_渠道出货量 | 2026年5月渠道总出货量 |
输入Excel文件 → 读取"整体库存"工作表 →
验证字段存在性 → 提取指定字段 →
生成新Excel文件 → 输出结果
输入要求:
输出规则:
{原文件名}_指定字段摘取.xlsximport pandas as pd
import sys
import os
def extract_excel_fields(input_file, sheet_name='整体库存', output_suffix='_指定字段摘取.xlsx'):
"""
从Excel文件中提取指定字段
参数:
----------
input_file : str
输入Excel文件路径
sheet_name : str, default='整体库存'
要读取的工作表名称
output_suffix : str, default='_指定字段摘取.xlsx'
输出文件后缀
返回:
-------
str : 输出文件路径
"""
# 字段提取清单
columns_to_extract = [
'SAP代码',
'SAP代码2',
'京东库存(截止前一日24点)',
'京东在途+商家所有(含开单未提货及今日入库)',
'股份库存',
'京东近7天/7*30',
'京东周转',
'2026-5_排产数量',
'2026-5_入库数量',
'2026-5_待入库数量',
'2026-6_排产数量',
'2026-5_京东销量',
'2026-5_天猫销量',
'2026-5_渠道出货量'
]
# 验证输入文件
if not os.path.exists(input_file):
raise FileNotFoundError(f"输入文件不存在: {input_file}")
# 生成输出路径
base_name = os.path.splitext(os.path.basename(input_file))[0]
output_file = os.path.join(os.path.dirname(input_file), f'{base_name}{output_suffix}')
print(f'📂 读取文件: {input_file}')
print(f'📊 工作表: {sheet_name}')
print(f'🔍 提取字段数: {len(columns_to_extract)}')
try:
# 读取Excel文件
df = pd.read_excel(input_file, sheet_name=sheet_name)
print(f'📈 原始数据形状: {df.shape}')
# 检查列是否存在
missing_columns = [col for col in columns_to_extract if col not in df.columns]
if missing_columns:
print('❌ 错误: 以下字段在数据中不存在:')
for col in missing_columns:
print(f' {repr(col)}')
print('\n📋 实际列名:')
for col in df.columns:
print(f' {repr(col)}')
raise ValueError(f"缺失字段: {missing_columns}")
# 提取指定列
df_extracted = df[columns_to_extract].copy()
print(f'✅ 提取后形状: {df_extracted.shape}')
# 保存到新Excel文件
df_extracted.to_excel(output_file, index=False)
print(f'💾 数据已保存至: {output_file}')
# 显示统计信息
print('\n📊 数据统计:')
print(f' 行数: {len(df_extracted)}')
print(f' 列数: {len(df_extracted.columns)}')
print(f' 文件大小: {os.path.getsize(output_file):,} bytes')
return output_file
except Exception as e:
print(f'❌ 处理过程中出错: {e}')
raise
if __name__ == '__main__':
# 使用示例
if len(sys.argv) < 2:
print("使用方法: python extract_fields.py <Excel文件路径>")
print("示例: python extract_fields.py C:\\路径\\全品类库存.xlsx")
sys.exit(1)
input_file = sys.argv[1]
try:
output_file = extract_excel_fields(input_file)
print(f'\n🎉 提取完成! 文件已保存: {output_file}')
except Exception as e:
sys.exit(1)
安装依赖:
pip install pandas openpyxl
运行方式:
```bash
python extract_fields.py "C:\路径\全品类库存-调整后.xlsx"
```
```python
from extract_fields import extract_excel_fields
output = extract_excel_fields("C:\\路径\\全品类库存.xlsx")
```
```python
import glob
for file in glob.glob("C:\\路径\\*.xlsx"):
extract_excel_fields(file)
```
当需要提取Excel字段时,可以直接告诉WorkBuddy:
"按上次的字段清单提取" 或 "提取供应链库存字段"
_指定字段摘取.xlsx文件用户:@"C:/路径/全品类库存.xlsx" 按上次的字段清单提取
WorkBuddy:
✅ 已按照字段清单提取数据
📊 结果:650行 × 14列
💾 文件:全品类库存_指定字段摘取.xlsx
📎 附件已交付
编辑extract_fields.py中的columns_to_extract列表:
columns_to_extract = [
# 添加或删除字段
'SAP代码',
'新增字段名',
# ...
]
如需处理多个工作表,修改函数参数:
def extract_multiple_sheets(input_file, sheet_names=['整体库存', '其他表']):
for sheet in sheet_names:
extract_excel_fields(input_file, sheet_name=sheet)
在提取后添加数据处理逻辑:
# 去除空值行
df_extracted = df_extracted.dropna(subset=['SAP代码'])
# 数据类型转换
df_extracted['SAP代码'] = df_extracted['SAP代码'].astype(str)
# 添加计算列
df_extracted['库存总量'] = df_extracted['京东库存'] + df_extracted['股份库存']
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| ---------- | ---------- | ---------- |
| "文件不存在" | 路径错误或文件被占用 | 检查文件路径,确保文件已关闭 |
| "工作表不存在" | 工作表名称不匹配 | 确认工作表名为"整体库存"(区分大小写) |
| "字段不存在" | 列名不匹配(前导/后导空格) | 使用repr()查看精确列名,调整字段列表 |
| 内存不足 | 文件过大 | 分块读取:pd.read_excel(..., chunksize=1000) |
| 编码错误 | 文件包含特殊字符 | 指定编码:pd.read_excel(..., engine='openpyxl') |
```python
import pandas as pd
df = pd.read_excel('文件.xlsx', nrows=1)
for col in df.columns:
print(repr(col))
```
```python
required = ['SAP代码', '京东库存']
missing = [col for col in required if col not in df.columns]
if missing:
print(f"缺失字段: {missing}")
```
```python
# 只读取前100行测试
df_sample = pd.read_excel('文件.xlsx', nrows=100)
```
创建定期提取任务:
# 自动化配置
schedule: "daily 09:00"
task: "提取供应链日报数据"
inputs:
- "C:\日报\供应链全品类.xlsx"
outputs:
- "C:\日报\提取结果\供应链日报_提取.xlsx"
# 数据管道示例
def data_pipeline():
# 1. 提取字段
raw_file = extract_excel_fields("原始数据.xlsx")
# 2. 数据转换
df = pd.read_excel(raw_file)
df_processed = transform_data(df)
# 3. 加载到数据库
load_to_database(df_processed)
# 4. 生成报告
generate_report(df_processed)
# 分块读取(适用于超过10万行)
chunk_size = 10000
chunks = pd.read_excel('大文件.xlsx', chunksize=chunk_size)
results = []
for chunk in chunks:
extracted = chunk[columns_to_extract]
results.append(extracted)
df_final = pd.concat(results, ignore_index=True)
# 只读取需要的列
usecols = columns_to_extract + ['必要辅助列']
df = pd.read_excel('文件.xlsx', usecols=usecols)
from concurrent.futures import ThreadPoolExecutor
def process_multiple_files(file_list):
with ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(extract_excel_fields, file_list))
return results
def test_extraction():
# 测试正常文件
test_file = "测试数据.xlsx"
output = extract_excel_fields(test_file)
assert os.path.exists(output)
# 验证字段完整性
df = pd.read_excel(output)
assert 'SAP代码' in df.columns
assert len(df.columns) == 14
print("✅ 所有测试通过")
{原文件名}_指定字段摘取.xlsx
示例:全品类库存-调整后_指定字段摘取.xlsx
输出文件/
├── 数据表(14个指定字段)
├── 元数据(可选)
│ ├── 提取时间
│ ├── 字段清单版本
│ └── 数据统计
└── 质量报告(可选)
| 版本 | 日期 | 变更说明 |
|---|---|---|
| ------ | ------ | ---------- |
| v1.0 | 2026-05-21 | 初始版本,基于历史工作记录创建 |
| 固化14个核心字段清单 | ||
| 添加完整脚本和文档 |
技能来源:基于鱼跃品牌供应链数据分析工作历史记录
适用场景:医疗器械、电商供应链、库存管理
数据安全:仅提取指定字段,不包含原始完整数据
维护责任:数据团队定期更新字段清单
共 1 个版本