1

我有一个 excel 工作表,它有大约 200 行和大约 200 多列。我需要取消透视此 excel 表并将其插入到 sql server 表中。我正在使用第三方 excel api,它将 excel 工作表转换为 ADO .Net 数据表。

原始数据表 A 在此处输入图像描述

对于 Unpivot 操作,我正在遍历原始数据表行和列,并将值分配给另一个数据表,该数据表已根据

数据表 B 未透视 在此处输入图像描述

填充新的 DataTable 后,我将在数据表上使用 SQlBulkCopy() 并将所有记录保存到 SQLServer 表中。

我用于 Un-Pivot 操作的代码

//excelExport is the DataTable which stores the entire excel workSheet

DataTable newDatatable = new DataTable();   //For Un-Pivoting
newDatatable .Columns.Add(new DataColumn("EconomyID"));
newDatatable .Columns.Add(new DataColumn("SystemLanguage"));
newDatatable .Columns.Add(new DataColumn("VariableName"));
newDatatable .Columns.Add(new DataColumn("VariableValue"));
foreach (DataRow dr in excelExport.Rows)     //excelExport is the original datatable      
{
int colCount = 0;
       foreach (DataColumn dc in excelExport.Columns)
       {                    
          if (colCount >= 2)
          {
           DataRow dr2 = newDatatable.NewRow();                                           
           dr2["Economy"] = dr[1].ToString();
           dr2["SystemLanguageID"] = dr[2].ToString();
           dr2["VariableName"] = dc.ColumnName;
           dr2["VariableValue"] = dr[dc].ToString();
           newDatatable.Rows.Add(dr2);
          }
         colCount++;
       }
 } 

现在的问题是因为我的原始数据表 A 有 200 多列(和 200 行)。遍历每一行并将值分配给另一个 newDatatable 需要 10 秒。所以整个操作需要 200 行 * 10 秒......基本上永远(取决于 excel/datatable 中的列);只是为了创建 newDatatable。有没有更有效的方法来处理这个 Un-pivot 操作。我知道我们已经为 excel 到 sqlserver 导入操作构建了 SSIS 包,但我们的要求是客户端应该能够将 excel 上传到系统中,并且该过程必须是实时的。有什么建议么?

4

2 回答 2

0

对于 200 列,按列查找索引可能是罪魁祸首。您可以将查找更改为按列号而不是字符串名称:

   foreach (DataColumn dc in excelExport.Columns)
   {                    
      if (colCount >= 2)
      {
       DataRow dr2 = newDatatable.NewRow();                                           
       dr2[0] = dr[1].ToString();
       dr2[1] = dr[2].ToString();
       dr2[2] = dc.ColumnName;
       dr2[3] = dr[colCount].ToString();
       newDatatable.Rows.Add(dr2);
      }
     colCount++;
   }

虽然这只是猜测。我会投资一个好的分析工具来测量过程缓慢的地方并首先修复最慢的部分。

于 2013-10-18T15:36:34.147 回答
0

建造一个新DataTable的结构比使用一个便宜的结构更昂贵,比如Tuples。

var tuples = new List<Tuple<string, string, string, object>>();
foreach (DataRow dr in excelExport.Rows)
{
    int colCount = 0;
    foreach (DataColumn dc in excelExport.Columns)
    {                    
        if (colCount >= 2)
        {
            tuples.Add(Tuple.Create(dr[1],
                                    dr[2],
                                    dc.ColumnName,
                                    (object)dr[colCount])
                                   );
        }
        colCount++;
    }
}

您也可以跳过ToString()调用,因为Tuple.Create将使用类型推断来创建正确的元组。object如果所有值恰好具有相同的数据类型,则最后一项可能具有显式类型(不是),否则您需要强制转换(object)

于 2013-10-18T19:55:57.397 回答