如何使用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
相关产品推荐
相关产品推荐

