예제 #1
0
        public static bool OtchProtokolType1(Protokols_class.SGroup_class.Protokol_class Protokol, bool CreateNew = true, bool Open = true)
        {
            {
                var MsgErr = "";

                for (int i = 0; i < Protokol.MarkCount; i++)
                {
                    var PAMIndex = -1;

                    for (int j = 0; j < Protokol.SampleCount; j++)
                    {
                        if (Protokol[j][i].LocalAlow && Protokol[j][i].Method.Length > 0)
                        {
                            if (PAMIndex < 0)
                            {
                                PAMIndex = j;
                            }
                            else if (Protokol[j][i].Method != Protokol[PAMIndex][i].Method)
                            {
                                MsgErr += '\n' + Protokol[j][i].Mark + " имеет различные методы у нормативов " + T.Object.Rows.Get <string>(Protokol[j].ObjectID, C.Object.Norm, C.Norm.Name) + " и " + T.Object.Rows.Get <string>(Protokol[PAMIndex].ObjectID, C.Object.Norm, C.Norm.Name);
                            }
                        }
                    }
                }

                if (MsgErr.Length > 0)
                {
                    MessageBox.Show(MsgErr, "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }
            }

            string NewFileName;

            {
                int Month, Year;

                ATMisc.GetYearMonthFromYM(Protokol.Parent.YM, out Year, out Month);

                {
                    NewFileName = Application.StartupPath + "\\Отчеты\\";

                    if (!Directory.Exists(NewFileName))
                    {
                        Directory.CreateDirectory(NewFileName);
                    }

                    NewFileName += T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName) + "\\";

                    if (!Directory.Exists(NewFileName))
                    {
                        Directory.CreateDirectory(NewFileName);
                    }

                    NewFileName += ATMisc.GetMonthName1(Month) + "\\";

                    if (!Directory.Exists(NewFileName))
                    {
                        Directory.CreateDirectory(NewFileName);
                    }
                }

                NewFileName += ProtokolFileName(Protokol);
            }

            if (CreateNew || !File.Exists(NewFileName))
            {
                var WorkBook = ATMisc.GetGenericExcel("Протокол испытаний тип 1.xls");

                if (WorkBook == null)
                {
                    return(false);
                }

                var TitleSheet = WorkBook.GetSheet("Заголовок");
                NPOI.SS.UserModel.ISheet ByPodrSheet;

                if (TitleSheet == null)
                {
                    MessageBox.Show("В шаблоне не найден лист \"Заголовок\", вывод невозможен.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }

                if (Protokol.MarkCount == 0)
                {
                    MessageBox.Show("Заполненые показатели не найдены.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }

                var Font = WorkBook.CreateFont();
                Font.Color              = NPOI.HSSF.Util.HSSFColor.OliveGreen.Index;
                Font.IsStrikeout        = false;
                Font.FontHeightInPoints = 11;
                Font.FontName           = "Times New Roman";
                Font.Color              = short.MaxValue;

                var StyleLRTD_CC = WorkBook.CreateCellStyle();
                StyleLRTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLRTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRTD_CC.SetFont(Font);
                StyleLRTD_CC.WrapText = true;

                var ExpStyle = WorkBook.CreateCellStyle();
                ExpStyle.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                ExpStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                ExpStyle.SetFont(Font);
                ExpStyle.WrapText   = true;
                ExpStyle.DataFormat = WorkBook.CreateDataFormat().GetFormat("0.00E+00");

                var StyleLRTD_LC = WorkBook.CreateCellStyle();
                StyleLRTD_LC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Left;
                StyleLRTD_LC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRTD_LC.SetFont(Font);
                StyleLRTD_LC.WrapText = true;

                var StyleLRD_CC = WorkBook.CreateCellStyle();
                StyleLRD_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRD_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLRD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRD_CC.SetFont(Font);
                StyleLRD_CC.WrapText = true;

                var StyleLRT_CC = WorkBook.CreateCellStyle();
                StyleLRT_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRT_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRT_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRT_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLRT_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRT_CC.SetFont(Font);
                StyleLRT_CC.WrapText = true;

                var StyleRTD_CC = WorkBook.CreateCellStyle();
                StyleRTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleRTD_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleRTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleRTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleRTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleRTD_CC.SetFont(Font);
                StyleRTD_CC.WrapText = true;

                var StyleLTD_CC = WorkBook.CreateCellStyle();
                StyleLTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLTD_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLTD_CC.SetFont(Font);
                StyleLTD_CC.WrapText = true;

                var StyleTD_CC = WorkBook.CreateCellStyle();
                StyleTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleTD_CC.SetFont(Font);
                StyleTD_CC.WrapText = true;

                string UnDeleteSheetName;
                var    AddInSheetName = T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.PSG, C.PSG.Name);
                var    NormID         = Protokol[0].NormID;

                var ObjectsLocations = Protokol.ObjectsLocations;

                switch (Protokol.SGroup)
                {
                case data.SGroup.Middle1:

                    UnDeleteSheetName = "Усредненный";
                    {
                        int Index = WorkBook.GetSheetIndex(UnDeleteSheetName);
                        ByPodrSheet = WorkBook.GetSheetAt(Index);
                        WorkBook.SetSheetName(Index, "Концентрации");
                    }

                    if (ByPodrSheet == null)
                    {
                        MessageBox.Show("В шаблоне не найден лист \"" + UnDeleteSheetName + "\", вывод невозможен.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return(false);
                    }

                    var Exchange = new CellExchange_Class(ByPodrSheet);
                    {
                        var NumC  = new ATMisc.CellMark_struct("{номер}");
                        var NameC = new ATMisc.CellMark_struct("{имя точки отбора}");
                        var MarkC = new ATMisc.CellMark_struct("{показатели}");
                        var SMC   = new ATMisc.CellMark_struct("{концентрации}");

                        Exchange.AddExchange(NumC.Mark, (Cell) => { NumC.ColumnIndex = Cell.ColumnIndex; NumC.RowIndex = Cell.RowIndex; }, 1);
                        Exchange.AddExchange(NameC.Mark, (Cell) => { NameC.ColumnIndex = Cell.ColumnIndex; NameC.RowIndex = Cell.RowIndex; }, 1);
                        Exchange.AddExchange(MarkC.Mark, (Cell) => { MarkC.ColumnIndex = Cell.ColumnIndex; MarkC.RowIndex = Cell.RowIndex; }, 1);
                        Exchange.AddExchange(SMC.Mark, (Cell) => { SMC.ColumnIndex = Cell.ColumnIndex; SMC.RowIndex = Cell.RowIndex; }, 1);

                        Exchange.Exchange();

                        if (!NumC.Check() || !NameC.Check() || !MarkC.Check() || !SMC.Check())
                        {
                            return(false);
                        }

                        if (MarkC.ColumnIndex != SMC.ColumnIndex)
                        {
                            MessageBox.Show("Метки показатели и концентрации должны распологаться в одной колонке", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (MarkC.RowIndex > SMC.RowIndex)
                        {
                            MessageBox.Show("Метка показателей добжна распологаться выше метки концентраций", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (NumC.RowIndex != NameC.RowIndex || NameC.RowIndex != SMC.RowIndex)
                        {
                            MessageBox.Show("Метки номер, имя точки отбора и концентрации, должны распологаться на одной строке", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (Protokol.MarkCount > 1)
                        {
                            var MRow  = ByPodrSheet.GetRow(MarkC.RowIndex);
                            var SMRow = ByPodrSheet.GetRow(SMC.RowIndex);

                            var MStyle  = MRow.GetCell(MarkC.ColumnIndex).CellStyle;
                            var SMStyle = SMRow.GetCell(SMC.ColumnIndex).CellStyle;

                            ATMisc.BreakColumn(ByPodrSheet, MarkC.ColumnIndex, Protokol.MarkCount);

                            for (int i = 0; i < ByPodrSheet.NumMergedRegions; i++)
                            {
                                var mrg = ByPodrSheet.GetMergedRegion(i);

                                if ((mrg.FirstRow <= SMC.RowIndex && mrg.LastRow >= SMC.RowIndex ||
                                     (mrg.FirstRow <= MarkC.RowIndex && mrg.LastRow >= MarkC.RowIndex)) &&
                                    mrg.FirstColumn <= MarkC.ColumnIndex && mrg.LastColumn >= MarkC.ColumnIndex)
                                {
                                    ByPodrSheet.RemoveMergedRegion(i);
                                    i--;
                                }
                            }


                            for (int i = 0; i < Protokol.MarkCount; i++)
                            {
                                {
                                    var Cell = MRow.GetCell(MarkC.ColumnIndex + i);

                                    if (Cell == null)
                                    {
                                        Cell = MRow.CreateCell(MarkC.ColumnIndex + i);
                                    }

                                    Cell.CellStyle = MStyle;
                                }
                                {
                                    var Cell = SMRow.GetCell(SMC.ColumnIndex + i);

                                    if (Cell == null)
                                    {
                                        Cell = SMRow.CreateCell(SMC.ColumnIndex + i);
                                    }

                                    Cell.CellStyle = MStyle;
                                }
                            }
                        }

                        Exchange.AddColumn(NumC.RowIndex, NumC.ColumnIndex);
                        Exchange.AddColumn(NameC.RowIndex, NameC.ColumnIndex);

                        var Row = ByPodrSheet.GetRow(MarkC.RowIndex);

                        for (int i = 0; i < Protokol.MarkCount; i++)
                        {
                            Row.GetCell(MarkC.ColumnIndex + i).SetCellValue(Protokol.GetMarkName(i) + ", " + Protokol.GetMarkEdType(i));

                            Exchange.AddColumn(SMC.RowIndex, SMC.ColumnIndex + i);
                        }

                        Exchange.CheckTableColumns();
                    }

                    for (int i = 0; i < Protokol.TableCount; i++)
                    {
                        var Values = new object[2 + Protokol.MarkCount];

                        Values[0] = i + 1;
                        Values[1] = Protokol.GetTableName(i);

                        for (int j = 0; j < Protokol.MarkCount; j++)
                        {
                            if (Protokol.IsSpetialOut(j, i, false))
                            {
                                Values[2 + j] = Protokol.GetSpetialOut(j, i);
                            }
                            else
                            {
                                Values[2 + j] = Protokol.GetMarkAmount(j, i);
                            }
                        }

                        Exchange.SetRow(Values);
                    }
                    break;

                case data.SGroup.NotGroup1:
                {
                    ObjectsLocations = Protokol[0].SPointName;

                    UnDeleteSheetName = "Изначальный";
                    {
                        int Index = WorkBook.GetSheetIndex(UnDeleteSheetName);
                        ByPodrSheet = WorkBook.GetSheetAt(Index);
                        WorkBook.SetSheetName(Index, "Концентрации");
                    }

                    if (ByPodrSheet == null)
                    {
                        MessageBox.Show("В шаблоне не найден лист \"" + UnDeleteSheetName + "\", вывод невозможен.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return(false);
                    }

                    var OEdTypeIndex   = new SColumn_struct(-1, null);
                    var OMethodIndex   = new SColumn_struct(-1, null);
                    var OMarkNameIndex = new SColumn_struct(-1, null);
                    var NumberIndex    = new SColumn_struct(-1, null);
                    var ResultIndex    = new SColumn_struct(-1, null);
                    var LimitIndex     = new SColumn_struct(-1, null);

                    int RowIndex = -1;
                    {
                        var OEdTypeRowIndex   = -1;
                        var OMethodRowIndex   = -1;
                        var OMarkNameRowIndex = -1;
                        var NumberRowIndex    = -1;
                        var ResultRowIndex    = -1;
                        var LimitRowIndex     = -1;

                        var ExistColumn = new CellExchange_Class(ByPodrSheet);

                        ExistColumn.AddExchange("{Метка пробы}", "№ " + T.Sample.Rows.Get <string>(Protokol[0].SampleID, C.Sample.Number), 5);
                        if (NormID > 0)
                        {
                            ExistColumn.AddExchange("{Норматив}", T.Norm.Rows.Get <string>(NormID, C.Norm.Name), 5);
                        }
                        ExistColumn.AddExchange("{номер п/п}", (Cell) =>
                            {
                                NumberRowIndex = Cell.RowIndex;
                                NumberIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{показатель}", (Cell) =>
                            {
                                OMarkNameRowIndex = Cell.RowIndex;
                                OMarkNameIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{ед.изм.}", (Cell) =>
                            {
                                OEdTypeRowIndex = Cell.RowIndex;
                                OEdTypeIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{методика}", (Cell) =>
                            {
                                OMethodRowIndex = Cell.RowIndex;
                                OMethodIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{результат}", (Cell) =>
                            {
                                ResultRowIndex = Cell.RowIndex;
                                ResultIndex    = new SColumn_struct(Cell);

                                CopyStyleFromCell(ExpStyle, Cell);
                            }, 5);
                        ExistColumn.AddExchange("{лимит}", (Cell) =>
                            {
                                LimitRowIndex = Cell.RowIndex;
                                LimitIndex    = new SColumn_struct(Cell);
                            }, 5);


                        ExistColumn.Exchange(0, 25, 0, 25);

                        if (NumberRowIndex == -1 || OMarkNameRowIndex == -1 || OEdTypeRowIndex == -1 || OMethodRowIndex == -1 || ResultRowIndex == -1)
                        {
                            MessageBox.Show("Не все табличные метки найдены.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (LimitRowIndex > -1 && LimitRowIndex != NumberRowIndex || NumberRowIndex != OMarkNameRowIndex || OMarkNameRowIndex != OEdTypeRowIndex || OEdTypeRowIndex != OMethodRowIndex || OMethodRowIndex != ResultRowIndex)
                        {
                            MessageBox.Show("Все табличные метки должны распологаться в одной строке.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (NormID == 0 && LimitRowIndex > -1)
                        {
                            ByPodrSheet.SetColumnWidth(ResultIndex.Index, ByPodrSheet.GetColumnWidth(ResultIndex.Index) + ByPodrSheet.GetColumnWidth(LimitIndex.Index));
                            ByPodrSheet.SetColumnHidden(LimitIndex.Index, true);
                        }

                        RowIndex = NumberRowIndex;
                    }

                    ByPodrSheet.ShiftRows(RowIndex, ByPodrSheet.LastRowNum, Protokol.MarkCount - 1);

                    int ONumber = 0;

                    for (int i = 0; i < Protokol.MarkCount; i++)
                    {
                        var Row = ByPodrSheet.CreateRow(RowIndex++);

                        if (RowIndex > -1)
                        {
                            ATMisc.SetValue(Row, ++ONumber, NumberIndex.Index, NumberIndex.Style);
                        }

                        if (LimitIndex.Index > -1)
                        {
                            var Norm = RCache.Marks[Protokol.GetMarkID(i)].GetNorm(Protokol[0].NormID);

                            switch (Norm.NType)
                            {
                            case data.NType.Mark:
                                ATMisc.SetValue(Row, Norm.Range.Range, LimitIndex.Index, LimitIndex.Style);
                                break;

                            case data.NType.PodrV:
                            case data.NType.PodrK:
                            case data.NType.PodrAll:
                                var PIndex = RCache.Marks.Norms.GetPodrIndex(Norm.NormID, T.SPoint.Rows.Get_UnShow <uint>(Protokol[0].SPointID, C.SPoint.Podr));
                                ATMisc.SetValue(Row, Norm.Station(PIndex).Range, LimitIndex.Index, LimitIndex.Style);
                                break;

                            case data.NType.Volume:
                                var VIndex = RCache.Marks.Norms.GetVolumeIndex(Norm.NormID, T.SPoint.Rows.Get_UnShow <uint>(Protokol[0].SPointID, C.SPoint.Object, C.Object.OLocationFrom));
                                ATMisc.SetValue(Row, Norm.Volume(VIndex).Range, LimitIndex.Index, LimitIndex.Style);
                                break;
                            }
                        }

                        if (Protokol.IsSpetialOut(i))
                        {
                            ATMisc.SetValue(Row, Protokol.GetSpetialOut(i), ResultIndex.Index, ResultIndex.Style);
                        }
                        else
                        {
                            ATMisc.SetValue(Row, Protokol.GetMarkAmount(i), ResultIndex.Index, ResultIndex.Style);
                        }

                        ATMisc.SetValue(Row, Protokol.GetMethod(i), OMethodIndex.Index, OMethodIndex.Style);
                        ATMisc.SetValue(Row, Protokol.GetMarkName(i), OMarkNameIndex.Index, OMarkNameIndex.Style);
                        ATMisc.SetValue(Row, Protokol.GetMarkEdType(i), OEdTypeIndex.Index, OEdTypeIndex.Style);
                    }
                }
                break;

                case data.SGroup.Group1:
                {
                    UnDeleteSheetName = "Изначальный";
                    {
                        int Index = WorkBook.GetSheetIndex(UnDeleteSheetName);
                        ByPodrSheet = WorkBook.GetSheetAt(Index);
                        WorkBook.SetSheetName(Index, "Концентрации");
                    }

                    if (ByPodrSheet == null)
                    {
                        MessageBox.Show("В шаблоне не найден лист \"" + UnDeleteSheetName + "\", вывод невозможен.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return(false);
                    }

                    var OEdTypeIndex   = new SColumn_struct(-1, null);
                    var OMethodIndex   = new SColumn_struct(-1, null);
                    var OMarkNameIndex = new SColumn_struct(-1, null);
                    var NumberIndex    = new SColumn_struct(-1, null);
                    var ResultIndex    = new SColumn_struct(-1, null);
                    var ProbeIndex     = new SColumn_struct(-1, null);
                    var LimitIndex     = new SColumn_struct(-1, null);
                    int ProbeRowIndex  = -1;
                    int RowIndex       = -1;
                    {
                        var OEdTypeRowIndex   = -1;
                        var OMethodRowIndex   = -1;
                        var OMarkNameRowIndex = -1;
                        var NumberRowIndex    = -1;
                        var ResultRowIndex    = -1;
                        var LimitRowIndex     = -1;

                        var ExistColumn = new CellExchange_Class(ByPodrSheet);

                        if (NormID > 0)
                        {
                            ExistColumn.AddExchange("{Норматив}", T.Norm.Rows.Get <string>(NormID, C.Norm.Name), 5);
                        }
                        ExistColumn.AddExchange("{Метка пробы}", (Cell) =>
                            {
                                ProbeRowIndex = Cell.RowIndex;
                                ProbeIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{номер п/п}", (Cell) =>
                            {
                                NumberRowIndex = Cell.RowIndex;
                                NumberIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{показатель}", (Cell) =>
                            {
                                OMarkNameRowIndex = Cell.RowIndex;
                                OMarkNameIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{ед.изм.}", (Cell) =>
                            {
                                OEdTypeRowIndex = Cell.RowIndex;
                                OEdTypeIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{методика}", (Cell) =>
                            {
                                OMethodRowIndex = Cell.RowIndex;
                                OMethodIndex    = new SColumn_struct(Cell);
                            }, 5);
                        ExistColumn.AddExchange("{результат}", (Cell) =>
                            {
                                ResultRowIndex = Cell.RowIndex;
                                ResultIndex    = new SColumn_struct(Cell);

                                CopyStyleFromCell(ExpStyle, Cell);

                                ExpStyle.DataFormat = WorkBook.CreateDataFormat().GetFormat("0.00E+00");
                            }, 5);
                        ExistColumn.AddExchange("{лимит}", (Cell) =>
                            {
                                LimitRowIndex = Cell.RowIndex;
                                LimitIndex    = new SColumn_struct(Cell);
                            }, 5);

                        ExistColumn.Exchange(0, 25, 0, 25);

                        if (ProbeRowIndex == -1 || NumberRowIndex == -1 || OMarkNameRowIndex == -1 || OEdTypeRowIndex == -1 || OMethodRowIndex == -1 || ResultRowIndex == -1)
                        {
                            MessageBox.Show("Не все табличные метки найдены.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (LimitRowIndex > -1 && LimitRowIndex != NumberRowIndex || NumberRowIndex != OMarkNameRowIndex || OMarkNameRowIndex != OEdTypeRowIndex || OEdTypeRowIndex != OMethodRowIndex || OMethodRowIndex != ResultRowIndex)
                        {
                            MessageBox.Show("Все табличные метки должны распологаться в одной строке.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return(false);
                        }

                        if (LimitRowIndex > -1)
                        {
                            ByPodrSheet.SetColumnWidth(ResultIndex.Index, ByPodrSheet.GetColumnWidth(ResultIndex.Index) + ByPodrSheet.GetColumnWidth(LimitIndex.Index));
                            ByPodrSheet.SetColumnHidden(LimitIndex.Index, true);
                        }

                        RowIndex = NumberRowIndex;
                    }

                    ByPodrSheet.ShiftRows(RowIndex, ByPodrSheet.LastRowNum, Protokol.MarkCount - 1);

                    int Width = ByPodrSheet.GetColumnWidth(ResultIndex.Index) / Protokol.SampleCount;
                    ByPodrSheet.AddMergedRegion(new CellRangeAddress(RowIndex - 2, RowIndex - 2, ResultIndex.Index, ResultIndex.Index + Protokol.SampleCount - 1));

                    {
                        var Row = ByPodrSheet.GetRow(ProbeRowIndex);

                        //проверяю одинаковые ли типы воды, если да, тогда проверяю одинаковые ли места, если нет то пишу места, если да, то пишу тип

                        for (int j = 1; j < Protokol.SampleCount; j++)
                        {
                            if (T.Object.Rows.Get_UnShow <uint>(Protokol[j].ObjectID, C.Object.OType) != T.Object.Rows.Get_UnShow <uint>(Protokol[0].ObjectID, C.Object.OType))
                            {
                                goto UseOType;
                            }
                        }

                        for (int j = 1; j < Protokol.SampleCount; j++)
                        {
                            if (T.Object.Rows.Get_UnShow <uint>(Protokol[j].ObjectID, C.Object.OLocationTo) == T.Object.Rows.Get_UnShow <uint>(Protokol[0].ObjectID, C.Object.OLocationTo))
                            {
                                goto UseOType;
                            }
                        }

                        for (int j = 0; j < Protokol.SampleCount; j++)
                        {
                            ByPodrSheet.SetColumnWidth(ResultIndex.Index + j, Width);
                            ATMisc.SetValue(Row, T.Object.Rows.Get <string>(Protokol[j].ObjectID, C.Object.OLocationTo, C.OLocation.Name), ProbeIndex.Index + j, ProbeIndex.Style);
                        }

                        goto IFilled;

                        UseOType :;

                        for (int j = 0; j < Protokol.SampleCount; j++)
                        {
                            ByPodrSheet.SetColumnWidth(ResultIndex.Index + j, Width);
                            ATMisc.SetValue(Row, T.Object.Rows.Get <string>(Protokol[j].ObjectID, C.Object.OType, C.OType.Name) + " №" + Protokol[j].Number.ToString(), ProbeIndex.Index + j, ProbeIndex.Style);
                        }

                        IFilled :;

                        {           //костыльности вот прям тут. т.к. не особенно общая вещь делается: клепается объединение ячеек там где сейчас "результаты испытаний"
                            var PrevRow = ByPodrSheet.GetRow(RowIndex - 2);

                            PrevRow.GetCell(ResultIndex.Index).CellStyle = StyleLTD_CC;

                            for (int j = Protokol.SampleCount - 2; j > 0; j--)
                            {
                                PrevRow.CreateCell(ResultIndex.Index + j).CellStyle = StyleTD_CC;
                            }

                            PrevRow.CreateCell(ResultIndex.Index + Protokol.SampleCount - 1).CellStyle = StyleRTD_CC;
                        }

                        int MergeCount = ByPodrSheet.NumMergedRegions;
                        for (int i = 0; i < MergeCount; i++)
                        {
                            var Merge = ByPodrSheet.GetMergedRegion(i);

                            if (Merge.LastColumn == ResultIndex.Index)
                            {
                                ByPodrSheet.RemoveMergedRegion(i);

                                MergeCount--; i--;

                                ByPodrSheet.AddMergedRegion(new CellRangeAddress(Merge.FirstRow, Merge.LastRow, Merge.FirstColumn, ResultIndex.Index + Protokol.SampleCount - 1));
                            }
                        }
                    }

                    int TNumber = 0;

                    for (int i = 0; i < Protokol.MarkCount; i++)
                    {
                        var Row = ByPodrSheet.CreateRow(RowIndex++);

                        if (LimitIndex.Index > -1)
                        {
                            var Norm = RCache.Marks[Protokol.GetMarkID(i)].GetNorm(Protokol.GetNormID(i));

                            switch (Norm.NType)
                            {
                            case data.NType.Mark:
                                ATMisc.SetValue(Row, Norm.Range.Range, LimitIndex.Index, LimitIndex.Style);
                                break;

                            case data.NType.PodrV:
                            case data.NType.PodrK:
                            case data.NType.PodrAll:
                                var PIndex = RCache.Marks.Norms.GetPodrIndex(Norm.NormID, T.SPoint.Rows.Get_UnShow <uint>(Protokol[0].SPointID, C.SPoint.Podr));
                                ATMisc.SetValue(Row, Norm.Station(PIndex).Range, LimitIndex.Index, LimitIndex.Style);
                                break;

                            case data.NType.Volume:
                                var VIndex = RCache.Marks.Norms.GetVolumeIndex(Norm.NormID, T.SPoint.Rows.Get_UnShow <uint>(Protokol[0].SPointID, C.SPoint.Object, C.Object.OLocationTo));
                                ATMisc.SetValue(Row, Norm.Volume(VIndex).Range, LimitIndex.Index, LimitIndex.Style);
                                break;
                            }

                            for (int j = 0; j < Protokol.TableCount; j++)
                            {
                                if (Protokol.IsSpetialOut(i, j, true))
                                {
                                    ATMisc.SetValue(Row, Protokol.GetSpetialOut(i, j), ResultIndex.Index + j, ResultIndex.Style);
                                }
                                else
                                {
                                    ATMisc.SetValue(Row, Protokol.GetMarkAmount(i, j), ResultIndex.Index + j, ResultIndex.Style);
                                }
                            }
                        }
                        else
                        {
                            for (int j = 0; j < Protokol.TableCount; j++)
                            {
                                if (Protokol.IsSpetialOut(i, j))
                                {
                                    ATMisc.SetValue(Row, Protokol.GetSpetialOut(i, j), ResultIndex.Index + j, ResultIndex.Style);
                                }
                                else
                                {
                                    ATMisc.SetValue(Row, Protokol.GetMarkAmount(i, j), ResultIndex.Index + j, ResultIndex.Style);
                                }
                            }
                        }


                        ATMisc.SetValue(Row, ++TNumber, NumberIndex.Index, NumberIndex.Style);
                        ATMisc.SetValue(Row, Protokol.GetMethod(i), OMethodIndex.Index, OMethodIndex.Style);
                        ATMisc.SetValue(Row, Protokol.GetMarkName(i), OMarkNameIndex.Index, OMarkNameIndex.Style);
                        ATMisc.SetValue(Row, Protokol.GetMarkEdType(i), OEdTypeIndex.Index, OEdTypeIndex.Style);
                    }
                }
                break;

                default: throw new Exception("Неизвестный тип протокола");
                }

                for (int i = 0; i < WorkBook.NumberOfSheets; i++)
                {
                    if (WorkBook.GetSheetAt(i).SheetName.ToLower() != "заголовок" && WorkBook.GetSheetAt(i).SheetName.ToLower() != "концентрации")
                    {
                        WorkBook.RemoveSheetAt(i);
                        i--;
                    }
                }

                string PeopleNames;

                {
                    var Ppls = new List <uint>();

                    for (int i = 0; i < Protokol.SampleCount; i++)
                    {
                        for (int j = 0; j < Ppls.Count; j++)
                        {
                            if (Ppls[j] == Protokol[i].PeopleID)
                            {
                                goto Finded;
                            }
                        }

                        Ppls.Add(Protokol[i].PeopleID);

                        Finded :;
                    }

                    PeopleNames = Misc.GetShortFIO(Ppls[0]);

                    for (int i = 1; i < Ppls.Count; i++)
                    {
                        PeopleNames += ", " + Misc.GetShortFIO(Ppls[i]);
                    }
                }

                string DateO;
                string DateP;
                var    DTMin = T.Sample.Rows.Get <int>(Protokol[0].SampleID, C.Sample.CYMD);
                for (int i = 1; i < Protokol.SampleCount; i++)
                {
                    if (DTMin > T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.CYMD))
                    {
                        DTMin = T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.CYMD);
                    }
                }

                var DTMax = T.Sample.Rows.Get <int>(Protokol[0].SampleID, C.Sample.CYMD);
                for (int i = 1; i < Protokol.SampleCount; i++)
                {
                    if (DTMax < T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.CYMD))
                    {
                        DTMax = T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.CYMD);
                    }
                }
                if (DTMax == DTMin)
                {
                    DateO = ATMisc.GetDateTime(DTMax).ToShortDateString();
                }
                else
                {
                    DateO = ATMisc.GetDateTime(DTMin).ToShortDateString() + " - " + ATMisc.GetDateTime(DTMax).ToShortDateString();
                }

                DTMin = T.Sample.Rows.Get <int>(Protokol[0].SampleID, C.Sample.AYMD);
                for (int i = 1; i < Protokol.SampleCount; i++)
                {
                    if (DTMin > T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.AYMD))
                    {
                        DTMin = T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.AYMD);
                    }
                }

                DTMax = T.Sample.Rows.Get <int>(Protokol[0].SampleID, C.Sample.AYMD);
                for (int i = 1; i < Protokol.SampleCount; i++)
                {
                    if (DTMax < T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.AYMD))
                    {
                        DTMax = T.Sample.Rows.Get <int>(Protokol[i].SampleID, C.Sample.AYMD);
                    }
                }
                if (DTMax == DTMin)
                {
                    DateP = ATMisc.GetDateTime(DTMax).ToShortDateString();
                }
                else
                {
                    DateP = ATMisc.GetDateTime(DTMin).ToShortDateString() + " - " + ATMisc.GetDateTime(DTMax).ToShortDateString();
                }

                var DT = Protokol.Date;

                GetProtokolsExchanges(TitleSheet
                                      , ATMisc.GetDateTimeFromYM(Protokol.Parent.YM).Year
                                      , Protokol.Number.ToString() + "-" + T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName) + " - " + DT.Month.ToString() + "/" + DT.Year.ToString()
                                      , Protokol.Objects
                                      , Protokol.Objects
                                      , Protokol.PTypes
                                      , ObjectsLocations
                                      , DateO
                                      , DateP
                                      , Protokol.StrTime
                                      , PeopleNames
                                      , Protokol.Causes
                                      , Protokol.Numbers
                                      , DT.Day.ToString()
                                      , ATMisc.GetMonthName2(DT.Month)
                                      , DT.Month.ToString()
                                      , RCache.PSG.GetMethodName(Protokol.PodrID)
                                      , T.PaPoS.Rows.Get <string>(Protokol.PaPoSID, C.PaPoS.Name)
                                      , T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.FllName)
                                      , T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName)
                                      , T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.Contact)
                                      , Protokol.Act).Exchange(0, 25, 0, 25);
                {
                    var Exchanges = new CellExchange_Class(TitleSheet);

                    Exchanges.ClearExchanges();

                    Exchanges.AddColumn("{имя свойства}");
                    Exchanges.AddColumn("{ед. свойства}");
                    Exchanges.AddColumn("{значение свойства}");
                }
                {
                    var Exchanges = new CellExchange_Class(ByPodrSheet);

                    Exchanges.AddExchange("{должность ответственного}", T.People.Rows.Get <string>(RCache.PSG.GetPeopleID((data.PSG)T.Podr.Rows.Get_UnShow <uint>(Protokol[0].PodrID, C.Podr.PSG)), C.People.Prfssn, C.Prfssn.Name), 5);
                    Exchanges.AddExchange("{ФИО ответственного}", Misc.GetShortFIO(RCache.PSG.GetPeopleID((data.PSG)T.Podr.Rows.Get_UnShow <uint>(Protokol[0].PodrID, C.Podr.PSG))), 5);
                    Exchanges.AddExchange("{Номер протокола}", Protokol.Number.ToString() + "-" + T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName) + " - " + DT.Month.ToString() + "/" + DT.Year.ToString(), 5);
                    Exchanges.AddExchange("{Дата}", DT.ToShortDateString(), 5);

                    SetResp(Exchanges, Protokol.PodrID, data.TResp.LaboratoryProtokol);
                }

                return(SaveExcel(WorkBook, NewFileName, Open));
            }
            else
            {
                if (Open)
                {
                    System.Diagnostics.Process.Start(NewFileName);
                }

                return(true);
            }
        }
예제 #2
0
        public static bool OtchProtokolType4(Protokols_class.SGroup_class.Protokol_class Protokol, bool CreateNew = true, bool Open = true)
        {
            {
                var MsgErr = "";

                for (int i = 0; i < Protokol.MarkCount; i++)
                {
                    var PAMIndex = -1;

                    for (int j = 0; j < Protokol.SampleCount; j++)
                    {
                        if (Protokol[j][i].LocalAlow && Protokol[j][i].Method.Length > 0)
                        {
                            if (PAMIndex < 0)
                            {
                                PAMIndex = j;
                            }
                            else if (Protokol[j][i].Method != Protokol[PAMIndex][i].Method)
                            {
                                MsgErr += '\n' + Protokol[j][i].Mark + " имеет различные методы у нормативов " + T.Object.Rows.Get <string>(Protokol[j].ObjectID, C.Object.Norm, C.Norm.Name) + " и " + T.Object.Rows.Get <string>(Protokol[PAMIndex].ObjectID, C.Object.Norm, C.Norm.Name);
                            }
                        }
                    }
                }

                if (MsgErr.Length > 0)
                {
                    MessageBox.Show(MsgErr, "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }
            }

            string NewFileName;

            {
                int Month, Year;

                ATMisc.GetYearMonthFromYM(Employe_Form.SPoints.YM, out Year, out Month);

                {
                    NewFileName = Application.StartupPath + "\\Отчеты\\";

                    if (!Directory.Exists(NewFileName))
                    {
                        Directory.CreateDirectory(NewFileName);
                    }

                    NewFileName += T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName) + "\\";

                    if (!Directory.Exists(NewFileName))
                    {
                        Directory.CreateDirectory(NewFileName);
                    }

                    NewFileName += ATMisc.GetMonthName1(Month) + "\\";

                    if (!Directory.Exists(NewFileName))
                    {
                        Directory.CreateDirectory(NewFileName);
                    }
                }

                NewFileName += ProtokolFileName(Protokol);
            }

            if (CreateNew || !File.Exists(NewFileName))
            {
                var WorkBook = ATMisc.GetGenericExcel("Протокол испытаний тип 4.xls");

                if (WorkBook == null)
                {
                    return(false);
                }

                var TitleSheet = WorkBook.GetSheet("Заголовок");
                NPOI.SS.UserModel.ISheet ByPodrSheet;

                if (TitleSheet == null)
                {
                    MessageBox.Show("В шаблоне не найден лист \"Заголовок\", вывод невозможен.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }

                if (Protokol.MarkCount == 0)
                {
                    MessageBox.Show("Заполненые показатели не найдены.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);
                }

                var Font = WorkBook.CreateFont();
                Font.Color              = NPOI.HSSF.Util.HSSFColor.OliveGreen.Index;
                Font.IsStrikeout        = false;
                Font.FontHeightInPoints = 11;
                Font.FontName           = "Times New Roman";
                Font.Color              = short.MaxValue;

                var StyleLRTD_CC = WorkBook.CreateCellStyle();
                StyleLRTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLRTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRTD_CC.SetFont(Font);
                StyleLRTD_CC.WrapText = true;

                var ExpStyle = WorkBook.CreateCellStyle();
                ExpStyle.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                ExpStyle.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                ExpStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                ExpStyle.SetFont(Font);
                ExpStyle.WrapText   = true;
                ExpStyle.DataFormat = WorkBook.CreateDataFormat().GetFormat("0.00E+00");

                var StyleLRTD_LC = WorkBook.CreateCellStyle();
                StyleLRTD_LC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRTD_LC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Left;
                StyleLRTD_LC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRTD_LC.SetFont(Font);
                StyleLRTD_LC.WrapText = true;

                var StyleLRD_CC = WorkBook.CreateCellStyle();
                StyleLRD_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRD_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLRD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRD_CC.SetFont(Font);
                StyleLRD_CC.WrapText = true;

                var StyleLRT_CC = WorkBook.CreateCellStyle();
                StyleLRT_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRT_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRT_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLRT_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLRT_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLRT_CC.SetFont(Font);
                StyleLRT_CC.WrapText = true;

                var StyleLR_CC = WorkBook.CreateCellStyle();
                StyleLR_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLR_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLR_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLR_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLR_CC.SetFont(Font);
                StyleLR_CC.WrapText = true;

                var StyleRTD_CC = WorkBook.CreateCellStyle();
                StyleRTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleRTD_CC.BorderRight       = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleRTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleRTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleRTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleRTD_CC.SetFont(Font);
                StyleRTD_CC.WrapText = true;

                var StyleLTD_CC = WorkBook.CreateCellStyle();
                StyleLTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLTD_CC.BorderLeft        = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleLTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleLTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleLTD_CC.SetFont(Font);
                StyleLTD_CC.WrapText = true;

                var StyleTD_CC = WorkBook.CreateCellStyle();
                StyleTD_CC.BorderTop         = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleTD_CC.BorderBottom      = NPOI.SS.UserModel.BorderStyle.Thin;
                StyleTD_CC.Alignment         = NPOI.SS.UserModel.HorizontalAlignment.Center;
                StyleTD_CC.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                StyleTD_CC.SetFont(Font);
                StyleTD_CC.WrapText = true;

                string UnDeleteSheetName;
                string AddInSheetName = T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.PSG, C.PSG.Name);

                switch (Protokol.SGroup)
                {
                case data.SGroup.Middle4:

                    UnDeleteSheetName = "Усредненный";
                    {
                        int Index = WorkBook.GetSheetIndex(UnDeleteSheetName);
                        ByPodrSheet = WorkBook.GetSheetAt(Index);
                        WorkBook.SetSheetName(Index, "Концентрации");
                    }

                    if (ByPodrSheet == null)
                    {
                        MessageBox.Show("В шаблоне не найден лист \"" + UnDeleteSheetName + "\", вывод невозможен.", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return(false);
                    }

                    //ищу метку
                    int TableLocation = -1;
                    int ColumnsCount  = 0;
                    for (int i = 0; i < ByPodrSheet.LastRowNum + 1; i++)
                    {
                        var R = ByPodrSheet.GetRow(i);

                        if (R != null)
                        {
                            if (ColumnsCount < R.LastCellNum)
                            {
                                ColumnsCount = R.LastCellNum;
                            }

                            for (int j = 0; j < R.LastCellNum + 1; j++)
                            {
                                var Col = R.GetCell(j);
                                if (Col != null)
                                {
                                    if (Col.CellType == NPOI.SS.UserModel.CellType.String && Col.StringCellValue.ToLower() == "{таблица}")
                                    {
                                        if (j > 0)
                                        {
                                            MessageBox.Show("В листе \"" + UnDeleteSheetName + "\", положение метки таблицы не находится в первой ячейке", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                            return(false);
                                        }
                                        TableLocation = i;

                                        goto FindIt;
                                    }
                                }
                            }
                        }
                    }

                    MessageBox.Show("В листе \"" + UnDeleteSheetName + "\", не найдена метка таблицы", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return(false);

                    FindIt :;

                    var SGrps = new List <List <Protokols_class.SGroup_class.Protokol_class.Sample_class> >();
                    SGrps.Add(new List <Protokols_class.SGroup_class.Protokol_class.Sample_class>());
                    SGrps[0].Add(Protokol[0]);

                    for (int i = 1; i < Protokol.SampleCount; i++)
                    {
                        for (int j = 0; j < SGrps.Count; j++)
                        {
                            if (SGrps[j][0].OLocationToID == Protokol[i].OLocationToID)
                            {
                                SGrps[j].Add(Protokol[i]);
                                goto FindedIt;
                            }
                        }

                        SGrps.Add(new List <Protokols_class.SGroup_class.Protokol_class.Sample_class>());
                        SGrps[SGrps.Count - 1].Add(Protokol[i]);

                        FindedIt :;
                    }

                    var Grps = new Grp_class[SGrps.Count];

                    for (int i = 0; i < Grps.Length; i++)
                    {
                        Grps[i] = new Grp_class(SGrps[i], ByPodrSheet.GetColumnWidth(4));
                    }
                    {       //Разбиватель ячеек
                            //Нужно посчитать длины и объединения такого количество ячеек, чтобы их объединения умещались друг под другом как цельное кол-во ячеек
                            //к примеру 1 и 3: первую нужно распилить на три одинаковые по длине

                        /*
                         |__.___._|
                         |__|__|__|
                         * 2 и 3
                         |__._|_.__|
                         |__|_._|__|
                         * при условии ограниченной суммарной длины ячеек и равной длины ячеек каждой группы
                         */
                        //в принципе алгоритм обобщенный, можно задавать их произвольное количество

                        int StartCell = 0;

                        while (true)
                        {
                            int MinWidth = 0;
                            for (int i = 1; i < Grps.Length; i++)
                            {
                                if (Grps[i].CellWidth(StartCell) < Grps[MinWidth].CellWidth(StartCell))
                                {
                                    MinWidth = i;
                                }
                            }
                            for (int i = 0; i < Grps.Length; i++)
                            {
                                if (Grps[i].CellCount - 1 != StartCell)
                                {
                                    goto TryNext;
                                }
                            }
                            break;
                            TryNext :;

                            for (int i = 0; i < Grps.Length; i++)
                            {
                                if (i != MinWidth)
                                {
                                    Grps[i].CellSplit(StartCell, Grps[MinWidth].CellWidth(StartCell));
                                }
                            }

                            StartCell++;
                        }
                    }
                    {
                        //заношу полученные длины колонок

                        for (int i = 0; i < Grps[0].CellCount; i++)
                        {
                            ByPodrSheet.SetColumnWidth(4 + i, Grps[0].CellWidth(i));
                        }

                        {
                            int LastColumnIndex = 4 + Grps[0].CellCount;

                            for (int i = ByPodrSheet.NumMergedRegions - 1; i > -1; i--)
                            {
                                var Merged = ByPodrSheet.GetMergedRegion(i);

                                if (Merged.FirstColumn > 3 && Merged.LastColumn > 3)
                                {
                                    ByPodrSheet.AddMergedRegion(
                                        new CellRangeAddress(Merged.FirstRow
                                                             , Merged.LastRow
                                                             , NewColumnIndex(Merged.FirstColumn, ColumnsCount, LastColumnIndex)
                                                             , NewColumnIndex(Merged.LastColumn, ColumnsCount, LastColumnIndex)));

                                    ByPodrSheet.RemoveMergedRegion(i);
                                }
                                else if (Merged.LastColumn > 3)
                                {
                                    ByPodrSheet.AddMergedRegion(
                                        new CellRangeAddress(Merged.FirstRow
                                                             , Merged.LastRow
                                                             , Merged.FirstColumn
                                                             , NewColumnIndex(Merged.LastColumn, ColumnsCount, LastColumnIndex)));

                                    ByPodrSheet.RemoveMergedRegion(i);
                                }
                            }

                            for (int i = 0; i < ByPodrSheet.LastRowNum + 1; i++)
                            {
                                var R = ByPodrSheet.GetRow(i);

                                if (R != null)
                                {
                                    for (int j = R.LastCellNum - 1; j > 3; j--)
                                    {
                                        var Col = R.GetCell(j);

                                        if (Col != null)
                                        {
                                            int NewIndex = NewColumnIndex(Col.ColumnIndex, ColumnsCount, LastColumnIndex);

                                            if (NewIndex != Col.ColumnIndex)
                                            {
                                                var TCell = R.GetCell(NewIndex);      //баг в библиотеке
                                                if (TCell == null)
                                                {
                                                    TCell = R.CreateCell(NewIndex);
                                                }

                                                R.RemoveCell(TCell);

                                                R.MoveCell(Col, NewIndex);
                                            }
                                        }
                                    }
                                }
                            }

                            ByPodrSheet.ShiftRows(TableLocation, ByPodrSheet.LastRowNum, Protokol.MarkCount * SGrps.Count + 3 * SGrps.Count + SGrps.Count - 2);      //количество показателей в таблицах + заголовки и расстояния между таблицами
                        }

                        int StartRowIndex = TableLocation;

                        for (int i = 0; i < Grps.Length; i++)
                        {
                            var Row = ByPodrSheet.CreateRow(StartRowIndex);
                            //Основной заголовок
                            ATMisc.SetValue(Row, "№ п/п", 0, StyleLRT_CC);
                            ByPodrSheet.AddMergedRegion(new CellRangeAddress(StartRowIndex, StartRowIndex + 2, 0, 0));

                            ATMisc.SetValue(Row, "Показатели", 1, StyleLRT_CC);
                            ByPodrSheet.AddMergedRegion(new CellRangeAddress(StartRowIndex, StartRowIndex + 2, 1, 1));

                            ATMisc.SetValue(Row, "Ед.изм.", 2, StyleLRT_CC);
                            ByPodrSheet.AddMergedRegion(new CellRangeAddress(StartRowIndex, StartRowIndex + 2, 2, 2));

                            ATMisc.SetValue(Row, "НД на методику", 3, StyleLRT_CC);
                            ByPodrSheet.AddMergedRegion(new CellRangeAddress(StartRowIndex, StartRowIndex + 2, 3, 3));

                            ATMisc.SetValue(Row, "Результаты испытаний", 4, Grps[i].CellCount + 3, StyleLTD_CC, StyleTD_CC, StyleRTD_CC);

                            Row = ByPodrSheet.CreateRow(++StartRowIndex);
                            ATMisc.SetValue(Row, "", 0, StyleLR_CC);
                            ATMisc.SetValue(Row, "", 1, StyleLR_CC);
                            ATMisc.SetValue(Row, "", 2, StyleLR_CC);
                            ATMisc.SetValue(Row, "", 3, StyleLR_CC);
                            ATMisc.SetValue(Row, Grps[i].OLocationName, 4, Grps[i].CellCount + 3, StyleLTD_CC, StyleTD_CC, StyleRTD_CC);

                            Row = ByPodrSheet.CreateRow(++StartRowIndex);
                            ATMisc.SetValue(Row, "", 0, StyleLR_CC);
                            ATMisc.SetValue(Row, "", 1, StyleLR_CC);
                            ATMisc.SetValue(Row, "", 2, StyleLR_CC);
                            ATMisc.SetValue(Row, "", 3, StyleLR_CC);

                            {    //Заголовки замеров
                                int s = 0;

                                for (int k = 0; k < Grps[i].SampleCount; k++)
                                {
                                    int KNum = s;

                                    for (s = KNum + 1; s < Grps[i].CellCount; s++)
                                    {
                                        if (Grps[i].GetSetIn(s))
                                        {
                                            break;
                                        }
                                    }

                                    if (KNum < s - 1)
                                    {
                                        ATMisc.SetValue(Row, "№ " + Grps[i].GetSample(k).Number.ToString(), 4 + KNum, 3 + s, StyleLTD_CC, StyleTD_CC, StyleRTD_CC);
                                    }
                                    else
                                    {
                                        ATMisc.SetValue(Row, "№ " + Grps[i].GetSample(k).Number.ToString(), 4 + KNum, StyleLRTD_CC);
                                    }
                                }
                            }
                            int MarkNumber = 0;

                            for (int j = 0; j < Protokol.TotalMarkCount; j++)
                            {
                                if (Protokol.GetTotalAlowedMark(j))
                                {
                                    MarkNumber++;
                                    Row = ByPodrSheet.CreateRow(++StartRowIndex);
                                    int s = 0;

                                    for (int k = 0; k < Grps[i].SampleCount; k++)
                                    {
                                        //заношу данные показателя
                                        ATMisc.SetValue(Row, MarkNumber, 0, StyleLRTD_CC);
                                        ATMisc.SetValue(Row, Protokol.GetTotalMarkName(j), 1, StyleLRTD_CC);
                                        ATMisc.SetValue(Row, Protokol.GetTotalMarkEdType(j), 2, StyleLRTD_CC);
                                        ATMisc.SetValue(Row, RCache.Marks[Protokol.GetTotalMarkID(j)].GetNorm(Grps[i].GetSample(k).NormID).MethodName, 3, StyleLRTD_CC);

                                        //заношу данные концентраций
                                        int KNum = s;

                                        for (s = KNum + 1; s < Grps[i].CellCount; s++)
                                        {
                                            if (Grps[i].GetSetIn(s))
                                            {
                                                break;
                                            }
                                        }

                                        if (KNum < s - 1)
                                        {
                                            ATMisc.SetValue(Row, Grps[i].GetSample(k)[j].Amount, 4 + KNum, 3 + s, StyleLTD_CC, StyleTD_CC, StyleRTD_CC);
                                        }
                                        else
                                        {
                                            ATMisc.SetValue(Row, Grps[i].GetSample(k)[j].Amount, 4 + KNum, StyleLRTD_CC);
                                        }
                                    }
                                }
                            }

                            StartRowIndex += 2;
                        }
                    }

                    break;

                default: throw new Exception("Неизвестный тип протокола");
                }

                for (int i = 0; i < WorkBook.NumberOfSheets; i++)
                {
                    if (WorkBook.GetSheetAt(i).SheetName.ToLower() != "заголовок" && WorkBook.GetSheetAt(i).SheetName.ToLower() != "концентрации")
                    {
                        WorkBook.RemoveSheetAt(i);
                        i--;
                    }
                }

                var         DT      = Protokol.Date;
                SelectHuman _shuman = new SelectHuman();
                Dictionary <string, int> _prtObject = new Dictionary <string, int>(); // Нужно для сверки имя объекта
                G.Object.QUERRY().SHOW.DO();
                int    _objC    = G.Object.Rows.Count;
                string _Papos   = string.Empty;
                string _Address = string.Empty;
                string _objName = string.Empty;
                string _object  = string.Empty;
                string _norm    = string.Empty;
                int    OTypeID  = 0;
                int    count    = 0;
                for (int i = 0; i < _objC; i++)
                {
                    _prtObject.Add(G.Object.Rows.Get_UnShow <string>(i, C.Object.Name).ToLower(),
                                   G.Object.Rows.Get_UnShow <int>(i, C.Object.OType)
                                   );
                    if (Protokol.ProtoType == "Колодец\\Шламонакопитель")
                    {
                        _objName = Protokol.Objects.Remove(Protokol.Objects.IndexOf(','));
                    }
                    if (_prtObject.ContainsKey(_objName))
                    {
                        OTypeID = _prtObject[_objName];
                    }
                    if (OTypeID == 6)
                    {
                        G.PlaceSelection.QUERRY().SHOW.
                        WHERE.
                        C(C.PlaceSelection.OType, OTypeID).AND.
                        C(C.PlaceSelection.Object, Protokol.ObjectID).AND.
                        C(C.PlaceSelection.Podr, Protokol.PodrID).DO();
                        count    = G.PlaceSelection.Rows.Count;
                        _Address = G.PlaceSelection.Rows.Get_UnShow <string>(0, C.PlaceSelection.Adress);
                        _Papos   = G.PaPoS.Rows.Get_UnShow <string>(G.PlaceSelection.Rows.Get_UnShow <int>(0, C.PlaceSelection.PaPoS) - 1, C.PaPoS.Name);
                        _norm    = G.Norm.Rows.Get_UnShow <string>(G.PlaceSelection.Rows.Get_UnShow <int>(0, C.PlaceSelection.Norm) - 1, C.Norm.Name);
                    }
                }
                _shuman.ShowDialog();
                if (_object == "")
                {
                    _object = G.Object.Rows.Get_UnShow <string>(Protokol.ObjectID, C.Object.OType, C.OType.Name);
                }
                GetProtokolsExchanges(TitleSheet
                                      , ATMisc.GetDateTimeFromYM(Employe_Form.SPoints.YM).Year
                                      , Protokol.Number.ToString() + "-" + T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName) + " - " + DT.Month.ToString() + "/" + DT.Year.ToString()
                                      , _object.ToLower()
                                      , _object.ToLower()
                                      , Protokol.PTypes.ToLower()
                                      , _Address
                                      , Protokol.DateOstr
                                      , Protokol.DateP
                                      , Protokol.StrTime
                                      , _probsHuman
                                      , Protokol.Causes
                                      , Protokol.Numbers
                                      , DT.Day.ToString()
                                      , ATMisc.GetMonthName2(DT.Month)
                                      , DT.Month.ToString()
                                      , _norm
                                      , _Papos
                                      , T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.FllName)
                                      , T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName)
                                      , T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.Contact)
                                      , 0).Exchange(0, 25, 0, 25);
                {
                    var Exchanges = new CellExchange_Class(TitleSheet);

                    Exchanges.ClearExchanges();

                    Exchanges.AddColumn("{имя свойства}");
                    Exchanges.AddColumn("{ед. свойства}");
                    Exchanges.AddColumn("{значение свойства}");
                }

                {
                    var Exchanges = new CellExchange_Class(ByPodrSheet);

                    Exchanges.AddExchange("{должность ответственного}", T.People.Rows.Get <string>(RCache.PSG.GetPeopleID((data.PSG)T.Podr.Rows.Get_UnShow <uint>(Protokol[0].PodrID, C.Podr.PSG)), C.People.Prfssn, C.Prfssn.Name), 5);
                    Exchanges.AddExchange("{ФИО ответственного}", Misc.GetShortFIO(RCache.PSG.GetPeopleID((data.PSG)T.Podr.Rows.Get_UnShow <uint>(Protokol[0].PodrID, C.Podr.PSG))), 5);
                    Exchanges.AddExchange("{Номер протокола}", Protokol.Number.ToString() + "-" + T.Podr.Rows.Get <string>(Protokol.PodrID, C.Podr.ShrName) + " - " + DT.Month.ToString() + "/" + DT.Year.ToString(), 5);
                    Exchanges.AddExchange("{Дата}", DT.ToShortDateString(), 5);
                    Exchanges.AddExchange("{должность ответственного 2}", _secondSubsPosition, 5);
                    Exchanges.AddExchange("{ФИО ответственного 2}", _secondSubsPFIO, 5);

                    SetResp(Exchanges, Protokol.PodrID, data.TResp.LaboratoryProtokol);
                }

                return(SaveExcel(WorkBook, NewFileName, Open));
            }
            else
            {
                if (Open)
                {
                    System.Diagnostics.Process.Start(NewFileName);
                }

                return(true);
            }
        }