如何parsing存储在MS SQL 2005 varbinary中的excel(.xls)文件?
问题
如何最好的parsing/访问/提取“SQL文件”数据存储为一个SQL 2005字段中的二进制数据?
(所有的数据最终都可以存储在其他表的其他字段中)。
背景
基本上,我们的客户需要大量来自用户的详细数据。 不幸的是,我们的客户不能要求从他们的用户的任何种类的数据库导出。 所以我们的客户必须为用户提供某种用户界面来input数据。 我们的客户决定的用户界面可以被所有的用户接受,因为它具有相当强大的用户界面。 所有这一切,我们的客户需要parsing这些数据,并自动存储在他们的数据库。
我们试图说服我们的客户,用户将这样做一次,然后坚持数据库导出! 但客户不能要求数据库导出他们的用户。
- 我们的客户要求我们parsing一个excel文件
- 客户的用户正在使用excel作为“最佳”用户界面来input所有需要的数据
- 用户被赋予空白的Excel模板,他们必须填写
- 这些模板具有固定数量的唯一命名的选项卡
- 这些模板有一些必须完成的固定区域(单元)
- 这些模板也有一些区域,用户将插入多达数千个相同格式的行
- 完成后,Excel文件通过标准的HTMLfile upload从用户提交
- 我们的客户将这个文件原始存储到他们的SQL数据库
特定
- 一个标准的excel(“.xls”)文件(本地格式,不是逗号或制表符分隔)
- 文件原始存储在
varbinary(max)
SQL 2005字段中 - excel文件数据在行之间可能不一定是“一致的”,也就是说,我们不能假设一列是完全相同的数据types(例如,可能有行标题,列标题,空单元格,不同的“格式”), …)
要求
- 代码完全在SQL 2005(存储过程,SSIS?)
- 能够访问任何工作表上的值(选项卡)
- 能够访问任何单元格中的值(不需要公式数据或取消引用)
- 不能假定单元格的值在行之间是“一致的”,也就是说,我们不能假设一列是完全相同的数据types(例如,可能有行标题,列标题,空单元格,公式,不同的“格式“,…)
优先
- 没有文件系统访问(不写入临时.xls文件)
- 以定义的格式检索值(例如,实际date值而不是像39876那样的原始数字)
我的想法是,任何事情都可以做,但有一个代价。 在这种情况下,价格似乎太高了。
我没有一个经过testing的解决scheme,但我可以分享我将如何给我的第一次尝试这样的问题。
我的第一个方法是在SqlServer机器上安装excel,并使用excel API编写一些程序集来消费行上的文件,然后将它们作为汇编程序加载到Sql server上。
正如我所说,这只是一个想法,我没有细节,但我相信这里的其他人可以补充或批评我的想法。
但我真正的build议是重新考虑整个项目。 阅读存储在数据库表格的一行的单元格上的二进制文件的表格数据是没有意义的。
这看起来像一个“我不会从这里开始”的问题。
“在服务器上安装Excel并开始编码”的答案看起来是唯一的途径,但首先必须值得探索替代scheme:这将是痛苦的,昂贵的和耗时的。
我强烈地感觉到,我们正在寻找一个“要求”来解决错误的问题。
什么业务问题正在创造这种需求? 这是什么驱动? 尝试“ 五个人”作为探索历史的可能途径。
这听起来像是你试图将一个完整的数据库表存储在一个电子表格中,然后在一个表的字段中。 将数据存储在数据库表中开始并在需要时将其导出为XLS会不会更简单?
没有打开一个实例Excel和Excel解决工作表引用我不知道它是可行的。
你可以写varbinary到原始文件目的地吗? 然后使用Excel Source作为您的优先约束下一步的input。
我没有尝试过,但这就是我会尝试。
那么,整个设置似乎有点扭曲:-)其他人已经指出。
如果您确实无法更改需求和整个设置,那么您为什么不探索允许您读取和解释本机Excel(XLS)文件的组件(如Aspose.Cells或Syncfusion XlsIO ,本机.NET组件)。 我非常喜欢这两种方法之一,你应该能够将你的二进制Excel读入一个MemoryStream,然后将它们送入Excel读取组件之一,然后closures。
所以,用一点.NET开发和SQL CLR,我想这应该是可行的 – 不知道这是否是最好的方法,但它应该工作。