如何解析存储在MS SQL 2005中varbinary中的excel(.xls)文件?

时间:2020-03-05 18:57:49  来源:igfitidea点击:

问题

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

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

背景

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

我们试图说服我们的客户,用户将只执行一次此操作,然后坚持执行db export!但是客户不能要求其用户进行数据库导出。

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

给定

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

要求

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

优先

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

解决方案

回答

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

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

回答

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

我没有适合经过测试的解决方案,但是我可以分享我如何尝试这种问题。

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

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

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

回答

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

"在服务器上安装Excel并开始编码"答案似乎是唯一的途径,但是首先必须值得探索替代方法:这将是痛苦,昂贵且费时的。

我强烈感觉到我们正在考虑"要求",这是对错误问题的答案。

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

回答

我们可以将varbinary写入Raw File Destination吗?然后,将Excel Source用作优先级约束中下一步的输入。

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

回答

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

如果我们真的不能更改需求和整个设置:为什么不浏览Aspose.Cells或者Syncfusion XlsIO之类的组件,即本机.NET组件,使我们可以阅读和解释本机Excel(XLS)文件。我很喜欢这两者之一,我们应该能够将二进制Excel读取到MemoryStream中,然后将其输入到那些Excel读取组件中,然后就可以使用了。

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