2013-09-13 21 views
5

Voglio passare in rassegna una directory (utilizzando C#) e aggiornare tutti i fogli di Excel. Io uso:Wait for Workbook.RefreshAll() (C#)

Workbook.RefreshAll(); 

Come posso aspettare per l'istruzione Workbook.RefreshAll() per finire?

Il problema è: apro FileA, then Workbook.RefreshAll() e quindi apri FileB - L'aggiornamento per FileA è terminato. L'unica soluzione che ho trovato è quella di chiamare qualcosa come

System.Threading.Thread.Sleep(20000); 

che ho trovato molto sgradevole ...

Qualcuno sa un modo migliore per aspettare?

+0

possibile duplicato di [Excel vba refresh wait] (http://stackoverflow.com/questions/8925403/excel-vba-refresh-wait) –

risposta

2

Se si passa attraverso il vostro Workbook e si imposta la proprietà BackgroundQuery di tutti il tuo QueryTable s a false, RefreshAll dovrebbe finire prima di andare avanti.

foreach (Worksheet worksheet in workbook.Worksheets) 
{ 
    foreach (QueryTable table in worksheet.QueryTables) 
     table.BackgroundQuery = false; 
} 

//This will finish executing before moving on 
workbook.RefreshAll(); 
3

Aggiornato 2016/05/31 ...

Grazie per il vostro aiuto. Ho trovato la seguente soluzione:

foreach (MSExcel.WorkbookConnection cnn in wb.Connections) 
{ 
    if (cnn.Type.ToString() == "xlConnectionTypeODBC") 
    { 
     cnn.ODBCConnection.BackgroundQuery = false; 
    } 
    else 
    { 
     cnn.OLEDBConnection.BackgroundQuery = false; 
    } 
} 

Frank

+0

Si sta aggiornando ogni connessione della cartella di lavoro una volta per ogni foglio, il ciclo esterno è inutile . –

0

Il codice seguente funziona perfettamente quando l'excel deve correre interrogazione sfondo per estrarre dati da SQL Server/MS Access e si aspetterà la query è riuscita .

public void RefreshSheet(Excel.Application Excel, Excel.Workbook WB) 
{ 
    WB.RefreshAll(); 
    Excel.Application.CalculateUntilAsyncQueriesDone(); 
    WB.save(); 
} 

Qui WB è la cartella di lavoro ed Excel è l'applicazione Excel dichiarata nel codice.