Wpis z mikrobloga

Czołem Miruny,

Jest tu ktoś ogarniający #csharp? Mam w #ssis script taska otwierającego plik xlsx, po otwarciu plik sie samodzielnie odswieza (power query), nastepnie script task mi go zapisuje (na shared location). Lokalnie wszystko bangla, po deploju i puszczeniu joba plik sie nie odswieza, aczkolwiek widze ze plik xlsx jest zmodyfikowany. Nie ogarniam totalnie c#, ponizszy kod to ulep z roznych zrodel.
Ktoś tam pisał by pomanipulować czasem w System.Threading.Thread.Sleep ale to nic nie daje. Jakies wskazowki?
#it #programowanie #sql #tsql

public void Main()
{
// TODO: Add your code here
ExcelRefresh(@"lokalizacja\..xlsx");
Dts.TaskResult = (int)ScriptResults.Success;
}

private void ExcelRefresh(string Filename)
{
object NullValue = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
excelApp.DisplayAlerts = false;
Microsoft.Office.Interop.Excel.Workbook Workbook = excelApp.Workbooks.Open(
Filename, NullValue, NullValue, NullValue, NullValue,
NullValue, NullValue, NullValue, NullValue, NullValue,
NullValue, NullValue, NullValue, NullValue, NullValue);
Workbook.RefreshAll();
System.Threading.Thread.Sleep(100000);
Workbook.Save();
Workbook.Close(false, Filename, null);
excelApp.Quit();
Workbook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
}
  • 7
@biszcz: Matko Przenajświętsza...

Ten kod jest okropny na tak wielu płaszczyznach...
Ale skupiając się tylko na problemie, jaki jest cel czekania tutaj 100 sekund przed zapisem pliku?

System.Threading.Thread.Sleep(100000);


Z takich malutkich rzeczy, byłoby dużo czytelniej gdybyś nazwy zmiennych lokalnych takich jak: NullValue, Workbook zaczynał z małej litery. Tak samo jak nazwę argumentu funkcji ExcelRefresh - FileName.

Jak na samej górze pliku dodasz:

using Microsoft.Office.Interop.Excel;


to nie będziesz musiał tego pisać wszędzie
Ale skupiając się tylko na problemie, jaki jest cel czekania tutaj 100 sekund przed zapisem pliku?


@Hektorrr: czas na odświeżenie pliku

Z takich malutkich rzeczy, byłoby dużo czytelniej gdybyś nazwy zmiennych lokalnych takich jak: NullValue, Workbook zaczynał z małej litery. Tak samo jak nazwę argumentu funkcji ExcelRefresh - FileName.


ok, tak jak napisałem, nie mam pojecia o C#

Jak na samej górze pliku dodasz:

using Microsoft.Office.Interop.Excel;


mam dodaną referencję, to że
@biszcz: Oki, sprawdziłem docsy, i z tego co jestem w stanie wydedukować z tego kodu to, to, że ten sleep miałby poczekać aż odświeżanie szablonów w tle się skończy.
Ale wg docsów dotyczy to tylko szablonów, które mają ustawione BackgroundQuery na wartość 'true'.
https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.refreshall
więc wg mnie, nie musisz mieć tu żadnego Sleepa.

Za to, Workbook.Save() chyba powinien w pierwszym argumencie dostawać 'true'.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.tools.excel.workbook.close?view=vsto-2017

Więc zamiast:

Workbook.Close(false, Filename, null);


powinno być:
@biszcz: o jezu, interopy pod ssisem, nie szedlbym ta droga, moze lepiej zrobic to jako osobny program ktory ssis po prostu by odpalal jako execute process task i tyle ;)