首页 > 解决方案 > 要求使用 excel 报告中的列数识别报告

问题描述

我有两个 excel 文件,我想将这些文件导入 SQL 临时表。

第一个excel文件:

 T1      T2      T3     T4  Total
 1,472   1,364   1,422  –   4,258 
-152.6  -152.6  -152.6  –   
 1,958   1,939   1,942  –   
-122.6  -123.7  -122.2  – 

第二个excel文件:

 T1       T2     T3     T4  T5       Total
 1,472   1,364   1,422  –   12.2     4,258 
-152.6  -152.6  -152.6  –   1000.12
 1,958   1,939   1,942  –   50.23
-122.6  -123.7  -122.2  –   185.25

SSIS中是否有任何方法可以根据列数识别文件?我需要根据列号识别报告。

标签: sql-serverexcelssisetl

解决方案


如果您需要导入具有不同架构的 excel,您有两种方法:

(1) SSIS方式:Script Task + 2个数据流任务

如果您只有两个结构,则可以按照以下步骤操作:

  1. System.Int32添加类型示例的变量:@[User::ColumnsCount]
  2. 添加类型变量System.String来存储文件路径示例:@[User::FilePath]
  3. 添加脚本任务并选择@[User::FilePath]为只读变量和@[User::ColumnsCount]读写变量
  4. 在脚本Task里面写一个类似的脚本:

    string FilePath = Dts.Variables["User::FilePath"].Value.toString();
    string ExcelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;
                            "Data Source='" + FilePath + 
                            "';Extended Properties=\"Excel 12.0;HDR=YES;\"";
    
    using (OleDbConnection OleDBCon = new OleDbConnection(ExcelConnectionString))
            {
            if (OleDBCon.State != ConnectionState.Open)
                OleDBCon.Open();
    
                using (OleDbCommand cmd = new OleDbCommand(strcommand, OleDBCon))
                {
                    DataTable dtTable = new DataTable("Table1");
    
    
                    cmd.CommandType = CommandType.Text;
                    //replace Sheet1$ with the sheet name if it is different
                    cmd.CommandText = "SELECT * FROM Sheet1$"
                    using (OleDbDataAdapter daGetDataFromSheet = new OleDbDataAdapter(cmd))
                    {
                        daGetDataFromSheet.FillSchema(dtTable, SchemaType.Source);
                        Dts.Variables["User::ColumnsCount"].Value = dt.Columns.Count;
                    }
    
                }
    
            }
    
  5. 为每个 Excel 结构添加两个数据流任务

  6. 将脚本任务链接到这些数据流任务中的每一个
  7. 单击每个优先约束(任务之间的链接)并将优先类型更改为表达式和约束,并为每种情况添加适当的表达式:

5列:

@[User::ColumnsCount] == 5

6列:

@[User::ColumnsCount] == 6
  1. Delay Validation两个数据流任务的属性设置为 True

TL DR: 如果您只有两个结构,您可以添加两个数据流任务(每个结构一个),然后您可以使用脚本任务来识别列数并根据列数执行适当的数据流任务(使用优先约束表达式)。

(2) C#方法:SchemaMapper类库

最近我在 Github 上开始了一个新项目,这是一个使用 C# 开发的类库。您可以使用它使用架构映射方法将表格数据从 excel、word、powerpoint、text、csv、html、json 和 xml 导入到具有不同架构定义的 SQL Server 表中。在以下位置查看:

您可以按照此 Wiki 页面获取分步指南:


推荐阅读