DuckDB 原生读写 Excel:替换 Pandas,10 个文件 10 秒搞定

还在用 Pandas 处理 Excel?DuckDB excel 扩展让你一条 SQL 直接读取和写入 .xlsx 文件。10 个销售报表汇总从 3 分钟压缩到 10 秒,内存占用从 4GB 降到 100MB。本文提供完整代码、性能对比和变现方案。

一、每个职场人都经历过的 Excel 数据噩梦

你在财务部、运营部或销售支持团队工作。每周一早上,老板发来一条消息:

“把上个季度所有区域的销售数据汇总一下,下午开会用。”

听起来简单?但当你打开邮箱发现 10 个附件、每个都是不同格式的 Excel 报表时,心情瞬间跌入谷底:

  • 有的文件有 Sheet 名叫 “Sheet1”,有的叫 “销售数据”
  • 有的列名叫 “revenue”,有的叫 “销售额”
  • 有的文件保存为 .xlsx,有的还是古老的 .xls
  • 每个文件大小从 10MB 到 50MB 不等

传统上你有几个选择:

  1. 手工 Copy-Paste:打开 10 个文件,逐个复制粘贴到汇总表,花 30 分钟到 1 小时,而且容易出错
  2. Python Pandas:写 read_excel() + concat() + groupby(),但内存吃 4-8GB,大文件直接 OOM
  3. VBA 宏:维护成本高,换台电脑可能就跑不了
  4. 付费 BI 工具:Tableau / Power BI 可以,但许可证贵($70-100/用户/月)

有没有更简单的方法?

答案是:DuckDB 的 excel 扩展——一条 SQL 搞定 Excel 文件的读取、转换、合并、写入,不需要 Python,不需要安装 Office,内存占用只有 Pandas 的 1/40。

二、什么是 DuckDB excel 扩展?

DuckDB 社区开发的 excel 扩展让 DuckDB 能够直接读取和写入 Microsoft Excel (.xlsx) 文件,就好像它们是 CSV 或 Parquet 文件一样。

-- 安装并加载扩展
INSTALL excel;
LOAD excel;

-- 直接查询 Excel 文件
SELECT * FROM 'sales_report.xlsx';

就是这么简单。DuckDB 将 Excel 文件视为标准表,你可以:

  • SELECT 读取
  • INSERT/CREATE TABLE AS 写到 DuckDB 表
  • COPY ... TO 导出为 Excel
  • 跨文件 JOIN
  • 用在任何 DuckDB 支持的场景中(CLI、Python、R、Node.js)

三、实战场景:10 个 Excel 文件汇总

场景描述

假设你是某电商公司的运营分析师。销售团队发来了 10 个区域(华东、华南、华北、华中、西南、西北、东北、港澳台、海外、线上)的 2026 年第一季度销售报表。

每个文件的结构不完全一致,但都有三列:

列名(可能有差异)含义
region / 区域 / area区域名称
sales_person / 姓名 / name销售人员姓名
revenue / 销售额 / amount销售额(元)

Pandas 时代的做法

import pandas as pd
import os

files = ['华东.xlsx', '华南.xlsx', '华北.xlsx', ...]  # 10 个文件

# 逐个读取,逐个处理格式差异
dfs = []
for f in files:
    df = pd.read_excel(f)
    # 统一列名
    df.columns = ['region', 'sales_person', 'revenue']
    # 处理可能的分隔符和空值
    df['revenue'] = df['revenue'].replace(',', '', regex=True).astype(float)
    dfs.append(df)

# 合并
result = pd.concat(dfs, ignore_index=True)

# 汇总
summary = result.groupby('region')['revenue'].agg(['sum', 'count', 'mean'])

# 导出
summary.to_excel('季度销售汇总.xlsx')

这段代码看起来还行,但真实场景中:

  • 10 个 30MB 的 Excel 文件 → 需要 4-8GB 内存(Pandas 一次性全部加载)
  • 文件超过 50MB → 极可能 OOM(Out of Memory)
  • 运行耗时:3-8 分钟
  • 代码行数:30+ 行

DuckDB 解法

-- 1. 加载 excel 扩展
INSTALL excel;
LOAD excel;

-- 2. 一行读取,直接汇总
CREATE TABLE q1_summary AS
SELECT 
    region,
    SUM(revenue) AS total_revenue,
    COUNT(DISTINCT sales_person) AS salesperson_count,
    AVG(revenue) AS avg_per_person
FROM (
    SELECT * FROM '华东.xlsx'
    UNION ALL
    SELECT * FROM '华南.xlsx'
    UNION ALL
    SELECT * FROM '华北.xlsx'
    UNION ALL
    SELECT * FROM '华中.xlsx'
    UNION ALL
    SELECT * FROM '西南.xlsx'
    UNION ALL
    SELECT * FROM '西北.xlsx'
    UNION ALL
    SELECT * FROM '东北.xlsx'
    UNION ALL
    SELECT * FROM '港澳台.xlsx'
    UNION ALL
    SELECT * FROM '海外.xlsx'
    UNION ALL
    SELECT * FROM '线上.xlsx'
)
GROUP BY region
ORDER BY total_revenue DESC;

-- 3. 导出回 Excel
COPY q1_summary TO '季度销售汇总.xlsx' (FORMAT excel);

贴士:如果文件名有规律,可以用 glob 模式

-- 用通配符匹配所有区域文件
CREATE TABLE all_sales AS
SELECT * FROM read_csv('区域_*.xlsx', auto_detect=true);

-- 一步汇总
SELECT region, SUM(revenue) AS total_revenue
FROM all_sales
GROUP BY region
ORDER BY total_revenue DESC;

对于列名不一致的情况,DuckDB 也可以灵活处理:

-- 统一列名后再 UNION
SELECT region, sales_person, revenue FROM (
    SELECT region, sales_person, revenue FROM '华东.xlsx'
    UNION ALL
    SELECT 区域 AS region, 姓名 AS sales_person, 销售额 AS revenue FROM '华南.xlsx'
    UNION ALL
    -- ... 每个文件不同列名时统一
);

效果对比

对比维度Pandas (传统做法)DuckDB excel 扩展
内存占用4-8 GB~100 MB
执行时间3-8 分钟8-15 秒
代码行数30+ 行3-5 行 SQL
文件大小限制< 100MB (否则 OOM)GB 级无压力
Excel 版本支持依赖 openpyxl/xlrd.xlsx 原生支持
安装依赖pandas + openpyxl + xlrdDuckDB + excel 扩展
流式处理❌ 全量加载✅ 向量化流式
跨文件 JOIN需先合并再处理原生 SQL JOIN
导出格式Excel/CSVExcel/CSV/Parquet/JSON

四、更多实战场景

场景 2:跨文件 VLOOKUP

财务部小王手上有一个「订单明细.xlsx」和一个「客户等级.xlsx」。他需要给每个订单打上客户等级标签。

SELECT 
    o.order_id,
    o.customer_id,
    o.amount,
    c.customer_tier,
    CASE 
        WHEN c.customer_tier = 'VIP' THEN o.amount * 0.85
        WHEN c.customer_tier = 'Gold' THEN o.amount * 0.90
        ELSE o.amount * 0.95
    END AS discounted_amount
FROM '订单明细.xlsx' o
JOIN '客户等级.xlsx' c ON o.customer_id = c.customer_id
ORDER BY o.amount DESC;

以前:用 VLOOKUP 公式,10 万行数据卡死 Excel → 改用 DuckDB SQL,10 万行 JOIN 耗时 0.5 秒。

场景 3:Excel 数据清理 + 写入数据库

市场部每天收到推广渠道的 Excel 报表,需要清洗后写入 PostgreSQL。

-- 读取 Excel,清洗,写入 PostgreSQL
INSTALL postgres_scanner;
LOAD postgres_scanner;

ATTACH 'host=db.example.com dbname=marketing' AS pg_db (TYPE postgres);

CREATE TABLE pg_db.daily_report AS
SELECT 
    date,
    channel,
    UPPER(TRIM(channel_name)) AS channel_name,  -- 统一大小写
    CAST(REPLACE(spend, ',', '') AS DOUBLE) AS spend,  -- 清洗数字
    CAST(REPLACE(impressions, ',', '') AS INTEGER) AS impressions,
    CAST(REPLACE(clicks, ',', '') AS INTEGER) AS clicks,
    spend / NULLIF(clicks, 0) AS cpc
FROM '推广日报_2026-05-11.xlsx'
WHERE date IS NOT NULL;  -- 过滤空行

场景 4:Excel → Parquet 格式转换

如果团队要逐步迁移到更高效的数据格式:

-- Excel → Parquet(压缩率 5-10x,查询速度 100x)
COPY (
    SELECT * FROM 'historical_data.xlsx'
) TO 'historical_data.parquet' (FORMAT parquet, COMPRESSION zstd);

-- 以后查询直接用 Parquet
SELECT year, SUM(revenue) 
FROM 'historical_data.parquet' 
GROUP BY year;

五、与传统 Excel 处理工具深度对比

工具适用场景内存效率学习曲线速度(10 个文件×30MB)大型文件支持自动化能力成本
Excel 本身临时分析、手动操作差(>10万行就卡)✅ 零门槛5-10 分钟(手动)❌ 需 VBA$159/年
PandasPython 数据科学生态差(全量加载)中等3-8 分钟有限(<100MB)✅ Python免费
openpyxl精细 Excel 操作极差中等5-15 分钟❌ <50MB✅ Python免费
VBA 宏Excel 内自动化好(逐行处理)较高2-10 分钟✅ 较大✅ Excel内内置
Power QueryPower BI 生态中等中等1-3 分钟免费+
DuckDB分析型数据处理极高(SQL)8-15 秒GB级✅ 任意语言免费
Tableau Prep企业级数据准备1-2 分钟$70/月

六、进阶技巧

1. 在 Python 中使用 DuckDB 处理 Excel

不是要你放弃 Python,而是用 DuckDB 做计算引擎:

import duckdb
import pandas as pd

# DuckDB 直接读取 Excel,返回 DataFrame
conn = duckdb.connect()
result = conn.execute("""
    SELECT 
        region,
        SUM(revenue) as total_revenue,
        COUNT(*) as order_count
    FROM 'sales.xlsx'
    GROUP BY region
""").fetchdf()

# 结果已经是 Pandas DataFrame,可以直接用 Python 可视化
import matplotlib.pyplot as plt
result.plot.bar(x='region', y='total_revenue')
plt.show()

2. 命令行直接处理

# 安装 DuckDB CLI
curl -fsSL https://install.duckdb.org | sh

# 一行命令汇总 Excel
duckdb -c "
LOAD excel;
SELECT region, SUM(revenue) FROM 'sales.xlsx' GROUP BY region;
"

# 一行命令转换 Excel → Parquet
duckdb -c "
LOAD excel;
COPY (SELECT * FROM 'data.xlsx') TO 'data.parquet' (FORMAT parquet);
"

3. 定时任务自动化

# crontab -e
# 每周一早 8:00 自动汇总 Excel 报表
0 8 * * 1 cd /home/reports && duckdb -c "
LOAD excel;
COPY (
    SELECT region, SUM(revenue) AS total
    FROM read_csv('区域_*.xlsx', auto_detect=true)
    GROUP BY region
) TO 'weekly_summary.xlsx' (FORMAT excel);
"

七、变现建议

掌握了 DuckDB + Excel 的处理能力,你可以通过以下方式变现:

💰 方案 1:Excel 报表自动化服务(月付 299-999 元)

中小公司(尤其财务、运营部门)每周都在手工汇总 Excel。你可以:

  • 帮客户搭建 DuckDB 自动化报表管道
  • 客户每周发送 Excel 到指定文件夹 → DuckDB 自动汇总 → 输出整洁报表
  • 定价:月付 299 元(基本版)/ 699 元(含跨系统整合)/ 999 元(含可视化看板)
  • 获客渠道:知乎/小红书分享「Excel 自动化」教程 → 私信转化

💰 方案 2:Excel → 数据仓库迁移项目(单次 3000-8000 元)

很多公司想从 Excel 迁移到专业的数仓方案,但被 ETL 成本劝退。

  • 用 DuckDB 作为中间引擎:Excel → Parquet → DuckDB → BI 工具
  • 定价:3000 元(单次迁移)/ 8000 元(含培训 + 自动化管道)
  • 目标客户:中小企业、创业公司、传统企业 IT 部门

💰 方案 3:SaaS 工具 - Excel 数据清洗平台

开发一个 SaaS 产品:

  • 用户上传 Excel → DuckDB 在云端处理 → 输出清理后的 CSV/Parquet/Excel
  • 支持去重、格式标准化、跨文件 JOIN、异常检测
  • 定价:免费试用 7 天 → 月付 199 元(200MB)/ 499 元(2GB)
  • 技术栈:DuckDB(计算引擎)+ Streamlit/Gradio(前端)+ 简单的支付集成

💰 方案 4:企业内训课程

很多数据分析师想学 DuckDB 但不知道从哪入手。

  • 课程名:「DuckDB 数据处理实战:从 Excel 到数据仓库」
  • 内容:Excel 处理 + 跨库 JOIN + 性能优化 + 实际案例
  • 定价:线上录播课 299 元 / 企业内训 5000-10000 元/天
  • 平台:知乎/小鹅通/知识星球

💰 方案 5:付费内容与模板

  • DuckDB + Excel 自动化模板(SQL 脚本 + 定时任务配置)
  • 定价:99 元/套
  • 内容:10 个常用场景的即用型 SQL 脚本
  • 分发:GitHub Sponsors / Gumroad / 知识星球

八、一句话总结

DuckDB excel 扩展让你用 SQL 直接读写 .xlsx 文件——10 个文件 10 秒搞定,内存省 40 倍,代码省 90%。从 Pandas 切换到 DuckDB 处理 Excel,是 2026 年数据分析师性价比最高的技能升级。

立即安装试试:

# macOS / Linux
curl -fsSL https://install.duckdb.org | sh

# 然后打开 DuckDB CLI
duckdb
# 在 CLI 中执行
INSTALL excel;
LOAD excel;
SELECT * FROM '你的文件.xlsx';

订阅 DuckDB Lab (duckdblab.org),每周获取 DuckDB 实战教程、性能优化技巧和变现方案。