【问题标题】:how can you parse an excel (.xls) file stored in a varbinary in MS SQL 2005?如何解析存储在 MS SQL 2005 中的 varbinary 中的 excel (.xls) 文件?
【发布时间】:2010-09-09 22:12:07
【问题描述】:

问题

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

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

背景

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

我们试图让我们的客户相信用户只会执行一次此操作,然后坚持使用数据库导出!但客户不能要求 db 导出他们的用户。

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

给定

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

要求

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

偏好

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

【问题讨论】:

  • 请注意,这个特定问题是基于我们客户的要求,即他们使用 excel 作为用户界面来向我们提供数据。然后他们使用标准的 html 文件上传将数据返回给我们。
  • 编辑问题可能比在评论中添加信息更好。因为不是每个人都会检查 cmets。从现在开始,尽量在问题中提供尽可能多的信息。
  • 更不用说它会给你另一个徽章。

标签: sql excel stored-procedures etl xls


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    产生这种需求的业务问题是什么?是什么驱动了它?尝试Five Whys 作为探索历史的一种可能方式。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 在这种情况下,excel 是我们的用户界面。我们有一个他们填写的预定义模板——他们可以向其中添加数千个“统一”行。并且客户(不会/不能将其保存为 .csv)使用标准 html 文件上传上传 .xls。
      【解决方案4】:

      您能否将 varbinary 写入原始文件目标?然后使用 Excel 源代码作为优先约束中下一步的输入。

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多