求助:如何用T-SQL在SSMS中解析XLSX解压后的sheet1.xml
T-SQL解析XLSX解压后的sheet1.xml示例
XLSX解压得到的sheet1.xml包含默认命名空间,这是导致你解析返回空数据的核心原因,以下是完整的解析方案:
基础解析(单元格直接存储值)
先声明XML命名空间,再定位到工作表数据行和单元格,提取内容:
-- 声明sheet1.xml的默认命名空间 WITH XMLNAMESPACES (DEFAULT 'http://schemas.openxmlformats.org/spreadsheetml/2006/main') SELECT 行号 = Row.value('@r', 'INT'), 单元格标识 = Cell.value('@r', 'NVARCHAR(10)'), -- 如A1、B2格式 单元格值 = Cell.value('v[1]', 'NVARCHAR(MAX)') FROM XMLTable -- 遍历所有数据行 CROSS APPLY XMLData.nodes('/worksheet/sheetData/row') AS 行集(Row) -- 遍历当前行的所有单元格 CROSS APPLY Row.nodes('c') AS 单元格集(Cell);
处理共享字符串(单元格标记t="s")
如果单元格属性t="s",说明值存储在sharedStrings.xml中(解压XLSX时会同时生成该文件),需关联解析:
- 先导入
sharedStrings.xml到数据库:
CREATE TABLE SharedStringsTable (XMLDATA XML); INSERT INTO SharedStringsTable(XMLData) SELECT CONVERT(XML,BulkColumn) FROM OPENROWSET(BULK, 'C:\sharedStrings.xml', SINGLE_BLOB) AS x;
- 关联解析共享字符串:
WITH XMLNAMESPACES (DEFAULT 'http://schemas.openxmlformats.org/spreadsheetml/2006/main') SELECT 行号 = Row.value('@r', 'INT'), 单元格标识 = Cell.value('@r', 'NVARCHAR(10)'), 单元格值 = CASE -- 共享字符串类型,从sharedStrings.xml匹配对应索引(注意索引从0开始) WHEN Cell.value('@t', 'NVARCHAR(10)') = 's' THEN (SELECT 字符串项.value('text()[1]', 'NVARCHAR(MAX)') FROM SharedStringsTable CROSS APPLY XMLData.nodes('/sst/si[position() = sql:column("共享字符串索引") + 1]') AS 字符串集合(字符串项)) -- 直接存储的值 ELSE Cell.value('v[1]', 'NVARCHAR(MAX)') END FROM XMLTable CROSS APPLY XMLData.nodes('/worksheet/sheetData/row') AS 行集(Row) CROSS APPLY Row.nodes('c') AS 单元格集(Cell) -- 提取共享字符串的索引值 CROSS APPLY (SELECT Cell.value('v[1]', 'INT') AS 共享字符串索引) AS 索引集;
注意事项
- 确保SQL Server服务账号对目标文件路径有读取权限,否则OPENROWSET会报错
- 若存在合并单元格、公式等特殊结构,需额外处理对应XML节点(如
mergeCells、f标签) - 若要提取表头,可添加
WHERE Row.value('@r', 'INT') = 1过滤第一行
内容的提问来源于stack exchange,提问作者Shenniko
相关产品推荐
相关产品推荐

