3

问题

如何最好地解析/访问/提取作为二进制数据存储在 SQL 2005 字段中的“excel 文件”数据?

(因此所有数据最终都可以存储在其他表的其他字段中。)

背景

基本上,我们的客户需要来自其用户的大量详细数据。不幸的是,我们的客户不能要求他们的用户进行任何类型的数据库导出。所以我们的客户必须为他们的用户提供某种 UI 来输入数据。我们的客户认为所有用户都可以接受的 UI 非常出色,因为它具有相当强大的 UI。所以考虑到所有这些,我们的客户需要自动解析这些数据并将其存储在他们的数据库中。

我们试图让我们的客户相信用户只会这样做一次,然后坚持使用数据库导出!但客户不能要求其用户的数据库导出。

  • 我们的客户要求我们解析一个 excel 文件
  • 客户的用户使用 excel 作为“最佳”用户界面来输入所有需要的数据
  • 为用户提供了必须填写的空白 Excel 模板
    • 这些模板具有固定数量的唯一命名选项卡
    • 这些模板有许多必须完成的固定区域(单元格)
    • 这些模板还有一些区域,用户可以在其中插入多达数千个格式相同的行
  • 完成后,用户通过标准 html 文件上传提交 excel 文件
  • 我们的客户将此文件原始存储到他们的 SQL 数据库中

给定

  • 标准 excel (".xls") 文件(本机格式,不是逗号或制表符分隔)
  • 文件原始存储在varbinary(max)SQL 2005 字段中
  • excel 文件数据在行之间不一定是“统一的”——也就是说,我们不能假设一列都是相同的数据类型(例如,可能有行标题、列标题、空单元格、不同的“格式”, ...)

要求

  • 代码完全在 SQL 2005 中(存储过程,SSIS?)
  • 能够访问任何工作表(选项卡)上的值
  • 能够访问任何单元格中的值(无需公式数据或取消引用)
  • 单元格值不能假设在行之间是“一致的”——也就是说,我们不能只假设一列都是相同的数据类型(例如,可能有行标题、列标题、空单元格、公式、不同的“格式”,...)

喜好

  • 没有文件系统访问权限(没有写入临时 .xls 文件)
  • 以定义的格式检索值(例如,实际日期值而不是像 39876 这样的原始数字)
4

5 回答 5

3

我的想法是,任何事情都可以做,但要付出代价。在这种特殊情况下,价格似乎太高了。

我没有经过测试的解决方案给你,但我可以分享我如何第一次尝试这样的问题。

我的第一种方法是在 SqlServer 机器上安装 excel 并编写一些程序集以使用 excel API 使用行上的文件,然后将它们作为程序集加载到 Sql server 上。

正如我所说,这只是一个想法,我没有细节,但我相信这里的其他人可以补充或批评我的想法。

但我真正的建议是重新考虑整个项目。读取存储在数据库表格行的单元格中的二进制文件的表格数据是没有意义的。

于 2008-09-17T03:40:48.500 回答
2

这看起来像是一个“我不会从这里开始”的问题。

“在服务器上安装 Excel 并开始编码”的答案看起来是唯一的途径,但它必须首先值得探索替代方案:这将是痛苦的、昂贵的和耗时的。

我强烈认为我们正在寻找一个“要求”,它是错误问题的答案。

什么业务问题正在创造这种需求?是什么驱动了它?尝试五个为什么作为探索历史的一种可能方式。

于 2008-09-17T10:12:57.760 回答
1

您可以将 varbinary 写入原始文件目标吗?然后使用 Excel Source 作为优先约束中下一步的输入。

我没有尝试过,但这就是我会尝试的。

于 2009-01-08T20:07:53.263 回答
1

听起来您正在尝试将整个数据库表存储在电子表格中,然后存储在单个表的字段中。将数据存储在数据库表中,然后在需要时将其导出为 XLS 不是更简单吗?

如果不打开实例 Excel 并让 Excel 解析工作表引用,我不确定它是否可行。

于 2008-09-17T03:21:04.133 回答
1

好吧,正如其他人已经指出的那样,整个设置似乎有点扭曲:-)。

如果您确实无法更改要求和整个设置:为什么不探索诸如Aspose.CellsSyncfusion XlsIO等原生 .NET 组件,它们允许您读取和解释原生 Excel (XLS) 文件。我对两者中的任何一个都非常满意,您应该能够将二进制 Excel 读入 MemoryStream,然后将其输入其中一个 Excel 读取组件,然后就可以了。

因此,通过一些 .NET 开发和 SQL CLR,我想这应该是可行的——不确定这是否是最好的方法,但它应该可以工作。

于 2009-02-18T17:06:52.613 回答