如何将三个不同的Excel文件加载到不同的表中

时间:2015-03-24 14:03:14

标签: sql ssis excel-2010 ssis-2012

我有三个Excel文件,每周更新一次名称,包括更新的Date.xlsx。 我需要使用SSIS包将这三个Excel文件加载到我的三个表中。 我还需要自动化,因为我必须为此安排工作。

如何自动选择特定Excel并加载到特定表。 例如

  1. workanalysis_21032015.xlsx
  2. analytics_21032015.xlsx
  3. googleprobes_21032015.xlsx
  4. 我需要将此Excel数据加载到三个不同的表中,因为这些Excel更新的新名称为(1.workanalysis_28032015.xlsx),特别是每周的文件夹。我需要选择工作分析并将数据转储到表中,其余两个相同。

2 个答案:

答案 0 :(得分:1)

为每个循环使用a。 正在为该实例处理的文件名将/可以存储在变量中,只占用文件名的字符串部分(您可以使用脚本任务)。将验证放在优先约束中(例如@var =" workanalysis")然后将其传递给所需的特定目的地。

答案 1 :(得分:0)

如果您想知道如何自动导入(SSIS包)Excel文件到SQL服务器,这里有一个很好的分步指南: https://www.simple-talk.com/sql/ssis/moving-data-from-excel-to-sql-server---10-steps-to-follow/

你必须做三次。复制粘贴是你的朋友:)

关于考虑日期和文件夹结构的逻辑,我建议编写一个C#脚本任务。这是一个糟糕的评论示例(抱歉,记得在挪威语和我不关心翻译所以我删除它们)的脚本,找到最新的xml文件的名称,该文件使用非常具体的命名约定,包括datatime,more和你一样在ftpserver上,然后将它写入名为User:newFile的SSIS变量。 xml文件的名称为:Something_YYYYMMDD.xml,因此是teI fileIsNew函数中的逻辑。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text;
using System.Globalization;

namespace ST_59d80f6857bc4a6197af798be478f308.csproj
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{

    #region VSTA generated code
    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    #endregion
    public string[] GetDirectory()
    {
        StringBuilder result = new StringBuilder();

        System.Net.FtpWebRequest requestDir = (FtpWebRequest)WebRequest.Create("ftp://someftpserver.com");
        requestDir.Method = WebRequestMethods.Ftp.ListDirectory;

        requestDir.Credentials = new System.Net.NetworkCredential("User", "password");
        FtpWebResponse responseDir = (FtpWebResponse)requestDir.GetResponse();
        StreamReader readerDir = new StreamReader(responseDir.GetResponseStream());

        string line = readerDir.ReadLine();
        while (line != null)
        {
            result.Append(line);
            result.Append("\n");
            line = readerDir.ReadLine();
        }

        result.Remove(result.ToString().LastIndexOf('\n'), 1);
        responseDir.Close();
        return result.ToString().Split('\n');
    }

    public bool fileIsNew(string file, string newestFile)
    {
        if (file.EndsWith(".xml", System.StringComparison.CurrentCultureIgnoreCase) && file.Length >= 11)
        {
            decimal test;
            if(decimal.TryParse(file.Substring(file.Length - 12, 8), out test))
            {
                if (Convert.ToInt32(file.Substring(file.Length - 12, 8)) > Convert.ToInt32(newestFile.Substring(newestFile.Length - 12, 8)))
                {
                    return true;
                }
                return false;
            }
            return false;
        }
        return false;
    }

    public void Main()
    {
        string newestFile = "19900101.xml"; 

        foreach (string file in GetDirectory())
        {
            if (fileIsNew(file, newestFile))
            {
                newestFile = file;
                // TEST!!!!
                // MessageBox.Show(newestFile);
            }

        }
        Dts.Variables["User::newFile"].Value = newestFile;

        Dts.TaskResult = (int)ScriptResults.Success;
    }
 }
}

我想你可能要做类似的事情:)