public Pivot(IProgressBarWithLogUI pb) { this.pb = pb; Excel.Workbook wb = _app.ActiveWorkbook; SheetUrv12 = ExcelHelper.GetSheet(wb, "Урв12"); SheetUrv11 = ExcelHelper.GetSheet(wb, "Урв11"); _SheetPalette = ExcelHelper.GetSheet(wb, "Палитра"); _projectManager = new ProjectManager.ProjectManager(); _project = _projectManager.ActiveProject; string analisysSheetName = _project.AnalysisSheetName; _AnalisysSheet = ExcelHelper.GetSheet(wb, analisysSheetName); }
/// <summary> /// Нумерация /// </summary> /// <param name="numberer"></param> /// <param name="pb"></param> public void Numeric(Numberer numberer, IProgressBarWithLogUI pb) { foreach (var item in _items) { if (pb?.IsAborted ?? false) { break; } pb?.SubBarTick(); item.Number = numberer.GetNextNumber(); item.Numeric(numberer.GetNextLevel(), pb); } }
/// <summary> /// Печать КП /// </summary> /// <param name="offer"></param> internal void Print(IProgressBarWithLogUI pb, string offerSettingsName) { // Ищем настройки столбцов OfferSettings offerSettings = _offerManager.Mappings.Find(s => s.Name == offerSettingsName); pb.Writeline($"Выбор листа {offerSettings.SheetName}"); // Лист данных КП Excel.Worksheet offerSheet = ExcelHelper.GetSheet(_offerBook, offerSettings.SheetName); pb.Writeline("Разгруппировка строк"); ShowSheetRows(offerSheet); ListAnalysis SheetAnalysis = new ListAnalysis(_sheetProject, _CurrentProject); pb.Writeline("Адресация полей"); /// Адресация полей КП List <FieldAddress> addresslist = GetFields(offerSettings, SheetAnalysis.ColumnStartPrint); Excel.Worksheet tamplateSheet = ExcelHelper.GetSheet(_wb, "Шаблоны"); pb.Writeline("Печать заголовков"); SheetAnalysis.PrintTitle(tamplateSheet, addresslist); int lastRowOffer = offerSheet.UsedRange.Row + offerSheet.UsedRange.Rows.Count - 1; pb.Writeline("Чтение массива данных"); // Массив загружаемых данных object[,] arrData = GetArrData(offerSheet, offerSettings.RowStart, lastRowOffer); int countRows = lastRowOffer - offerSettings.RowStart + 1; pb.SetSubBarVolume(countRows); pb.Writeline("Вывод строк"); for (int i = 1; i <= countRows; i++) { pb.SubBarTick(); if (pb.IsAborted) { throw new AddInException("Процесс остановлен."); } Record offerRecord = new Record { Addresslist = addresslist }; // Сбор данных foreach (FieldAddress field in addresslist) { object val = arrData[i, field.ColumnOffer]; string text = val?.ToString() ?? ""; offerRecord.Values.Add(field.ColumnPaste, val); if (field.MappingAnalysis.Name == Project.ColumnsNames[StaticColumns.Level]) { offerRecord.Level = int.TryParse(text, out int lvl) ? lvl : 0; } if (field.MappingAnalysis.Name == Project.ColumnsNames[StaticColumns.Number]) { offerRecord.Number = text; } if (field.MappingAnalysis.Check) { offerRecord.KeyFilds.Add(text); } } SheetAnalysis.PrintRecord(offerRecord); } pb.Writeline("Группировка столбцов"); SheetAnalysis.GroupColumn(); if (pb.IsAborted) { throw new AddInException("Процесс остановлен."); } pb.Writeline("Формулы \"Комментарии Спектрум к заявке участника\""); }
/// <summary> /// Печать КП /// </summary> /// <param name="offer"></param> internal void PrintBaseEstimate(IProgressBarWithLogUI pb, string offerSettingsName) { OfferSettings offerSettings = _offerManager.Mappings.Find(s => s.Name == offerSettingsName); Excel.Worksheet offerSheet = ExcelHelper.GetSheet(_offerBook, offerSettings.SheetName); ShowSheetRows(offerSheet); _sheetProject = ExcelHelper.GetSheet(_wb, _CurrentProject.AnalysisSheetName); /// Столбец "номер п.п." OfferColumnMapping colNumber = offerSettings.Columns.Find(x => x.Name == Project.ColumnsNames[StaticColumns.Number]); int lastRow = GetLastRow(offerSheet, colNumber.ColumnSymbol); int countRows = lastRow - offerSettings.RowStart + 1; pb.SetSubBarVolume(countRows);///100-1 List <(int, int)> colPair = new List <(int projectCollumn, int offerColumn)>(); int rightColumn = 10; foreach (OfferColumnMapping col in offerSettings.Columns) { if (string.IsNullOrEmpty(col.ColumnSymbol)) { continue; } ColumnMapping projectColumn = _CurrentProject.Columns.Find(a => a.Name == col.Name); if (!string.IsNullOrWhiteSpace(projectColumn?.ColumnSymbol ?? "")) { int cnP = ExcelHelper.GetColumn(projectColumn.ColumnSymbol, _sheetProject); int cnO = ExcelHelper.GetColumn(col.ColumnSymbol, _sheetProject); colPair.Add((cnP, cnO)); if (rightColumn < cnO) { rightColumn = cnO; } } } Excel.Range RngData = offerSheet.Range[offerSheet.Cells[offerSettings.RowStart, 1], offerSheet.Cells[lastRow, rightColumn]]; object[,] arrData = RngData.Value; for (int i = 1; i <= countRows; i++) { int rowPaste = _CurrentProject.RowStart + i - 1; pb.SubBarTick(); if (pb.IsAborted) { return; } foreach ((int projectCollumn, int offerColumn) in colPair) { object val = arrData[i, offerColumn]; string text = val?.ToString() ?? ""; Excel.Range cellPrint = _sheetProject.Cells[rowPaste, projectCollumn]; if (double.TryParse(text, out double number)) { cellPrint.Value = Math.Round(number, 2); } else if (!string.IsNullOrEmpty(text)) { cellPrint.Value = text; } } } pb.ClearSubBar(); }
/// <summary> /// Перекрашивает таблицу, используя палитру. Для второго этапа /// </summary> /// <param name="ws">Лист в котором будет произведена закраска</param> /// <param name="pallets">Палитра</param> /// <param name="startRow">Начальная строка с которой идет перекраска</param> /// <param name="levelColumn">Буквенное имя столбца в котором проставлены уровни</param> /// <param name="pb">Прогресс бар. Колличество нужно инициализировать до вызова метода</param> /// <param name="columns">Набор юуквенных имен колонок (нач, кон), (начб кон)... в которых будет производится покраска</param> public static void Repaint(Excel.Worksheet ws, Dictionary <string, Excel.Range> pallets, int startRow, string levelColumn, IProgressBarWithLogUI pb, params (string, string)[] columns)
/// <summary> /// Перекрашивает таблицу, используя палитру /// </summary> /// <remarks>В палитре Range, что бы копировать весь стиль оформления установленный пользователем на листе палитры</remarks> /// <param name="ws">Лист в котором будет произведена закраска</param> /// <param name="pallet">Палитра</param> public static void Repaint(Excel.Worksheet ws, Dictionary <string, Excel.Range> pallets, IProgressBarWithLogUI pb) { Excel.Application application = ws.Application; pb.SetSubBarVolume(ws.UsedRange.Rows.Count); foreach (Excel.Range row in ws.UsedRange.Rows) { if (pb.IsAborted) { break; } pb.SubBarTick(); if (pallets.TryGetValue(row.Cells[1, 1].Text, out Excel.Range pallet)) { pallet.Copy(); row.PasteSpecial(Excel.XlPasteType.xlPasteFormats, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false); } } application.CutCopyMode = (Excel.XlCutCopyMode) 0; }