using AsbCloudApp.Data.DailyReportModel; using AsbCloudInfrastructure.EfCache; using AsbCloudInfrastructure.Services.DailyReport; using ClosedXML.Excel; using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { // use ServiceFactory to make services static void Main(/*string[] args*/) { var block = new DailyReportHeadDto() { AzimuthAngle=12, WellName= "WellName", ClusterName= "clusterName", Customer="customer", Contractor="Contractor", ReportDate = DateTime.Now, WellDepthIntervalFinishDate= 27.5, WellDepthIntervalStartDate= 26.5, BottomholeDepth= 66.6 }; //------------- example ----------------- var service = new DailyReportMakerExcel(); var stream = service.MakeReportFromBlocks(block, null, null, null, null); var filename = "____.xlsx"; if (File.Exists(filename)) File.Delete(filename); using var fileStream = File.OpenWrite(filename); stream.CopyTo(fileStream); return; //------------- end of example ----------------- var block2 = new DailyReportBhaDto() { BHADescription="sadasdasdasdasdasdjlaskjdaksjdlasdlalskdklj" }; var block3 = new DailyReportSaubDto(); var ms = MakeReportFromBlocks(block,block3); //File.Create("", MakeReportFromBlocks(block)); using var file = new FileStream("file.xlsx", FileMode.Create, System.IO.FileAccess.Write); byte[] bytes = new byte[ms.Length]; ms.Read(bytes, 0, (int)ms.Length); file.Write(bytes, 0, bytes.Length); ms.Close(); } public static Stream MakeReportFromBlocks(DailyReportHeadDto blockHead, DailyReportSaubDto blockD) { using var workbook = new XLWorkbook(); FillSheet6blocks(workbook, blockHead, blockD); MemoryStream memoryStream = new MemoryStream(); workbook.SaveAs(memoryStream, new SaveOptions { }); memoryStream.Seek(0, SeekOrigin.Begin); return memoryStream; } private static String converteCellCoordinate(int row, bool isCaps, int column) { var c = (Char)((isCaps ? 65 : 97) + (column - 1)); string convertColumn = c.ToString(); return $"{convertColumn}{row}"; } private static string FormulaMechanicalSpeed((int row, int col) tuple) { return $"=IF({converteCellCoordinate(tuple.row,true,tuple.col-2)}>0," + $"{converteCellCoordinate(tuple.row,true,tuple.col-4)}/{converteCellCoordinate(tuple.row,true,tuple.col-2)},0)"; } private static string FormulaDrillingWatch((int row, int col) tuple) { return $"=IF({converteCellCoordinate(tuple.row - 8,true,tuple.col)}+" + $"{converteCellCoordinate(tuple.row - 4,true,tuple.col)}"; } private static string FormulaSinking((int row, int col) tuple) { return $"=IF(({converteCellCoordinate(tuple.row - 4,true,tuple.col)}+{converteCellCoordinate(tuple.row - 8,true,tuple.col)})" + $"<>({converteCellCoordinate(tuple.row - 54,true,tuple.col + 6)}-{converteCellCoordinate(tuple.row - 54,true,tuple.col + 4)}),\"ОШИБКА\"" + $",{converteCellCoordinate(tuple.row - 4,true,tuple.col)}+{converteCellCoordinate(tuple.row - 8,true,tuple.col)})"; //return $"=IF({converteCellCoordinate(tuple.row - 8,true,tuple.col)}+" + // $"{converteCellCoordinate(tuple.row - 4,true,tuple.col)}"; } public static void FillSheet6blocks(XLWorkbook workbook, DailyReportHeadDto blockHead, DailyReportSaubDto blockD) { var sheet = workbook.Worksheets.Add(blockHead.ReportDate.ToString("dd.MM.yyyy")); //sheet.Name = blockHead.ReportDate.ToString("dd.MM.yyyy"); var tuple = (row: 3, column: 3); sheet.Style.Font.FontName = "TimesNewRoman"; sheet.Style.Font.FontSize = 10; tuple = (AddBlockHead1(sheet, blockHead, (tuple.row, tuple.column)).row, AddBlockHead1(sheet, blockHead, (tuple.row, tuple.column)).column); AddBlockBha(sheet, blockD, tuple); //sheet.Columns().AdjustToContents(8,9); //sheet.Rows().AdjustToContents(3,21); } // private static IXLStyle SetBorder(IXLStyle style) { style.Border.RightBorder = XLBorderStyleValues.Thin; style.Border.LeftBorder = XLBorderStyleValues.Thin; style.Border.TopBorder = XLBorderStyleValues.Thin; style.Border.BottomBorder = XLBorderStyleValues.Thin; style.Border.InsideBorder = XLBorderStyleValues.Thin; return style; } private static IXLCell SetDateTime(IXLCell cell) { cell.DataType = XLDataType.DateTime; cell.Style.DateFormat.Format = "DD.MM.YYYY HH:MM:SS"; return cell; } private static IXLCell SetNumber(IXLCell cell) { cell.DataType = XLDataType.Number; cell.Style.NumberFormat.Format = "0.00"; return cell; } private static IXLCell SetCell(IXLRow row, int colunm, object value, int maxChartsToWrap = 88) { var cell = row.Cell(colunm); cell.Value = value; SetBorder(cell.Style); cell.Style.Alignment.WrapText = true; if (value is string valueString && valueString.Length > maxChartsToWrap) { var baseHeight = row.Height; row.Height = 0.82d * baseHeight * Math.Ceiling(1d + valueString.Length / maxChartsToWrap); } if (value is DateTime) { SetDateTime(cell); } else if (value is IFormattable) { SetNumber(cell); } return cell; } private static (int row, int column) AddBlockHead1(IXLWorksheet sheet, DailyReportHeadDto blockDto, (int row, int column) tupleStart) { var tuple = (row: tupleStart.row, column: tupleStart.column); sheet.Cell(tuple.row, tuple.column).Value = $"Суточная сводка бурения скважины: {blockDto.WellName}, куст: {blockDto.ClusterName}"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); tuple.row += 1; sheet.Cell(tuple.row, tuple.column).Value = $"Заказчик: {blockDto.Customer}"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); tuple.row += 1; sheet.Cell(tuple.row, tuple.column).Value = $"Подрядчик: {blockDto.Contractor}"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); tuple.row += 2; //7,3 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Отчетный период"); tuple.column += 4; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 3).Merge(); sheet.Cell(tuple.row, tuple.column+3).Style.Border.RightBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Забой за отчетный период, м"); tuple.column = tupleStart.column; tuple.row += 1; //8,3 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "От (дата, время)"); tuple.column += 2; //8,5 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "До (дата, время)"); tuple.column += 2; //8,7 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "От"); tuple.column += 2; //8,9 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "До"); sheet.Cell(tuple.row, tuple.column+1).Style.Border.RightBorder = XLBorderStyleValues.Thin; tuple.column = tupleStart.column; tuple.row += 1; //9,3 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.ReportDate}"); tuple.column += 2; //согласно формуле в шаблоне - ячейка С9 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, ""); sheet.Cell(tuple.row,tuple.column).FormulaA1 = $"={converteCellCoordinate(tuple.row, true, tuple.column - 2)}-1"; SetDateTime(sheet.Cell(tuple.row,tuple.column)); tuple.column += 2; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.WellDepthIntervalStartDate}"); tuple.column += 2; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.WellDepthIntervalFinishDate}"); tuple.column = tupleStart.column; tuple.row += 2; //11,3 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge().Style.Border.RightBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Данные по траектории скважины на конец суток"); tuple.column = tupleStart.column; tuple.row += 1;//12 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Глубина по стволу"); tuple.column += 2; //12,5 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Глубина по вертикали"); tuple.column += 2; //12,7 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Зенитный угол"); tuple.column += 2; //12,9 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge().Style.Border.RightBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Азимут"); tuple.column = tupleStart.column; tuple.row += 1; //13,3 sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.BottomholeDepth}"); tuple.column += 2; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.VerticalDepth}"); tuple.column += 2; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.ZenithAngle}"); tuple.column += 2; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge().Style.Border.RightBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.AzimuthAngle}"); tuple.column = tupleStart.column; tuple.row += 2; //15,3 sheet.Cell(tuple.row, tuple.column).Value = "Бурильщик 1 смена"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); tuple.column += 2; sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.FirstDriller}"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); tuple.row += 1; tuple.column = tupleStart.column; sheet.Cell(tuple.row, tuple.column).Value = "Бурильщик 2 смена"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); tuple.column += 2; sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.SecondDriller}"; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); tuple.row += 2; tuple.column = tupleStart.column; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); SetCell(sheet.Row(tuple.row),tuple.column,"Работа модулей САУБ:"); tuple.column += 3; SetCell(sheet.Row(tuple.row),tuple.column,"Часов:"); tuple.column += 1; SetCell(sheet.Row(tuple.row),tuple.column, "Метров:").Style.Border.RightBorder = XLBorderStyleValues.Thin; tuple.row += 1; tuple.column = tupleStart.column; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); SetCell(sheet.Row(tuple.row),tuple.column,"АПД (автоматическая подача долота), ч/м:"); tuple.column += 3; SetCell(sheet.Row(tuple.row),tuple.column,$"{blockDto.WorkTimeSAUB}"); tuple.column += 1; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.PenetrationSAUB}").Style.Border.RightBorder = XLBorderStyleValues.Thin; tuple.row += 1; tuple.column = tupleStart.column; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); SetCell(sheet.Row(tuple.row),tuple.column,"Спин Мастер (осцилляция),ч/м:"); tuple.column += 3; SetCell(sheet.Row(tuple.row),tuple.column,$"{blockDto.WorkTimeSpinMaster}"); tuple.column += 1; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.PenetrationSpinMaster}").Style.Border.RightBorder = XLBorderStyleValues.Thin; tuple.row += 1; tuple.column = tupleStart.column; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); SetCell(sheet.Row(tuple.row),tuple.column,"Торк Мастер (демпфирование), ч/:"); tuple.column += 3; SetCell(sheet.Row(tuple.row),tuple.column,$"{blockDto.WorkTimeTorkMaster}"); tuple.column += 1; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.PenetrationTorkMaster}").Style.Border.RightBorder = XLBorderStyleValues.Thin; tuple.row += 1; tuple.column = tupleStart.column; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); SetCell(sheet.Row(tuple.row),tuple.column,"МСЕ, колличество запусков, раз:"); tuple.column += 3; sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge().Style.Border.RightBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.CountLaunchesMSE}"); tuple.column+=2; return tuple; } private static (int row, int column) AddBlockBha(IXLWorksheet sheet, DailyReportSaubDto blockDto, (int row, int column) tupleStart) { tupleStart.row += 2; tupleStart.column = 3; var tuple = (row: tupleStart.row, column: tupleStart.column); sheet.Range(tuple.row, tuple.column, tuple.row,tuple.column + 7).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"Бурение в роторе : {blockDto.RotorDrillingModes}"); tuple.row+=1; sheet.Range(tuple.row, tuple.column, tuple.row,tuple.column + 7).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"Бурение в слайде : {blockDto.SlideDrillingModes}"); tuple.row+=2; sheet.Range(tuple.row, tuple.column, tuple.row,tuple.column + 7).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Бурение в роторе (за отчетный период) с использование САУБ-1"); tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Проходка"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Часы бурения"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Мех. скорость"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Среднее диф. Давление") .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.PenetrationInRotor}"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.NumberDrillingHours}"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, ""); sheet.Cell(tuple.row,tuple.column).FormulaA1 = FormulaMechanicalSpeed(tuple); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.AVGDiffDropRotor}") .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; tuple.column=tupleStart.column; tuple.row+=2; sheet.Range(tuple.row, tuple.column, tuple.row,tuple.column + 7).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Бурение в слайде (за отчетный период) с использование САУБ-1"); tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Проходка"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Часы бурения"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Мех. скорость"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Среднее диф. Давление"); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.PenetrationInSlide}"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.DrillingTimeInRotor}"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, ""); sheet.Cell(tuple.row,tuple.column).FormulaA1 = FormulaMechanicalSpeed(tuple); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.AVGDiffPressureSlide}"); tuple.column=tupleStart.column; tuple.row+=2; sheet.Range(tuple.row, tuple.column, tuple.row,tuple.column + 5).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Итого за отчетный период, использование САУБ-1"); tuple.column+=6; sheet.Range(tuple.row,tuple.column, tuple.row + 1,tuple.column + 1).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, "Плановая мех скорость"); tuple.column = tupleStart.column; tuple.row += 1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Проходка"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Часы бурения"); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Мех. скорость"); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, ""); sheet.Cell(tuple.row,tuple.column).FormulaA1 = FormulaSinking(tuple); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, ""); sheet.Cell(tuple.row,tuple.column).FormulaA1 = FormulaDrillingWatch(tuple); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, ""); tuple.column+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 1).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.SectionROPPlan}"); tuple.column=tupleStart.column; tuple.row+=2; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Увеличение мех скорости за секцию %"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, ""); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Увеличение мех скорости за сутки %"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, ""); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Сокращение времени бурения за секцию, ч"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, ""); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Ротор / слайд, %"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, ""); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "МСП за секцию м/ч."); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, ""); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Время бурения за секцию"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.SectionDrillingTimeTotal}"); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Проходка за секцию"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.SectionPenetrationTotal}"); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Кол- во наращиваний"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.ExtensionsCount}"); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge(); SetCell(sheet.Row(tuple.row),tuple.column, "Отклонение от ГГД +/-, сут"); tuple.column+=4; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 3).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"{blockDto.DeviationFromTVD}"); tuple.column=tupleStart.column; tuple.row+=1; sheet.Range(tuple.row,tuple.column, tuple.row,tuple.column + 7).Merge() .Style.Border.OutsideBorder = XLBorderStyleValues.Thin; SetCell(sheet.Row(tuple.row),tuple.column, $"Примечание: {blockDto.DeclinesReasonsROP}"); tuple.column += 7; return tuple; } } struct CellAddress { public int Col { get; set; } public int Row { get; set; } //public string GetExcelAddress() //{ //} } }