2010-12-14 11 views
7

Ho un foglio di calcolo che viene aggiornato da un altro server (fuori dal mio controllo) e ho bisogno di automatizzare il trasferimento di tali dati in SQL 2005. I dati sono sempre la prima pagina del foglio di calcolo. Tuttavia, il nome di quel foglio cambia in base al numero di righe.Importare dati da Excel utilizzando SSIS senza conoscere il nome del foglio

C'è un modo per eseguire un processo SSIS che preleva dati da Excel senza conoscere preventivamente il nome del foglio? Sembra fare affidamento sul nome del foglio come origine dati, ma sto cercando di dirlo "foglio numero 1" o qualcosa di simile.

+0

può interrogare per le "tavole" (fogli) nel file di Excel e poi basta usare il primo? – Gabe

+0

Buon pensiero, ma qualche idea su come farlo? –

risposta

5

Scriverò il nome del foglio di lavoro a una variabile utente SSIS. Se non si oppongono ad inserire un'attività di script nel pacchetto SSIS provare questo: (Basato su link text)

Excel.Application xlApp = new Excel.ApplicationClass(); 
Excel.Workbook xlWorkBook = xlApp.Workbooks.Open("<Name of your excel app>.xls", 0, xlWorkBook true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
// Look up worksheet by index 
Excel.Worksheet xlWorkSheet =(Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

user::worksheetname = xlWorkSheet.Name; 

/* Do clean up. Working with COM object */ 
+0

Questa è l'opzione migliore a mio parere e, se dovessi affrontare nuovamente questo problema, proverei prima questa via. Grazie Adam! Il progetto su cui stavo lavorando utilizzava già l'automazione dell'interfaccia utente, quindi ho finito con l'aggiunta di uno script per automatizzare la modifica del nome.Aggiornamento –

+0

: Ho trovato il mio riferimento Excel qui: C: \ Programmi (x86) \ Microsoft Visual Studio 11.0 \ Strumenti di Visual Studio per Office \ PIA \ Office14 \ Microsoft.Office.Interop.Excel.dll. Come ottenere un riferimento a "Excel.Application"? Devo aggiungere un riferimento alla DLL? Sto eseguendo Excel a 64 bit con il "Motore di database di Microsoft Access 2010 ridistribuibile" installato per consentirmi di utilizzare l'origine Excel in SSIS. – PeterX

+1

Sembra anche che ci sia un valore "xlWorkBook" nel metodo Open nel codice sopra. – PeterX

1

Non credo ... Non conosco alcuna sintassi di riferimento ordinale, ad esempio Fogli [0] che è possibile utilizzare.

Quindi, se non è possibile ottenere i dati senza conoscere il nome del foglio, è sufficiente trovare il nome del foglio in modo dinamico. Questo collegamento su getting Excel schema info in SSIS dovrebbe aiutarti a farlo. Una volta che lo hai, puoi passare il nome del foglio come variabile, e via vai.

1

Ho avuto questo stesso problema in passato e non sono riuscito a trovare una soluzione per leggere un file Excel in cui il nome del suo foglio cambia da file a file.

La mia ipotesi, che non riuscivo a mettere a lavoro, sarebbe stata quella di usare espressioni nelle proprietà della connessione dati. Dovresti in qualche modo leggere il nome del foglio in una variabile, quindi utilizzare il risultato di tale variabile nel nome del foglio per la connessione dati.

Buona fortuna, e mi dispiace non aver potuto essere di maggior aiuto.

3

Ho avuto un problema simile. La soluzione che ho implementato è stata prima leggere il file excel usando la connessione OleDB. Aprire la connessione e quindi recuperare tutti i nomi dei fogli. Ecco un esempio

Dim strConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ABC.xls;Extended Properties=""EXCEL 8.0;""" 

Dim lstSheetName As List(Of String) = Nothing 
Try 
objConn = New OleDbConnection(Me.ConnectionString) 
objConn.Open() 
lstSheetName = New List(Of String) 
Using dtSheetTable As DataTable =  objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,Nothing) 

    For Each drRow As DataRow In dtSheetTable.Rows 
    lstSheetName.Add("[" & drRow("TABLE_NAME").ToString().Replace("'", "''") & "]") 
    Next 
End Using 
Catch ex as Exception 
Throw 
Finally 
If objConn.State = ConnectionState.Open Then objConn.Close() 
objConn.Dispose() 
End Try 

Tutto questo codice è scritto ASPX.VB e poi sto eseguendo il pacchetto SSIS tramite codice dietro e passando il primo valore della variabile lstSheetName (lstSheetName(0).ToString())

Questo è stato

4

Solo per la cronaca, sto usando questo codice in Script Task per risolvere il problema. Le variabili utilizzate sono: Nome file, Nome foglio.

Si noti che il mio nome file Excel è dinamico.

// GET NAME OF FIRST SHEET 
string filename = (string)Dts.Variables["Filename"].Value; 
string sheetName = null; 

string connStr = 
    String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"EXCEL 8.0;IMEX=1;\"", filename); 

var conn = new OleDbConnection(connStr); 
try 
{   
    conn.Open(); 

    using(var dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)) 
    { 
     var row0 = dtSheet.Rows[0]; 
     sheetName = row0["TABLE_NAME"].ToString(); 
    } 
} 
catch (Exception) 
{ 
    throw; 
} 
finally 
{ 
    conn.Close(); 
    conn.Dispose(); 
} 

if (!String.IsNullOrEmpty(sheetName)) 
{ 
    Dts.Variables["SheetName"].Value = sheetName; 
    Dts.Events.FireInformation(1, "User::SheetName", sheetName, "", 0, ref dummy); 
    Dts.TaskResult = (int)ScriptResults.Success; 
} 
else 
{ 
    Dts.Events.FireError(0, "User::SheetName", "No SheetName found!", String.Empty, 0); 
    Dts.TaskResult = (int)ScriptResults.Failure; 
} 
+0

Questo mi ha aiutato, grazie! – KathyBlue

1

Se qualcuno ha problemi con il driver JET ora è possibile utilizzare i driver AccessDatabase. Questo è stato adattato dall'alto e viene verificato lavorando sulla mia macchina, per questo non sono necessari riferimenti aggiuntivi.

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.Data.OleDb; 

    public void Main() 
    { 
     // GET NAME OF FIRST SHEET 
     string filename = Dts.Variables["User::ActiveFileName"].Value.ToString(); 
     string sheetName = null; 
     bool dummy = true; 

     string connStr = 
      String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";", filename); 
     var conn = new OleDbConnection(connStr); 
     try 
     { 
      conn.Open(); 

      using(var dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)) 
      { 
       var row0 = dtSheet.Rows[0]; 
       sheetName = row0["TABLE_NAME"].ToString(); 
      } 

      if (!String.IsNullOrEmpty(sheetName)) 
      { 
       Dts.Variables["SheetName"].Value = sheetName; 
       Dts.Events.FireInformation(1, "User::SheetName", sheetName, "", 0, ref dummy); 
       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
      else 
      { 
       throw new Exception("No SheetName found!"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Dts.Events.FireError(0, "User::SheetName", ex.Message, String.Empty, 0); 
      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
     finally 
     { 
      conn.Close(); 
      conn.Dispose(); 
     } 
    } 
Problemi correlati