You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用DuckDB将含多工作表的Excel读取为单个DataFrame?

使用DuckDB读取Excel多工作表并合并为单个DataFrame

基于你已使用spatial扩展读取单个工作表的经验,以下两种方案可以实现多工作表的合并:

方案一:手动指定工作表合并(适合工作表数量少、名称明确的场景)

直接通过UNION ALL将指定工作表的数据拼接,st_read支持通过SHEET参数指定读取的工作表:

import duckdb
import polars as pl

# 建立DuckDB连接并加载spatial扩展
conn = duckdb.connect()
conn.execute("INSTALL spatial;")
conn.execute("LOAD spatial;")

# 合并三个工作表(假设表名为Sheet1、Sheet2、Sheet3)
merged_df = conn.execute("""
SELECT * FROM st_read('AccountNumber.xlsx', open_options = ['HEADERS=FORCE', 'SHEET=Sheet1'])
UNION ALL
SELECT * FROM st_read('AccountNumber.xlsx', open_options = ['HEADERS=FORCE', 'SHEET=Sheet2'])
UNION ALL
SELECT * FROM st_read('AccountNumber.xlsx', open_options = ['HEADERS=FORCE', 'SHEET=Sheet3'])
""").pl()

# 查看合并结果
merged_df
  • 若各工作表列名不完全一致,UNION ALL会自动对齐列名,缺失列将填充NULL;
  • 也可手动指定列名(如SELECT col1, col2 FROM ...)来避免结构歧义。

方案二:自动读取所有工作表并合并(适合工作表数量多、名称不确定的场景)

通过查询information_schema.tables获取Excel文件中的所有工作表名称,再动态遍历合并:

import duckdb
import polars as pl

conn = duckdb.connect()
conn.execute("INSTALL spatial;")
conn.execute("LOAD spatial;")

# 注册视图获取所有工作表名称
conn.execute("""
CREATE VIEW excel_sheets AS 
SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'main' AND table_name LIKE 'AccountNumber.xlsx%'
""")

# 自动合并所有工作表
merged_df = conn.execute("""
WITH sheet_list AS (SELECT table_name FROM excel_sheets)
SELECT * FROM sheet_list, st_read('AccountNumber.xlsx', open_options = ['HEADERS=FORCE', 'SHEET=' || table_name])
""").pl()

merged_df
  • 若需排除隐藏工作表,可在视图的WHERE条件中添加AND table_name NOT LIKE '%$%';
  • 若工作表数据结构差异较大,合并后可能出现大量NULL,建议先检查各表结构再做合并。

内容的提问来源于stack exchange,提问作者gastone dereck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:34:55