将DataTable中的Row复制到另一个具有不同列模式的行

时间:2014-01-02 23:39:41

标签: c# excel datatable formatting

我正在努力优化我从之前员工的代码库中分配的一些代码。除了代码非常好“spaghettified”之外,我确实遇到了一个我不确定如何正确优化的问题。

以下代码段不是精确复制,但应该很好地详细说明问题。

他从Excel spreasheet中获取一个DataTable并将行放入一个格式相同的DataTable中,以后更新数据库。这对我来说似乎是合乎逻辑的,然而,他复制数据的方式似乎令人费解,修改,维护或添加新格式是一种巨大的痛苦。

以下是我所看到的:

private void VendorFormatOne() 
{
    //dtSumbit is declared with it's column schema elsewhere
    for (int i = 0; i < dtFromExcelFile.Rows.Count; i++)
    {
        dtSubmit.Rows.Add(i);
        dtSubmit.Rows[i]["reference_no"] = dtFromExcelFile.Rows[i]["VENDOR REF"];
        dtSubmit.Rows[i]["customer_name"] = dtFromExcelFile.Rows[i]["END USER ID"];
        //etc etc etc
    }
}

对我而言,将列映射到不同的模式完全有点过分,但我想不出更优雅地执行此操作的方法。在实际的解决方案中,大约有20种方法,都使用dtFromExcelFile的不同格式,列列表要长得多。 dtSubmit的列模式保持不变。

我正在寻找一种方法来避免每次公司需要从供应商加载新文件时手动映射这些列。有没有办法更有效地做到这一点?我确定我在这里忽略了一些东西,但在SO或其他地方没有找到任何相关的答案。

3 个答案:

答案 0 :(得分:2)

这可能有些过分,但您可以定义一个XML文件,该文件描述哪个Excel列映射到哪个数据库字段,然后将其与每个新Excel文件一起输入。你想要一两个类来解析和使用该文件,也许还有另一个类用于根据XML文件验证Excel文件。

根据您组织的规模,这可能会给您额外的好处,即能够将那些繁琐的映射卸载给技能较低的人。但是,这是一个相当多的设置工作,如果这种情况只是节俭地发生,那么创建如此多的基础设施可能无法获得显着的投资回报。

或者,如果您使用的是MS SQL Server,这基本上就是为SSIS构建的,尽管根据我的经验,大多数程序员发现SSIS相当繁琐。

答案 1 :(得分:1)

我最初的意图只是作为评论,但用完了空间。这是回答Micah的回答和你的第一个评论。

  

这里最大的问题是XML映射的数量等于代码中手动映射的数量

  • 考虑构建一个小工具,给定一个带有两个的Excel文件 列,生成XML映射文件。现在你可以卸载了 将工作映射到供应商,实习生,或者确实有任何人 特定供应商项目的需求文档的副本。

  • 因为文件随后会在导入应用程序中加载或运行 无论如何,您可以更改映射而无需重新部署 应用

  • 过去曾多次使用过这种系统, 我可以告诉你:你很高兴非常很高兴你花时间去做 它 - 特别是第一次在部署后立即接到电话 沿着“oops”,我们需要为数据添加一个新列 我们已经给了你,我们意识到我们拼错了第19个 顺便说一句。“

  • 关于唯一可能出错的是数据类型 转换,但您可以将其构建到映射文件中(类型 from / to)并概括你的导入例程来执行 转换给你。

只是我的2c。

答案 2 :(得分:0)

前段时间我遇到了类似的问题,我将30多个表中的400多列映射到数据库中实际表中的大约60列。无论是使用架构还是编写自定义内容,我都面临同样的困境。

有很多重复,我最终编写了一个简单的帮助器类,其中包含几个重写的方法,这些方法基本上从import table中获取了一个列名并吐出了数据库列名。另外,对于列名,我构建了一个单独的格式类

public static class ColumnName
{
  public const string FirstName = "FirstName";
  public const string LastName = "LastName";
  ...
}

TableNames也是如此。

这使得维护表名和列名更加简单。此外,这处理了不同表中的重复列,确实避免了重复的代码。