问题

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

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

背景

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

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

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

给定

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

要求

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

优先

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

===============>>#1 票数:3

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

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

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

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

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

===============>>#2 票数:2

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

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

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

是什么业务问题造成了这种需求? 是什么驱动的? 尝试“ 五个为什么”作为探索历史的一种可能方法。

===============>>#3 票数:1

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

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

===============>>#4 票数:1

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

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

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

===============>>#5 票数:1

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

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

  ask by just mike translate from so

未解决问题?本站智能推荐:

1回复

使用ETL和SQL将数字读取并写入.txt

我正在从.xls文件编写.txt。 我正在使用JasperETL读取excel并将数据插入MSSQL,然后写入.txt文件。 在excel文件中,我有一个看起来像20.000,00的数字(金额),但有时由于区域设置的原因,该数字在SQL中以20,000.00导入(分隔符-反转,变成。和。
1回复

如何从存储过程中调用具有输入参数的.dtsx文件?

如何从存储过程中调用具有输入参数的.dtsx包文件? 存储过程1->将要导出的文件列表作为逗号分隔值传递给excel。 输入变量将传递到SSIS包以将数据导出到excel。 如何处理从存储过程调用中具有输入参数的SSIS包?
1回复

使用SSIS中的参数作为OLE DB源执行存储过程

我想执行一个需要参数作为OLE DB源的存储过程,以便以后从SSIS中将其导出为Excel文件。 SP生成了一组我想导出到Excel文件的数据 这是我为SP运行的代码。 (像这样运行它会产生我想要的结果) 我不确定运行的格式是否正确。 这是设置的图片: 这
2回复

SSIS:如何在数据流任务中运行存储过程

我有一个执行此任务的数据流任务: 从OLE DB源,运行SQL命令以选择一些数据 查找到其他SQL DB源,检查数据是否已经存在 根据“查找匹配输出”与“查找不匹配输出”,使用不同的输入参数运行存储过程。 输入参数将基于#2的“可用查找列”结果 问题是如何运行
1回复

如何将具有可变列数的Excel中的数据持久保存到SQL Sserver数据库

我有一个应用程序,用户可以在其中多次将.xls/.xlsx文件上传到服务器。 但是没有限制。 电子表格中的列数。 每个xls/xlsx可以具有变量号。 列。 在某些情况下,这些xls / xlsx文件也可能没有列名。 这些文件基本上是大容量数据的转储,需要用于与某些主数据库进行匹配。
6回复

Excel中是否有类似合并的函数?

我需要用同一行的一组列(从左到右)中的第一个非空条目填充一个单元格-类似于SQL中的coalesce()。 在以下示例表中 我想在A行的每个单元格中放置一个单元格函数,这样我将得到: 我知道我可以使用一系列IF函数来做到这一点,但是在我的实际工作表中,我有30列可供选择,因
1回复

SSIS无法读取Excel文件中的列尾(Excel Connection Manager)

当SSIS无法读取excel文件中的列尾时,我遇到了一个问题,如下所示(预排序ID): 我试图通过编辑OpenRowSet for Excel Source(数据流)来弄清楚,但是它仍然无法正常工作。 我的临时解决方法是,单击每个excel文件上的“启用编辑”按钮
1回复

将具有不同架构的多个Excel文件加载到SQL Server

我大约有300百万个包含销售数据的Excel文件,但是模式不同(一个模式具有名为“ Product Name”的列,另一个模式仅具有“ Product” ),但是包含有关来自不同商店的销售的相同信息。 文件是由某些人手动生成的,因此也可能出现拼写错误。 有什么好的方法可以导入此数据,或者我必
1回复

逐步将数据从Excel文件(多张纸)传输到SQL(多张表)

拓蓝 我想将数据从Excel传输到SQL。 我的Excel工作表有20个不同的工作表,这些数据具有要复制到20个不同表中的数据。 我想创建一个作业以逐步执行此任务。 我的表具有依赖性,因此以特定顺序将数据复制到这些表非常重要。 我想在一份工作中有20个步骤。 任何有关如何
2回复

ssis从excel导出到sql,与列数无关

我找不到答案,我认为这很容易:) 使用SSIS,我想从excel导入到SQL表中,而与列数无关,我不在乎折衷式是否具有3或33列。 如何完成这样的事情:从exceldataset选择*到mytable中, 如果您不能使用OPENROWSET函数并执行SQL任务。