问题
如何最好地解析/访问/提取作为二进制数据存储在 SQL 2005 字段中的“excel 文件”数据?
(因此所有数据最终都可以存储在其他表的其他字段中。)
背景
基本上,我们的客户需要来自其用户的大量详细数据。不幸的是,我们的客户不能要求他们的用户进行任何类型的数据库导出。所以我们的客户必须为他们的用户提供某种 UI 来输入数据。我们的客户认为所有用户都可以接受的 UI 非常出色,因为它具有相当强大的 UI。所以考虑到所有这些,我们的客户需要自动解析这些数据并将其存储在他们的数据库中。
我们试图让我们的客户相信用户只会这样做一次,然后坚持使用数据库导出!但客户不能要求其用户的数据库导出。
- 我们的客户要求我们解析一个 excel 文件
- 客户的用户使用 excel 作为“最佳”用户界面来输入所有需要的数据
- 为用户提供了必须填写的空白 Excel 模板
- 这些模板具有固定数量的唯一命名选项卡
- 这些模板有许多必须完成的固定区域(单元格)
- 这些模板还有一些区域,用户可以在其中插入多达数千个格式相同的行
- 完成后,用户通过标准 html 文件上传提交 excel 文件
- 我们的客户将此文件原始存储到他们的 SQL 数据库中
给定
- 标准 excel (".xls") 文件(本机格式,不是逗号或制表符分隔)
- 文件原始存储在
varbinary(max)
SQL 2005 字段中 - excel 文件数据在行之间不一定是“统一的”——也就是说,我们不能假设一列都是相同的数据类型(例如,可能有行标题、列标题、空单元格、不同的“格式”, ...)
要求
- 代码完全在 SQL 2005 中(存储过程,SSIS?)
- 能够访问任何工作表(选项卡)上的值
- 能够访问任何单元格中的值(无需公式数据或取消引用)
- 单元格值不能假设在行之间是“一致的”——也就是说,我们不能只假设一列都是相同的数据类型(例如,可能有行标题、列标题、空单元格、公式、不同的“格式”,...)
喜好
- 没有文件系统访问权限(没有写入临时 .xls 文件)
- 以定义的格式检索值(例如,实际日期值而不是像 39876 这样的原始数字)