示例#1
0
        public static BackgroundWorker Start(string fileName, long currentOperatorId, IEnumerable <SheetRulePair> ruleToSheets)
        {
            BackgroundWorker result = new BackgroundWorker();

            result.DoWork += (s, e) =>
            {
                StringBuilder errors = new StringBuilder();

                bool showLogAnytime = false;

                BackgroundWorker   current      = s as BackgroundWorker;
                PercentageProgress fullProgress = new PercentageProgress();

                var readRulesProgress      = fullProgress.GetChild();
                var getLinksProgress       = fullProgress.GetChild();
                var writeExcelFileProgress = fullProgress.GetChild();

                fullProgress.Change += (s2, args) => { current.ReportProgress((int)args.Value); };

                ObservableCollection <OutputRow> rowsToExport = new ObservableCollection <OutputRow>();

                bool wasException = false;
                var  logSession   = Helpers.Old.Log.SessionStart("ReExport.ReExport()", true);
                try
                {
                    #region Read Rules

                    Helpers.Old.Log.Add(logSession, string.Format("total sheets count: '{0}'", ruleToSheets.Count()));
                    int rulesToSheets = ruleToSheets.Count();

                    int ind = 0;
                    foreach (var item in ruleToSheets)
                    {
                        var mappingRule = item.Rule;
                        var ds          = item.Sheet;
                        if (mappingRule != null && ds != null)
                        {
                            if (ds.MainHeader == null)
                            {
                                Helpers.Old.Log.Add(logSession, string.Format("should update main header row..."));

                                ds.UpdateMainHeaderRow(mappingRule.MainHeaderSearchTags
                                                       .Select(h => h.Tag)
                                                       .Union(SettingsProvider.CurrentSettings.HeaderSearchTags.Split(new char[] { ',' }))
                                                       .Select(i => i.Trim())
                                                       .Where(i => !string.IsNullOrEmpty(i))
                                                       .Distinct()
                                                       .ToArray());

                                ds.UpdateHeaders(mappingRule.SheetHeadersSearchTags
                                                 .Select(h => h.Tag.Trim())
                                                 .Where(i => !string.IsNullOrEmpty(i))
                                                 .Distinct()
                                                 .ToArray());
                            }

                            var oc = new ObservableCollection <OutputRow>(mappingRule.Convert(ds, new string[] { "Code" }));
                            Helpers.Old.Log.Add(logSession, string.Format("row count on sheet '{0}' : '{1}'", ds.Name, oc.Count));
                            rowsToExport = new ObservableCollection <OutputRow>(rowsToExport.Union(oc));
                            Helpers.Old.Log.Add(logSession, string.Format("subtotal row count on sheets: '{0}'", rowsToExport.Count));
                        }

                        ind++;
                        readRulesProgress.Value = ((decimal)ind / (decimal)rulesToSheets) * 100m;
                    }
                    Helpers.Old.Log.Add(logSession, string.Format("total row count to export: '{0}'", rowsToExport.Count));

                    #endregion
                    #region Get Links
                    Helpers.Old.Log.Add(logSession, string.Format("Try to get links..."));

                    var idsToGet =
                        rowsToExport
                        .Select(i => new ReExportData(i.Code.Trim(), i.OriginalIndex, i.OriginalSheet))
                        .Cast <ReExportData>()
                        .ToList();

                    string outerMap;
                    string outerPdf;

                    try
                    {
                        HttpDataClient.Default.GetResourcesList(currentOperatorId, idsToGet, out outerMap, out outerPdf);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(string.Format("Ошибка при получении ссылок для кодов (кол-во: {0})", idsToGet.Count), ex);
                    }
                    //Log.Add(logSession, string.Format("Get CODES from server..."));
                    //foreach (var i in idsToGet)
                    //    Log.Add(logSession, string.Format("[Code:'{0}',Location:'{1}',Map:'{2}',Photo:'{3}']", i.Code, i.LinkLocation, i.LinkMap, i.LinkPhoto));
                    //Log.Add(logSession, string.Format("Get CODES done"));

                    //HttpDataAccess.GetResourcesList(currentOperatorId, idsToGet, out outerMap, out outerPdf);
                    Helpers.Old.Log.Add(logSession, string.Format("Links getted"));
                    getLinksProgress.Value = 100;
                    #endregion
                    #region Write Excel File

                    Workbook wb = new Workbook(fileName);
                    foreach (var r in ruleToSheets.Where(r => r.Sheet != null))
                    {
                        var sheet = wb.Worksheets.Cast <Worksheet>().FirstOrDefault(sht => sht.Name.ToLower().Trim() == r.Sheet.Name.ToLower().Trim());
                        if (sheet != null)
                        {
                            int    CodeColumnIndex = -1;
                            string CodeColumnName  = string.Empty;

                            var convData = r.Rule.ConvertionData.FirstOrDefault(cd => cd.PropertyId == "Code");
                            if (convData != null)
                            {
                                var block = convData.Blocks.Blocks.FirstOrDefault();
                                if (block != null)
                                {
                                    var func = block.UsedFunctions.FirstOrDefault();
                                    if (func != null)
                                    {
                                        CodeColumnName = func.Function.ColumnName;
                                        if (string.IsNullOrWhiteSpace(func.Function.ColumnName) || func.Function.SelectedParameter == Core.Converter.Functions.FunctionParameters.CellNumber)
                                        {
                                            CodeColumnIndex = func.Function.ColumnNumber;
                                        }
                                    }
                                }
                            }

                            if (!string.IsNullOrWhiteSpace(CodeColumnName) || (CodeColumnIndex != -1))
                            {
                                if (CodeColumnIndex == -1)
                                {
                                    CodeColumnIndex = r.Sheet.MainHeader.Cells.FirstOrDefault(c => string.Compare(c.Value, CodeColumnName, true) == 0)?.OriginalIndex ?? -1;
                                }

                                #region Add cells to rows
                                if (CodeColumnIndex >= 0)
                                {
                                    int lastIndex = sheet.Cells.Rows.Cast <Row>().Select(c =>
                                    {
                                        if (c.LastCell != null)
                                        {
                                            for (int i = c.LastCell.Column; i >= 0; i--)
                                            {
                                                var cell = c.GetCellOrNull(i);
                                                if (!string.IsNullOrWhiteSpace(
                                                        cell == null || cell.Value == null
                                                                    ? null
                                                                    : cell.Value.ToString().Trim()
                                                        )
                                                    )
                                                {
                                                    return(cell.IsMerged ? cell.GetMergedRange().FirstColumn + cell.GetMergedRange().ColumnCount - 1 : i);
                                                }
                                            }
                                        }
                                        return(0);
                                    }
                                                                                         )
                                                    .Union(new int[] { 0 })
                                                    .Max();

                                    var h0 = sheet.Cells[r.Sheet.MainHeader.Index, lastIndex + 0];
                                    var h1 = sheet.Cells[r.Sheet.MainHeader.Index, lastIndex + 1];
                                    var h2 = sheet.Cells[r.Sheet.MainHeader.Index, lastIndex + 2];
                                    var h3 = sheet.Cells[r.Sheet.MainHeader.Index, lastIndex + 3];

                                    sheet.Cells.Columns[h1.Column].IsHidden = false;
                                    sheet.Cells.Columns[h2.Column].IsHidden = false;
                                    sheet.Cells.Columns[h3.Column].IsHidden = false;

                                    h1.Value = "Фото";
                                    h2.Value = "Схема";
                                    h3.Value = "Карта";

                                    Style h0Style = h0.GetStyle();

                                    h1.SetStyle(h0Style);
                                    h2.SetStyle(h0Style);
                                    h3.SetStyle(h0Style);

                                    foreach (var item in idsToGet.Where(i => i.OriginalSheet == sheet.Name))
                                    {
                                        if (!string.IsNullOrWhiteSpace(item.LinkPhoto))
                                        {
                                            var c1 = sheet.Cells[item.OriginalIndex, lastIndex + 1];
                                            c1.Value = "фото";
                                            sheet.Hyperlinks.Add(c1.Name, 1, 1, item.LinkPhoto);
                                        }
                                        if (!string.IsNullOrWhiteSpace(item.LinkLocation))
                                        {
                                            var c2 = sheet.Cells[item.OriginalIndex, lastIndex + 2];
                                            c2.Value = "схема";
                                            sheet.Hyperlinks.Add(c2.Name, 1, 1, item.LinkLocation);
                                        }
                                        if (!string.IsNullOrWhiteSpace(item.LinkMap))
                                        {
                                            var c3 = sheet.Cells[item.OriginalIndex, lastIndex + 3];
                                            c3.Value = "карта";
                                            sheet.Hyperlinks.Add(c3.Name, 1, 1, item.LinkMap);
                                        }
                                    }

                                    if (sheet.Cells.LastCell != null)
                                    {
                                        int lastRowIndex = sheet.Cells.LastCell.Row;

                                        int rowAdd = 3;

                                        if (outerPdf != null)
                                        {
                                            var outer0 = sheet.Cells[lastRowIndex + rowAdd, CodeColumnIndex + 0];
                                            var outer1 = sheet.Cells[lastRowIndex + rowAdd, CodeColumnIndex + 1];

                                            outer0.Value = "Скачать оффлайн PDF-презентацию";
                                            outer1.Value = outerPdf;
                                            sheet.Hyperlinks.Add(outer0.Name, 1, 1, outerPdf);

                                            rowAdd++;
                                        }

                                        if (outerMap != null)
                                        {
                                            var outer0 = sheet.Cells[lastRowIndex + rowAdd, CodeColumnIndex + 0];
                                            var outer1 = sheet.Cells[lastRowIndex + rowAdd, CodeColumnIndex + 1];

                                            outer0.Value = "Карта";
                                            outer1.Value = outerMap;
                                            sheet.Hyperlinks.Add(outer0.Name, 1, 1, outerMap);

                                            rowAdd++;
                                        }
                                    }
                                }
                                else
                                {
                                    errors.AppendFormat("в Excel-файле на вкладке '{0}' невозможно найти колонку с именем '{1}'", sheet.Name, CodeColumnName);
                                    errors.AppendLine();
                                    //throw new Exception(string.Format("в Excel-файле на вкладке '{0}' невозможно найти колонку с кодом '{1}'", sheet.Name, CodeColumnName));
                                }
                                #endregion
                            }
                            else
                            {
                                errors.AppendFormat("Отсутствует правило для определения кода для вкладки '{0}'", sheet.Name);
                                errors.AppendLine();
                                //throw new Exception(string.Format("Отсутствует правило для определения кода для вкладки '{0}'", sheet.Name));
                            }
                        }
                    }
                    wb.Save(fileName);
                    e.Result = errors.ToString();

                    #endregion
                }
                catch (Exception ex)
                {
                    wasException = true;
                    Helpers.Old.Log.Add(logSession, ex);
                    throw ex;
                }
                finally
                {
                    current.ReportProgress(100);
                    Helpers.Old.Log.SessionEnd(logSession, wasException || showLogAnytime);
                }
            };
            result.WorkerReportsProgress      = true;
            result.WorkerSupportsCancellation = true;

            return(result);
        }
示例#2
0
        public void Initialize()
        {
            InitializeError = string.Empty;
            if (Export2CsvCommand == null)
            {
                Export2CsvCommand = new RelayCommand(() => Export2Csv());
            }
            if (Export2DbCommand == null)
            {
                Export2DbCommand = new RelayCommand(Export2Db);
            }
            if (UpdateErrorsCommand == null)
            {
                UpdateErrorsCommand = new RelayCommand(UpdateErrors);
            }
            if (UpdateSelectedErrorCommand == null)
            {
                UpdateSelectedErrorCommand = new RelayCommand(UpdateSelectedError);
            }
            if (UpdateSelectedWarningCommand == null)
            {
                UpdateSelectedWarningCommand = new RelayCommand(UpdateSelectedWarning);
            }

            loadWorker = new BackgroundWorker()
            {
                WorkerReportsProgress = true, WorkerSupportsCancellation = true
            };
            loadWorker.DoWork += (s, prm) =>
            {
                var Disp = prm.Argument as System.Windows.Threading.Dispatcher;

                ObservableCollection <OutputRow> rowsToExport = new ObservableCollection <OutputRow>();
                Guid logSession = Helpers.Old.Log.SessionStart("ExportViewModel.Initialize()");
                try
                {
                    Log.Add(string.Format("total sheets count: '{0}'", App.Locator.Import.Document.DocumentSheets.Count));
                    var addErr  = new List <Error>();
                    var addGErr = new List <GlobalError>();

                    var progress = new PercentageProgress();

                    foreach (var item in App.Locator.Import
                             .ExportRules
                             .Where(r => r.Rule != App.Locator.Import.NullRule)
                             .Select(r => new { Rule = r, Progress = progress.GetChild() })
                             .ToArray()
                             )
                    {
                        if (((BackgroundWorker)s).CancellationPending || s != loadWorker)
                        {
                            break;
                        }

                        var mappingRule = item.Rule.Rule;
                        var ds          = item.Rule.Sheet;

                        if (mappingRule == null || ds == null)
                        {
                            if (!string.IsNullOrWhiteSpace(item.Rule.Status))
                            {
                                addGErr.Add(new GlobalError()
                                {
                                    Description = item.Rule.Status
                                });
                            }
                            item.Progress.Value = 100;
                            continue;
                        }
                        else
                        {
                            if (ds.MainHeader == null)
                            {
                                Log.Add(string.Format("should update main header row..."));

                                ds.UpdateMainHeaderRow(mappingRule.MainHeaderSearchTags
                                                       .Select(h => h.Tag)
                                                       .Union(SettingsProvider.CurrentSettings.HeaderSearchTags.Split(new char[] { ',' }))
                                                       .Select(i => i.Trim())
                                                       .Where(i => !string.IsNullOrEmpty(i))
                                                       .Distinct()
                                                       .ToArray());

                                ds.UpdateHeaders(mappingRule.SheetHeadersSearchTags
                                                 .Select(h => h.Tag.Trim())
                                                 .Where(i => !string.IsNullOrEmpty(i))
                                                 .Distinct()
                                                 .ToArray());
                            }

                            var oc = new ObservableCollection <OutputRow>(mappingRule.Convert(ds,
                                                                                              progressAction: (i) =>
                            {
                                item.Progress.Value = i;
                                ((BackgroundWorker)s).ReportProgress((int)progress.Value);
                            },
                                                                                              isCanceled: () => { return(((BackgroundWorker)s).CancellationPending); },
                                                                                              additionalErrorAction: (e, r) =>
                            {
                                addErr.Add(new Error()
                                {
                                    Description = e.GetExceptionText(includeStackTrace: false, clearText: true).Trim(), RowNumber = r
                                });
                            }));
                            Log.Add(string.Format("row count on sheet '{0}' : '{1}'", ds.Name, oc.Count));
                            rowsToExport = new ObservableCollection <OutputRow>(rowsToExport.Union(oc));
                            Log.Add(string.Format("subtotal row count on sheets: '{0}'", rowsToExport.Count));
                        }
                    }

                    ExelConvertionRule.RemoveRepeatingId(rowsToExport.ToList());

                    var UrlsPhoto  = new UrlCollection();
                    var UrlsSchema = new UrlCollection();
                    var UrlsAll    = new UrlCollection();

                    var photos  = rowsToExport.Select(r => r.Photo_img).Where(r => Helper.IsWellFormedUriString(r, UriKind.Absolute)).Distinct();
                    var schemas = rowsToExport.Select(r => r.Location_img).Where(r => Helper.IsWellFormedUriString(r, UriKind.Absolute)).Distinct();
                    var all     = photos.Union(schemas).Distinct();

                    foreach (var p in photos)
                    {
                        UrlsPhoto.Add(new StringUrlWithResultWrapper(p));
                    }
                    foreach (var p in schemas)
                    {
                        UrlsSchema.Add(new StringUrlWithResultWrapper(p));
                    }
                    foreach (var p in all)
                    {
                        UrlsAll.Add(new StringUrlWithResultWrapper(p));
                    }

                    if (!((BackgroundWorker)s).CancellationPending && s == loadWorker)
                    {
                        Disp.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
                        {
                            UrlCollection.Clear();
                            if (UrlsPhoto.Count > 0)
                            {
                                UrlCollection.Add(new UrlCollectionAdditional()
                                {
                                    Name = DBParsers.Labels.ElementAt(0), Collection = UrlsPhoto
                                });
                            }
                            if (UrlsSchema.Count > 0)
                            {
                                UrlCollection.Add(new UrlCollectionAdditional()
                                {
                                    Name = DBParsers.Labels.ElementAt(1), Collection = UrlsSchema
                                });
                            }
                            if (UrlsPhoto.Count > 0 && UrlsSchema.Count > 0 && UrlsAll.Count > 0)
                            {
                                UrlCollection.Add(new UrlCollectionAdditional()
                                {
                                    Name = "Все", Collection = UrlsAll
                                });
                            }
                            UrlCollectionSelectedIndex = UrlCollection.Count - 1;
                            RowsToExport = rowsToExport;
                            UpdateErrors(addErr, addGErr);
                        }));
                    }
                    else
                    {
                        prm.Cancel = true;
                    }
                }
                catch (Exception ex)
                {
                    Helpers.Old.Log.Add(logSession, ex.GetExceptionText());
                    throw ex;
                }
                finally
                {
                    Log.Add(string.Format("total row count to export: '{0}'", rowsToExport.Count));
                    Helpers.Old.Log.SessionEnd(logSession);
                }
            };

            loadWorker.ProgressChanged += (s, e) =>
            {
                if (s == loadWorker)
                {
                    LoadProgress = e.ProgressPercentage;
                }
            };

            loadWorker.RunWorkerCompleted += (s, e) =>
            {
                if (s == loadWorker)
                {
                    try
                    {
                        if (e.Cancelled)
                        {
                            throw new Exception("Загрузка отменена пользователем");
                        }
                        if (e.Error != null)
                        {
                            throw e.Error;
                        }
                    }
                    catch (Exception ex)
                    {
                        InitializeError = ex.GetExceptionText();
                    }
                }
                finally
                {
                    if (s == loadWorker)
                    {
                        IsLoading  = false;
                        loadWorker = null;
                    }
                }
                ((BackgroundWorker)s).Dispose();
            };