Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
SSIS Integration Runtime i Azure Data Factory
Integration Services tillhandahåller Excel-anslutningshanteraren, Excel-källkod och Excel-destination för att arbeta med data lagrade i kalkylblad i Microsoft Excel-filformat. De tekniker som beskrivs i detta ämne använder Script-uppgiften för att hämta information om tillgängliga Excel-databaser (arbetsboksfiler) och tabeller (arbetsblad och namngivna intervall).
Important
Detaljerad information om hur du ansluter till Excel-filer och om begränsningar och kända problem med att läsa in data från eller till Excel-filer finns i Läsa in data från eller till Excel med služba SSIS (SSIS).
Tip
Om du vill skapa en uppgift som du kan återanvända i flera paket, överväg att använda koden i detta Script-uppgiftsexempel som utgångspunkt för en anpassad uppgift. Mer information finns i Utveckla en anpassad uppgift.
Konfigurera ett paket för att testa proverna
Du kan konfigurera ett enda paket för att testa alla prover i detta ämne. Proverna använder många av samma paketvariabler och samma .NET Framework-klasser.
För att konfigurera ett paket för användning med exemplen i detta ämne
Skapa ett nytt Integration Services-projekt i SQL Server Data Tools (SSDT) och öppna standardpaketet för redigering.
Variabler Öppna fönstret Variabler och definiera följande variabler :
ExcelFile, av typen String. Ange hela sökvägen och filnamnet till en befintlig Excel-arbetsbok.ExcelTable, av typen String. Ange namnet på ett befintligt arbetsblad eller ett namngivet intervall i arbetsboken som är namngiven i variabelns värdeExcelFile. Det här värdet är skiftlägeskänsligt.ExcelFileExists, av typen Boolesk.ExcelTableExists, av typen Boolesk.ExcelFolder, av typen String. Ange hela sökvägen för en mapp som innehåller minst en Excel-arbetsbok.ExcelFiles, av typen Objekt.ExcelTables, av typen Objekt.
Importutdrag. De flesta kodexempel kräver att du importerar en eller båda av följande .NET Framework-namnrymder högst upp i din skriptfil:
System.IO, för filsystemoperationer.
System.Data.OleDb, för att öppna Excel-filer som datakällor.
Referenser. De kodexempel som läser schemainformation från Excel-filer kräver en ytterligare referens i skriptprojektet till System.XML-namnrymden.
Ställ in standardskriptspråket för Skriptkomponenten genom att använda alternativet Skriptspråk på sidan Allmänt i dialogrutan Alternativ . Mer information finns på sidan Allmänt.
Exempel 1 Beskrivning: Kontrollera om en Excel-fil finns
Detta exempel avgör om Excel-arbetsboksfilen som anges i variabeln ExcelFile existerar, och sätter sedan det booleska värdet för variabeln ExcelFileExists till resultatet. Du kan använda detta booleska värde för att förgrena sig i paketets arbetsflöde.
För att konfigurera detta exempel på Script Task
Lägg till en ny Script-uppgift i paketet och ändra dess namn till ExcelFileExists.
I Script Task Editor, på fliken Script , klicka på ReadOnlyVariables och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelFile.
-or-
Klicka på ellipsisknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler , välj ExcelFile-variabeln .
Klicka på ReadWriteVariables och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelFileExists.
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler väljer du variabeln ExcelFileExists .
Klicka på Redigera skript för att öppna skriptredigeraren.
Lägg till en Imports-sats för namnrymden System.IO högst upp i skriptfilen.
Lägg till följande kod.
Exempel 1 Kod
Public Class ScriptMain
Public Sub Main()
Dim fileToTest As String
fileToTest = Dts.Variables("ExcelFile").Value.ToString
If File.Exists(fileToTest) Then
Dts.Variables("ExcelFileExists").Value = True
Else
Dts.Variables("ExcelFileExists").Value = False
End If
Dts.TaskResult = ScriptResults.Success
End Sub
End Class
public class ScriptMain
{
public void Main()
{
string fileToTest;
fileToTest = Dts.Variables["ExcelFile"].Value.ToString();
if (File.Exists(fileToTest))
{
Dts.Variables["ExcelFileExists"].Value = true;
}
else
{
Dts.Variables["ExcelFileExists"].Value = false;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
}
Exempel 2 Beskrivning: kontrollera om en Excel-tabell finns
Detta exempel avgör om Excel-arbetsbladet eller det namngivna intervallet som anges i variabeln ExcelTable finns i Excel-arbetsboksfilen som anges i variabelnExcelFile, och sätter sedan det booleska värdet för variabeln ExcelTableExists till resultatet. Du kan använda detta booleska värde för att förgrena sig i paketets arbetsflöde.
För att konfigurera detta exempel på Script Task
Lägg till en ny Script-uppgift i paketet och ändra dess namn till ExcelTableExists.
I Script Task Editor, på fliken Script , klicka på ReadOnlyVariables och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelTable och ExcelFile separerade efter kommatecken.
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler välj variablerna ExcelTable och ExcelFile .
Klicka på ReadWriteVariables och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelTableExists.
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler välj variabeln ExcelTableExists .
Klicka på Redigera skript för att öppna skriptredigeraren.
Lägg till en referens till System.XML-assembleren i skriptprojektet.
Lägg till Imports-satser för System.IO och System.Data.OleDb-namnrymder högst upp i skriptfilen.
Lägg till följande kod.
Exempel 2 Kod
Public Class ScriptMain
Public Sub Main()
Dim fileToTest As String
Dim tableToTest As String
Dim connectionString As String
Dim excelConnection As OleDbConnection
Dim excelTables As DataTable
Dim excelTable As DataRow
Dim currentTable As String
fileToTest = Dts.Variables("ExcelFile").Value.ToString
tableToTest = Dts.Variables("ExcelTable").Value.ToString
Dts.Variables("ExcelTableExists").Value = False
If File.Exists(fileToTest) Then
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & fileToTest & _
";Extended Properties=Excel 12.0"
excelConnection = New OleDbConnection(connectionString)
excelConnection.Open()
excelTables = excelConnection.GetSchema("Tables")
For Each excelTable In excelTables.Rows
currentTable = excelTable.Item("TABLE_NAME").ToString
If currentTable = tableToTest Then
Dts.Variables("ExcelTableExists").Value = True
End If
Next
End If
Dts.TaskResult = ScriptResults.Success
End Sub
End Class
public class ScriptMain
{
public void Main()
{
string fileToTest;
string tableToTest;
string connectionString;
OleDbConnection excelConnection;
DataTable excelTables;
string currentTable;
fileToTest = Dts.Variables["ExcelFile"].Value.ToString();
tableToTest = Dts.Variables["ExcelTable"].Value.ToString();
Dts.Variables["ExcelTableExists"].Value = false;
if (File.Exists(fileToTest))
{
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + fileToTest + ";Extended Properties=Excel 12.0";
excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();
excelTables = excelConnection.GetSchema("Tables");
foreach (DataRow excelTable in excelTables.Rows)
{
currentTable = excelTable["TABLE_NAME"].ToString();
if (currentTable == tableToTest)
{
Dts.Variables["ExcelTableExists"].Value = true;
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
}
Exempel 3 Beskrivning: Hämta en lista över Excel-filer i en mapp
Detta exempel fyller en array med listan över Excel-filer som finns i mappen som anges i variabelns värdeExcelFolder, och kopierar sedan arrayen till variabelnExcelFiles. Du kan använda Foreach from Variable enumerator för att iterera över filerna i arrayen.
För att konfigurera detta exempel på Script Task
Lägg till en ny Script-uppgift i paketet och ändra dess namn till GetExcelFiles.
Öppna Script Task Editor, klicka på ReadOnlyVariables under fliken Script och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelFolder
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler , välj variabeln ExcelFolder.
Klicka på ReadWriteVariables och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelFiles.
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler , välj variabeln ExcelFiles.
Klicka på Redigera skript för att öppna skriptredigeraren.
Lägg till en Imports-sats för namnrymden System.IO högst upp i skriptfilen.
Lägg till följande kod.
Exempel 3 Kod
Public Class ScriptMain
Public Sub Main()
Const FILE_PATTERN As String = "*.xlsx"
Dim excelFolder As String
Dim excelFiles As String()
excelFolder = Dts.Variables("ExcelFolder").Value.ToString
excelFiles = Directory.GetFiles(excelFolder, FILE_PATTERN)
Dts.Variables("ExcelFiles").Value = excelFiles
Dts.TaskResult = ScriptResults.Success
End Sub
End Class
public class ScriptMain
{
public void Main()
{
const string FILE_PATTERN = "*.xlsx";
string excelFolder;
string[] excelFiles;
excelFolder = Dts.Variables["ExcelFolder"].Value.ToString();
excelFiles = Directory.GetFiles(excelFolder, FILE_PATTERN);
Dts.Variables["ExcelFiles"].Value = excelFiles;
Dts.TaskResult = (int)ScriptResults.Success;
}
}
Alternativ lösning
Istället för att använda en Script-uppgift för att samla en lista med Excel-filer i en array, kan du också använda ForEach File enumerator för att iterera över alla Excel-filer i en mapp. För mer information, se Loop through Excel Files and Tables genom att använda en Foreach Loop Container.
Exempel 4 Beskrivning: Hämta en lista över tabeller i en Excel-fil
Detta exempel fyller en array med listan över arbetsblad och namngivna intervall som finns i Excel-arbetsboksfilen specificerad av variabelns värdeExcelFile, och kopierar sedan arrayen till variabelnExcelTables. Du kan använda Foreach från variabeluppräknaren för att iterera över tabellerna i arrayen.
Note
Listan över tabeller i en Excel-arbetsbok inkluderar både arbetsblad (som har suffixet $) och namngivna intervall. Om du måste filtrera listan för endast arbetsblad eller namngivna intervall kan du behöva lägga till ytterligare kod för detta ändamål.
För att konfigurera detta exempel på Script Task
Lägg till en ny Script-uppgift i paketet och ändra dess namn till GetExcelTables.
Öppna Script Task Editor, klicka på ReadOnlyVariables under fliken Script och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelFile.
-or-
Klicka på ellipsisknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler , välj ExcelFile-variabeln.
Klicka på ReadWriteVariables och ange egenskapsvärdet med en av följande metoder:
Skriv ExcelTables.
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler , välj ExcelTablesvariable.
Klicka på Redigera skript för att öppna skriptredigeraren.
Lägg till en referens till System.XML-namnrymden i skriptprojektet.
Lägg till ett Imports-sats för System.Data.OleDb-namnrymden högst upp i skriptfilen.
Lägg till följande kod.
Exempel 4 Kod
Public Class ScriptMain
Public Sub Main()
Dim excelFile As String
Dim connectionString As String
Dim excelConnection As OleDbConnection
Dim tablesInFile As DataTable
Dim tableCount As Integer = 0
Dim tableInFile As DataRow
Dim currentTable As String
Dim tableIndex As Integer = 0
Dim excelTables As String()
excelFile = Dts.Variables("ExcelFile").Value.ToString
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & excelFile & _
";Extended Properties=Excel 12.0"
excelConnection = New OleDbConnection(connectionString)
excelConnection.Open()
tablesInFile = excelConnection.GetSchema("Tables")
tableCount = tablesInFile.Rows.Count
ReDim excelTables(tableCount - 1)
For Each tableInFile In tablesInFile.Rows
currentTable = tableInFile.Item("TABLE_NAME").ToString
excelTables(tableIndex) = currentTable
tableIndex += 1
Next
Dts.Variables("ExcelTables").Value = excelTables
Dts.TaskResult = ScriptResults.Success
End Sub
End Class
public class ScriptMain
{
public void Main()
{
string excelFile;
string connectionString;
OleDbConnection excelConnection;
DataTable tablesInFile;
int tableCount = 0;
string currentTable;
int tableIndex = 0;
string[] excelTables = new string[5];
excelFile = Dts.Variables["ExcelFile"].Value.ToString();
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + excelFile + ";Extended Properties=Excel 12.0";
excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();
tablesInFile = excelConnection.GetSchema("Tables");
tableCount = tablesInFile.Rows.Count;
foreach (DataRow tableInFile in tablesInFile.Rows)
{
currentTable = tableInFile["TABLE_NAME"].ToString();
excelTables[tableIndex] = currentTable;
tableIndex += 1;
}
Dts.Variables["ExcelTables"].Value = excelTables;
Dts.TaskResult = (int)ScriptResults.Success;
}
}
Alternativ lösning
Istället för att använda en Script-uppgift för att samla en lista med Excel-tabeller i en array, kan du också använda ForEach ADONET Schema Rowset Enumerator för att iterera över alla tabeller (det vill säga arbetsblad och namngivna intervall) i en Excel-arbetsbokfil. För mer information, se Loop through Excel Files and Tables genom att använda en Foreach Loop Container.
Visning av provernas resultat
Om du har konfigurerat varje exempel i detta ämne i samma paket kan du koppla alla Script-uppgifter till en extra Script-uppgift som visar utdata från alla exempel.
För att konfigurera en skriptuppgift som visar utdata från exemplen i detta ämne
Lägg till en ny Script-uppgift i paketet och ändra dess namn till DisplayResults.
Koppla ihop var och en av de fyra exempel-Script-uppgifterna med varandra, så att varje uppgift körs efter att föregående uppgift slutförts framgångsrikt, och koppla den fjärde exempeluppgiften till DisplayResults-uppgiften .
Öppna DisplayResults-uppgiften i skriptets uppgiftsredigerare.
På fliken Script , klicka på ReadOnlyVariables och använd en av följande metoder för att lägga till alla sju variabler som listas i Configuring a Package to Test the Samples:
Skriv in namnet på varje variabel separerad med kommatecken.
-or-
Klicka på ellipsknappen (...) bredvid egenskapsfältet, och i dialogrutan Välj variabler , välj variablerna.
Klicka på Redigera skript för att öppna skriptredigeraren.
Add Imports-satser för Microsoft. VisualBasic och System.Windows. Forms-namnrymder högst upp i skriptfilen.
Lägg till följande kod.
Kör paketet och granska resultaten som visas i en meddelanderuta.
Kod för att visa resultaten
Public Class ScriptMain
Public Sub Main()
Const EOL As String = ControlChars.CrLf
Dim results As String
Dim filesInFolder As String()
Dim fileInFolder As String
Dim tablesInFile As String()
Dim tableInFile As String
results = _
"Final values of variables:" & EOL & _
"ExcelFile: " & Dts.Variables("ExcelFile").Value.ToString & EOL & _
"ExcelFileExists: " & Dts.Variables("ExcelFileExists").Value.ToString & EOL & _
"ExcelTable: " & Dts.Variables("ExcelTable").Value.ToString & EOL & _
"ExcelTableExists: " & Dts.Variables("ExcelTableExists").Value.ToString & EOL & _
"ExcelFolder: " & Dts.Variables("ExcelFolder").Value.ToString & EOL & _
EOL
results &= "Excel files in folder: " & EOL
filesInFolder = DirectCast(Dts.Variables("ExcelFiles").Value, String())
For Each fileInFolder In filesInFolder
results &= " " & fileInFolder & EOL
Next
results &= EOL
results &= "Excel tables in file: " & EOL
tablesInFile = DirectCast(Dts.Variables("ExcelTables").Value, String())
For Each tableInFile In tablesInFile
results &= " " & tableInFile & EOL
Next
MessageBox.Show(results, "Results", MessageBoxButtons.OK, MessageBoxIcon.Information)
Dts.TaskResult = ScriptResults.Success
End Sub
End Class
public class ScriptMain
{
public void Main()
{
const string EOL = "\r";
string results;
string[] filesInFolder;
//string fileInFolder;
string[] tablesInFile;
//string tableInFile;
results = "Final values of variables:" + EOL + "ExcelFile: " + Dts.Variables["ExcelFile"].Value.ToString() + EOL + "ExcelFileExists: " + Dts.Variables["ExcelFileExists"].Value.ToString() + EOL + "ExcelTable: " + Dts.Variables["ExcelTable"].Value.ToString() + EOL + "ExcelTableExists: " + Dts.Variables["ExcelTableExists"].Value.ToString() + EOL + "ExcelFolder: " + Dts.Variables["ExcelFolder"].Value.ToString() + EOL + EOL;
results += "Excel files in folder: " + EOL;
filesInFolder = (string[])(Dts.Variables["ExcelFiles"].Value);
foreach (string fileInFolder in filesInFolder)
{
results += " " + fileInFolder + EOL;
}
results += EOL;
results += "Excel tables in file: " + EOL;
tablesInFile = (string[])(Dts.Variables["ExcelTables"].Value);
foreach (string tableInFile in tablesInFile)
{
results += " " + tableInFile + EOL;
}
MessageBox.Show(results, "Results", MessageBoxButtons.OK, MessageBoxIcon.Information);
Dts.TaskResult = (int)ScriptResults.Success;
}
}