本文目录导读:

- 场景一:如果你有 Excel 表格(使用 Python + Pandas)
- 场景二:如果你使用 SQL 数据库(MySQL / PostgreSQL / SQLite)
- 场景三:如果你使用 Excel 原生 VBA(宏)
- 场景四:如果你需要筛选 API 返回的 JSON 数据(常见于电商平台)
- 进阶技巧:处理复杂的“未完成”定义
要筛选未完成订单,通常需要根据你的数据存储方式(如 Excel、数据库、API 或本地文件)来选择合适的脚本语言(Python、SQL、VBA 等)。
以下提供三种最常见场景的脚本方案:
如果你有 Excel 表格(使用 Python + Pandas)
假设你的 Excel 文件有一列叫做 订单状态(包含“已完成”、“待发货”、“已取消”等)。
import pandas as pd
# 1. 读取Excel文件
df = pd.read_excel("订单数据.xlsx")
# 2. 定义“未完成”的状态列表(排除已完成和已取消)
unfinished_status = ['待支付', '待发货', '已发货', '处理中', '部分发货']
# 3. 筛选出未完成的订单
df_unfinished = df[df['订单状态'].isin(unfinished_status)]
# 4. 保存或查看结果
df_unfinished.to_excel("未完成订单.xlsx", index=False)
print(f"找到 {len(df_unfinished)} 条未完成订单")
关键点:
isin()方法可以一次性匹配多个状态。
如果你使用 SQL 数据库(MySQL / PostgreSQL / SQLite)
假设表名为 orders,字段有 status(varchar)。
-- 筛选未完成订单:排除“已完成”和“已取消”
SELECT *
FROM orders
WHERE status NOT IN ('已完成', '已取消');
-- 或者明确指定未完成的状态(更安全)
SELECT *
FROM orders
WHERE status IN ('待支付', '待发货', '已发货', '处理中');
建议:使用
NOT IN排除明确完成的订单,这样可以自动包含将来新增的中间状态。
如果你使用 Excel 原生 VBA(宏)
适用于不想装 Python、直接在 Excel 里操作的情况。
Sub FilterUnfinishedOrders()
Dim ws As Worksheet
Dim rng As Range
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("订单数据") ' 修改为你的工作表名
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' 假设状态在C列
' 清除已有筛选
ws.AutoFilterMode = False
' 应用自动筛选(排除“已完成”和“已取消”)
With ws.Range("A1:C" & lastRow)
.AutoFilter Field:=3, Criteria1:="<>已完成", _
Operator:=xlAnd, Criteria2:="<>已取消"
End With
' 将筛选结果复制到新表
ws.Range("A1:C" & lastRow).SpecialCells(xlCellTypeVisible).Copy
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Paste
ActiveSheet.Name = "未完成订单"
MsgBox "已完成筛选"
End Sub
如果你需要筛选 API 返回的 JSON 数据(常见于电商平台)
假设你从淘宝/Shopify等API获取订单列表,每个订单有一个 status 字段。
import requests
# 假设你已经获取了订单列表
# orders_list = response.json().get('orders', [])
# 例如手动模拟数据
orders_list = [
{"order_id": 101, "status": "completed"},
{"order_id": 102, "status": "pending"},
{"order_id": 103, "status": "shipped"},
{"order_id": 104, "status": "cancelled"}
]
# 定义未完成状态
unfinished_statuses = ['pending', 'shipped', 'processing']
# 列表推导式筛选
unfinished_orders = [order for order in orders_list
if order['status'] in unfinished_statuses]
print(unfinished_orders)
进阶技巧:处理复杂的“未完成”定义
有些业务里,“未完成”不仅仅是看状态字段,可能还包括:
- 时间条件:逾期未发货
- 金额条件:尾款未付清的订单
- 组合条件:状态为“已发货”但物流未签收超过7天
示例(Python):
from datetime import datetime, timedelta
seven_days_ago = datetime.now() - timedelta(days=7)
# 筛选:状态为“已发货” 且 发货时间超过7天 但 签收时间为空
df_unfinished = df[
(df['订单状态'] == '已发货') &
(df['发货时间'] < seven_days_ago) &
(df['签收时间'].isna())
]
| 数据来源 | 推荐方法 | 关键代码 |
|---|---|---|
| Excel文件 | Python Pandas isin() 或 query() |
df[df['状态'].isin(['待发货','待支付'])] |
| SQL数据库 | WHERE status NOT IN |
WHERE status NOT IN ('已完成','已取消') |
| Excel原生 | VBA AutoFilter | Criteria1:="<>已完成" |
| JSON/API | Python列表推导式 | [o for o in orders if o['status'] in ...] |
你需要我针对特定的数据格式(例如特定的电商系统单据)或特定的筛选逻辑(比如按日期范围+状态)提供更详细的脚本吗?