如何使用SQL从含多表与注释的Excel工作表提取及拆分表格?
提取Excel工作表中的表格数据(含多结构表格场景)
一、提取单一表格(排除注释文本)
你的原始OPENROWSET语句会默认读取整个工作表,导致注释行混入结果。可以通过两种方式精准提取表格内容:
- 指定精确单元格范围
如果清楚表格的具体位置(比如从A2开始到C20结束),直接在工作表名后追加范围即可:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml; HDR=YES; Database=C:\your_file.xlsx;', 'SELECT * FROM [MySheet$A2:C20]');
- 注意
HDR=YES表示范围第一行是表头,若指定范围第一行是原始数据,改成HDR=NO,查询时用F1、F2这类默认列名。
- 筛选排除注释行
如果不确定精确范围,先读取全表再过滤掉注释和空行:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml; HDR=YES; Database=C:\your_file.xlsx;', '[MySheet$]') WHERE -- 排除全空行 COALESCE(客户名称, 订单金额, 下单日期) IS NOT NULL -- 排除带注释关键字的行(根据实际注释格式调整) AND 客户名称 NOT LIKE '//%' AND 客户名称 NOT LIKE '备注:%';
把示例中的列名换成你实际的表头字段即可。
二、提取同工作表中多个结构不同的表格
不需要先全导入再拆分,直接通过指定不同单元格范围就能单独提取每个表格,效率更高:
假设工作表内有两个独立表格:
- 表格1:A1:C10,表头在A1
- 表格2:E1:G15,表头在E1
分别查询的语句如下:
-- 提取表格1 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml; HDR=YES; Database=C:\your_file.xlsx;', 'SELECT * FROM [MySheet$A1:C10]'); -- 提取表格2 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml; HDR=YES; Database=C:\your_file.xlsx;', 'SELECT * FROM [MySheet$E1:G15]');
如果不知道精确范围,但能通过表头识别表格起始位置,也可以用子查询定位(相对繁琐,优先推荐范围指定):
比如表格2的表头是"订单ID",位于E列:
WITH full_data AS ( SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS row_num FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml; HDR=NO; Database=C:\your_file.xlsx;', '[MySheet$]') ) SELECT F5 AS 订单ID, F6 AS 商品名称, F7 AS 数量 FROM full_data WHERE row_num >= (SELECT MIN(row_num) FROM full_data WHERE F5 = '订单ID') AND COALESCE(F5, F6, F7) IS NOT NULL;
注意事项
- 确保安装了Microsoft Access Database Engine 2010 Redistributable(对应ACE.OLEDB.12.0驱动),64位系统要保证驱动位数和SQL Server位数匹配。
- 若工作表名含空格,要给名称加引号,比如
[My Sheet$A1:C10]。 - 无表头的表格需将
HDR设为NO,使用F1、F2等默认列名。
内容的提问来源于stack exchange,提问作者Tomas Vileikis
相关产品推荐
相关产品推荐

