Bekerja dengan file Excel dengan Tugas Skrip
Berlaku untuk: SQL Server SSIS Integration Runtime di Azure Data Factory
Integration Services menyediakan pengelola koneksi Excel, sumber Excel, dan tujuan Excel untuk bekerja dengan data yang disimpan dalam lembar bentang dalam format file Microsoft Excel. Teknik yang dijelaskan dalam topik ini menggunakan tugas Skrip untuk mendapatkan informasi tentang database Excel yang tersedia (file buku kerja) dan tabel (lembar kerja dan rentang bernama).
Penting
Untuk informasi mendetail tentang menyambungkan ke file Excel, dan tentang batasan dan masalah yang diketahui untuk memuat data dari atau ke file Excel, lihat Memuat data dari atau ke Excel dengan SQL Server Integration Services (SSIS).
Tip
Jika Anda ingin membuat tugas yang dapat Anda gunakan kembali di beberapa paket, pertimbangkan untuk menggunakan kode dalam sampel tugas Skrip ini sebagai titik awal untuk tugas kustom. Untuk informasi selengkapnya, lihat Mengembangkan Tugas Kustom.
Mengonfigurasi Paket untuk Menguji Sampel
Anda dapat mengonfigurasi satu paket untuk menguji semua sampel dalam topik ini. Sampel menggunakan banyak variabel paket yang sama dan kelas .NET Framework yang sama.
Untuk mengonfigurasi paket untuk digunakan dengan contoh dalam topik ini
Buat proyek Integration Services baru di SQL Server Data Tools (SSDT) dan buka paket default untuk pengeditan.
Variabel. Buka jendela Variabel dan tentukan variabel berikut:
ExcelFile
, dari jenis String. Masukkan jalur lengkap dan nama file ke buku kerja Excel yang sudah ada.ExcelTable
, dari jenis String. Masukkan nama lembar kerja yang sudah ada atau rentang bernama dalam buku kerja bernama dalam nilaiExcelFile
variabel. Nilai ini peka huruf besar/kecil.ExcelFileExists
, jenis Boolean.ExcelTableExists
, jenis Boolean.ExcelFolder
, dari jenis String. Masukkan jalur lengkap folder yang berisi setidaknya satu buku kerja Excel.ExcelFiles
, dari jenis Objek.ExcelTables
, dari jenis Objek.
Mengimpor pernyataan. Sebagian besar sampel kode mengharuskan Anda mengimpor satu atau kedua namespace .NET Framework berikut di bagian atas file skrip Anda:
System.IO, untuk operasi sistem file.
System.Data.OleDb, untuk membuka file Excel sebagai sumber data.
Referensi. Sampel kode yang membaca informasi skema dari file Excel memerlukan referensi tambahan dalam proyek skrip ke namespace System.Xml .
Atur bahasa skrip default untuk komponen Skrip dengan menggunakan opsi bahasa Skrip pada halaman Umum kotak dialog Opsi . Untuk informasi selengkapnya, lihat Halaman Umum.
Contoh 1 Deskripsi: Periksa Apakah File Excel Ada
Contoh ini menentukan apakah file buku kerja Excel yang ditentukan dalam ExcelFile
variabel ada, lalu mengatur nilai Boolean variabel ExcelFileExists
ke hasilnya. Anda dapat menggunakan nilai Boolean ini untuk pencabangan dalam alur kerja paket.
Untuk mengonfigurasi contoh Tugas Skrip ini
Tambahkan tugas Skrip baru ke paket dan ubah namanya menjadi ExcelFileExists.
Di Editor Tugas Skrip, pada tab Skrip, klik ReadOnlyVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelFile.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelFile .
Klik ReadWriteVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelFileExists.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelFileExists .
Klik Edit Skrip untuk membuka editor skrip.
Tambahkan pernyataan Impor untuk namespace System.IO di bagian atas file skrip.
Tambahkan kode berikut.
Contoh 1 Kode
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;
}
}
Contoh 2 Deskripsi: Periksa Apakah Tabel Excel Ada
Contoh ini menentukan apakah lembar kerja Excel atau rentang bernama yang ditentukan dalam ExcelTable
variabel ada dalam file buku kerja Excel yang ditentukan dalam ExcelFile
variabel, lalu mengatur nilai Boolean variabel ExcelTableExists
ke hasil. Anda dapat menggunakan nilai Boolean ini untuk pencabangan dalam alur kerja paket.
Untuk mengonfigurasi contoh Tugas Skrip ini
Tambahkan tugas Skrip baru ke paket dan ubah namanya menjadi ExcelTableExists.
Di Editor Tugas Skrip, pada tab Skrip, klik ReadOnlyVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelTable dan ExcelFile yang dipisahkan oleh koma.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelTable dan ExcelFile .
Klik ReadWriteVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelTableExists.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelTableExists .
Klik Edit Skrip untuk membuka editor skrip.
Tambahkan referensi ke rakitan System.Xml dalam proyek skrip.
Tambahkan pernyataan Impor untuk namespace System.IO dan System.Data.OleDb di bagian atas file skrip.
Tambahkan kode berikut.
Contoh 2 Kode
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;
}
}
Contoh 3 Deskripsi: Mendapatkan Daftar File Excel dalam Folder
Contoh ini mengisi array dengan daftar file Excel yang ditemukan di folder yang ditentukan dalam nilai ExcelFolder
variabel, lalu menyalin array ke ExcelFiles
dalam variabel. Anda dapat menggunakan Foreach dari Enumerator variabel untuk melakukan iterasi pada file dalam array.
Untuk mengonfigurasi contoh Tugas Skrip ini
Tambahkan tugas Skrip baru ke paket dan ubah namanya menjadi GetExcelFiles.
Buka Editor Tugas Skrip, pada tab Skrip, klik ReadOnlyVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelFolder
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelFolder.
Klik ReadWriteVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelFiles.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelFiles.
Klik Edit Skrip untuk membuka editor skrip.
Tambahkan pernyataan Impor untuk namespace System.IO di bagian atas file skrip.
Tambahkan kode berikut.
Contoh 3 Kode
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;
}
}
Solusi Alternatif
Alih-alih menggunakan tugas Skrip untuk mengumpulkan daftar file Excel ke dalam array, Anda juga bisa menggunakan enumerator File ForEach untuk mengulangi semua file Excel dalam folder. Untuk informasi selengkapnya, lihat Mengulang File dan Tabel Excel dengan Menggunakan Kontainer Perulangan Foreach.
Contoh 4 Deskripsi: Mendapatkan Daftar Tabel dalam File Excel
Contoh ini mengisi array dengan daftar lembar kerja dan rentang bernama yang ditemukan dalam file buku kerja Excel yang ditentukan oleh nilai ExcelFile
variabel, lalu menyalin array ke dalam ExcelTables
variabel. Anda dapat menggunakan Foreach dari Enumerator Variabel untuk melakukan iterasi pada tabel dalam array.
Catatan
Daftar tabel dalam buku kerja Excel menyertakan kedua lembar kerja (yang memiliki akhiran $) dan rentang bernama. Jika Anda harus memfilter daftar hanya untuk lembar kerja atau hanya rentang bernama, Anda mungkin harus menambahkan kode tambahan untuk tujuan ini.
Untuk mengonfigurasi contoh Tugas Skrip ini
Tambahkan tugas Skrip baru ke paket dan ubah namanya menjadi GetExcelTables.
Buka Editor Tugas Skrip, pada tab Skrip, klik ReadOnlyVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelFile.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih variabel ExcelFile.
Klik ReadWriteVariables dan masukkan nilai properti menggunakan salah satu metode berikut:
Ketik ExcelTables.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , pilih ExcelTablesvariable.
Klik Edit Skrip untuk membuka editor skrip.
Tambahkan referensi ke namespace System.Xml dalam proyek skrip.
Tambahkan pernyataan Impor untuk namespace System.Data.OleDb di bagian atas file skrip.
Tambahkan kode berikut.
Contoh 4 Kode
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;
}
}
Solusi Alternatif
Alih-alih menggunakan tugas Skrip untuk mengumpulkan daftar tabel Excel ke dalam array, Anda juga bisa menggunakan ForEach ADO.NET Schema Rowset Enumerator untuk mengulangi semua tabel (yaitu, lembar kerja dan rentang bernama) dalam file buku kerja Excel. Untuk informasi selengkapnya, lihat Mengulang File dan Tabel Excel dengan Menggunakan Kontainer Perulangan Foreach.
Menampilkan Hasil Sampel
Jika Anda telah mengonfigurasi setiap contoh dalam topik ini dalam paket yang sama, Anda dapat menyambungkan semua tugas Skrip ke tugas Skrip tambahan yang menampilkan output dari semua contoh.
Untuk mengonfigurasi tugas Skrip untuk menampilkan output contoh dalam topik ini
Tambahkan tugas Skrip baru ke paket dan ubah namanya menjadi DisplayResults.
Sambungkan masing-masing dari empat contoh tugas Skrip satu sama lain, sehingga setiap tugas berjalan setelah tugas sebelumnya berhasil diselesaikan, dan sambungkan tugas contoh keempat ke tugas DisplayResults .
Buka tugas DisplayResults di Editor Tugas Skrip.
Pada tab Skrip, klik ReadOnlyVariables dan gunakan salah satu metode berikut untuk menambahkan ketujuh variabel yang tercantum dalam Mengonfigurasi Paket untuk Menguji Sampel:
Ketik nama setiap variabel yang dipisahkan oleh koma.
-atau-
Klik tombol elipsis (...) di samping bidang properti, dan dalam kotak dialog Pilih variabel , memilih variabel.
Klik Edit Skrip untuk membuka editor skrip.
Tambahkan pernyataan Impor untuk namespace Microsoft.VisualBasic dan System.Windows.Forms di bagian atas file skrip.
Tambahkan kode berikut.
Jalankan paket dan periksa hasil yang ditampilkan dalam kotak pesan.
Kode untuk Menampilkan Hasil
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;
}
}
Lihat Juga
Memuat data dari atau ke Excel dengan SQL Server Integration Services (SSIS)
Mengulangi File dan Tabel Excel dengan Menggunakan Kontainer Perulangan Foreach