private void Load() { if (loadWorker != null) try { loadWorker.CancelAsync(); } catch { } LoadingProgress = 0; IsDocumentLoaded = false; Error = string.Empty; if (string.IsNullOrWhiteSpace(Path)) return; IsBusy = true; loadWorker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; var init = new AsyncLoadInit() { DeleteEmptyRows = this.DeleteEmptyRows, WorkBookFilePath = this.Path, PreloadCount = Settings.SettingsProvider.CurrentSettings.PreloadedRowsCount }; var applyRes = new Action<Workbook, ExelSheet[]>((w, s) => { WorkBook = w; DocumentSheets.Clear(); var oldSheetName = (SelectedSheet == null ? string.Empty : SelectedSheet.Name) ?? string.Empty; foreach (var s2 in s) DocumentSheets.Add(s2); SelectedSheet = DocumentSheets.FirstOrDefault(ss => ss.Name == oldSheetName) ?? DocumentSheets.FirstOrDefault(); }); loadWorker.DoWork += (s, e) => { Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ru-RU"); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; var bw = (BackgroundWorker)s; var prms = (AsyncLoadInit)e.Argument; var res = new AsyncLoadResult() { StartSettings = prms }; var pp = new Helpers.PercentageProgress(); pp.Change += (sP, eP) => { bw.ReportProgress((int)eP.Value); }; var pp0 = pp.GetChild(); pp0.Weight = 1; var pp1 = pp.GetChild(); pp1.Weight = 3; var pp2 = pp.GetChild(); pp2.Weight = 6; //var pp3 = pp.GetChild(); //pp3.Weight = 3; bw.ReportProgress((int)pp.Value, "Открытие документа..."); res.WorkBook = new Workbook(prms.WorkBookFilePath); pp0.Value = 100; bw.ReportProgress((int)pp.Value, "Чтение первых записей на страницах..."); var subRes = AsyncDocumentLoader.LoadSheets(res.WorkBook, prms.PreloadCount, (i) => { pp1.Value = i; }, prms.DeleteEmptyRows).ToArray(); bw.ReportProgress((int)pp.Value, new AsyncLoadResult() { WorkBook = res.WorkBook, WorkSheets = subRes }); bw.ReportProgress((int)pp.Value, "Чтение всех записей на страницах..."); res.WorkSheets = AsyncDocumentLoader.LoadSheets(res.WorkBook, 0, (i) => { pp2.Value = i; }, prms.DeleteEmptyRows).ToArray(); //foreach (var ws in res.WorkSheets.Select(w => new { WorkSheet = w, Progress = pp3.GetChild() }).ToArray()) //{ // ws.WorkSheet.UpdateHeaders(); //} bw.ReportProgress((int)pp.Value, "Применение результата..."); e.Result = res; }; loadWorker.ProgressChanged += (s, e) => { if (loadWorker != s) return; LoadingProgress = e.ProgressPercentage; var res = e.UserState as AsyncLoadResult; if (res != null) applyRes(res.WorkBook, res.WorkSheets); else { var status = e.UserState as string; if (status != null) Status = status; } }; loadWorker.RunWorkerCompleted += (s, e) => { if (loadWorker == s) { if (e.Cancelled) Error = "Задание отменено пользователем"; if (e.Error != null) { Error = e.Error.GetExceptionText(); } else { var res = e.Result as AsyncLoadResult; if (res != null) { if (res.WorkSheets.Count() == 0) Error = "В документе не найдено ни одного листа"; Status = "Применение результатов (подсчёт заголовков и прочее)..."; applyRes(res.WorkBook, res.WorkSheets); } else Error = "Внутренняя ошибка приложения"; } Status = "Загрузка документа завершена" + (string.IsNullOrWhiteSpace(Error) ? string.Empty : " с ошибками"); LoadingProgress = 100; IsDocumentLoaded = true; IsBusy = false; loadWorker = null; } ((BackgroundWorker)s).Dispose(); }; loadWorker.RunWorkerAsync(init); }
private void Load() { if (loadWorker != null) { try { loadWorker.CancelAsync(); } catch { } } LoadingProgress = 0; IsDocumentLoaded = false; Error = string.Empty; if (string.IsNullOrWhiteSpace(Path)) { return; } IsBusy = true; loadWorker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; var init = new AsyncLoadInit() { DeleteEmptyRows = this.DeleteEmptyRows, WorkBookFilePath = this.Path, PreloadCount = Settings.SettingsProvider.CurrentSettings.PreloadedRowsCount }; var applyRes = new Action <Workbook, ExelSheet[]>((w, s) => { WorkBook = w; DocumentSheets.Clear(); var oldSheetName = (SelectedSheet == null ? string.Empty : SelectedSheet.Name) ?? string.Empty; foreach (var s2 in s) { DocumentSheets.Add(s2); } SelectedSheet = DocumentSheets.FirstOrDefault(ss => ss.Name == oldSheetName) ?? DocumentSheets.FirstOrDefault(); }); loadWorker.DoWork += (s, e) => { Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ru-RU"); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; var bw = (BackgroundWorker)s; var prms = (AsyncLoadInit)e.Argument; var res = new AsyncLoadResult() { StartSettings = prms }; var pp = new Helpers.PercentageProgress(); pp.Change += (sP, eP) => { bw.ReportProgress((int)eP.Value); }; var pp0 = pp.GetChild(); pp0.Weight = 1; var pp1 = pp.GetChild(); pp1.Weight = 3; var pp2 = pp.GetChild(); pp2.Weight = 6; //var pp3 = pp.GetChild(); //pp3.Weight = 3; bw.ReportProgress((int)pp.Value, "Открытие документа..."); res.WorkBook = new Workbook(prms.WorkBookFilePath); pp0.Value = 100; bw.ReportProgress((int)pp.Value, "Чтение первых записей на страницах..."); var subRes = AsyncDocumentLoader.LoadSheets(res.WorkBook, prms.PreloadCount, (i) => { pp1.Value = i; }, prms.DeleteEmptyRows).ToArray(); bw.ReportProgress((int)pp.Value, new AsyncLoadResult() { WorkBook = res.WorkBook, WorkSheets = subRes }); bw.ReportProgress((int)pp.Value, "Чтение всех записей на страницах..."); res.WorkSheets = AsyncDocumentLoader.LoadSheets(res.WorkBook, 0, (i) => { pp2.Value = i; }, prms.DeleteEmptyRows).ToArray(); //foreach (var ws in res.WorkSheets.Select(w => new { WorkSheet = w, Progress = pp3.GetChild() }).ToArray()) //{ // ws.WorkSheet.UpdateHeaders(); //} bw.ReportProgress((int)pp.Value, "Применение результата..."); e.Result = res; }; loadWorker.ProgressChanged += (s, e) => { if (loadWorker != s) { return; } LoadingProgress = e.ProgressPercentage; var res = e.UserState as AsyncLoadResult; if (res != null) { applyRes(res.WorkBook, res.WorkSheets); } else { var status = e.UserState as string; if (status != null) { Status = status; } } }; loadWorker.RunWorkerCompleted += (s, e) => { if (loadWorker == s) { if (e.Cancelled) { Error = "Задание отменено пользователем"; } if (e.Error != null) { Error = e.Error.GetExceptionText(); } else { var res = e.Result as AsyncLoadResult; if (res != null) { if (res.WorkSheets.Count() == 0) { Error = "В документе не найдено ни одного листа"; } Status = "Применение результатов (подсчёт заголовков и прочее)..."; applyRes(res.WorkBook, res.WorkSheets); } else { Error = "Внутренняя ошибка приложения"; } } Status = "Загрузка документа завершена" + (string.IsNullOrWhiteSpace(Error) ? string.Empty : " с ошибками"); LoadingProgress = 100; IsDocumentLoaded = true; IsBusy = false; loadWorker = null; } ((BackgroundWorker)s).Dispose(); }; loadWorker.RunWorkerAsync(init); }