예제 #1
0
        private void btn_OK_Click(object sender, EventArgs e)
        {
            // Путь к файлу шаблона
            string TemplateFileName = "ReportIncludePayments.xlt";
            //TemplatePath = TemplatePath + TemplateFileName;
            //string TemplatePath = TemplateFileName;
            string TemplateWorksheetName = "Отчет";
            string TemplateWorksheetName2 = "Отчет по декадам";
            // Константы для поиска стартовой ячейки вывода данных отчёта
            int MaxRowsToFindStart = 18;		// Просматриваемых строк
            int MaxColumnsToFindStart = 10;		// Просматриваемых столбцов

            // Переменные для перебора строк
            bool StartIsFind;					// Флаг найденного старта
            int CurrentRow;						// Текущая строка
            int CurrentColumn;					// Текущий столбец
            int StartRow;						// Стартовая строка
            int StartColumn;					// Стартовый столбец
            int clWeightDifference = 9;		// Разница по весу
            bool StartIsFind2;					// Флаг найденного старта
            int CurrentRow2;						// Текущая строка
            int CurrentColumn2;					// Текущий столбец
            int StartRow2;						// Стартовая строка
            int StartColumn2;					// Стартовый столбец
            int clWeightDifference2 = 6;		// Разница по весу
            // Константы Excel
            int xlDown = -4121;
            // Закоментированы для того, чтобы не было Warning-ов
            int clShipmentNumber = 1;			// Номер отгрузки

            int DataRowNumber;
            int DataColumnNumber;
            //string date1 = dateTimePicker2.Value.ToString();
            // string date2;
            // string pfm = _information[1];
            string Comm = "";
            string Comm2 = "";
            if(_otch_num == 2)
            Comm = "SELECT * FROM [udf_Report_Date] (@startDate,@endDate,2)";
            else
                Comm = "SELECT * FROM [udf_Report_Date] (@startDate,@endDate,1)";
            Comm2 = "SELECT * FROM [udf_ReportDecade] (@data)";

            SqlCommand ExelComm = new SqlCommand(Comm, _connection);

            ExelComm.Parameters.Add("@startDate", SqlDbType.Date).Direction = ParameterDirection.Input;
            ExelComm.Parameters["@startDate"].Value = dateTimePicker1.Value.Date;

            ExelComm.Parameters.Add("@endDate", SqlDbType.Date).Direction = ParameterDirection.Input;
            ExelComm.Parameters["@endDate"].Value = dateTimePicker2.Value.Date;

            DataSet ds = new DataSet();

            SqlCommand ExelComm2 = new SqlCommand(Comm2, _connection);
            ExelComm2.Parameters.Add("@data", SqlDbType.Date).Direction = ParameterDirection.Input;
            ExelComm2.Parameters["@data"].Value = dateTimePicker1.Value.Date;
            DataSet ds2 = new DataSet();


            try
            {
                if (_connection.State != System.Data.ConnectionState.Open)
                    _connection.Open();
                ExelComm.ExecuteNonQuery();

                SqlDataAdapter new_dataAdapter = new SqlDataAdapter(ExelComm);
                new_dataAdapter.Fill(ds);
            }
            catch { }

            try
            {
                if (_connection.State != System.Data.ConnectionState.Open)
                    _connection.Open();
                ExelComm2.ExecuteNonQuery();

                SqlDataAdapter new_dataAdapter2 = new SqlDataAdapter(ExelComm2);
                new_dataAdapter2.Fill(ds2);
            }
            catch { }

            if (ExcelApp == null)
            /*Microsoft.Office.Interop.Excel.Application*/ ExcelApp = new Microsoft.Office.Interop.Excel.Application();

            // Создание книги по шаблону
            ExcelApp.Workbooks.Add(TemplatePath + TemplateFileName);
            // Получение ссылки на лист отчёта
            Microsoft.Office.Interop.Excel.Worksheet ReportWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelApp.ActiveWorkbook.Worksheets[TemplateWorksheetName];
            Microsoft.Office.Interop.Excel.Worksheet ReportWorksheet2 = (Microsoft.Office.Interop.Excel.Worksheet)ExcelApp.ActiveWorkbook.Worksheets[TemplateWorksheetName2];
            // Поиск ячейки с которой должен начатся вывод данных
            CurrentRow = 2;
            CurrentColumn = 1;
            StartIsFind = false;
            StartRow = 1;
            StartColumn = 1;
            
            while (!StartIsFind && CurrentColumn <= MaxColumnsToFindStart)
            {
                // Поиск стартовой ячейки
                // Поиск в текущем столбце
                while (!StartIsFind && CurrentRow <= MaxRowsToFindStart)
                {
                    // Проверка текущей ячейки
                    if (ReportWorksheet.get_Range(CellName(CurrentRow, CurrentColumn), CellName(CurrentRow, CurrentColumn)).Text.ToString() == "#start")
                    {
                        StartIsFind = true;
                        StartRow = CurrentRow;
                        StartColumn = CurrentColumn;
                    }
                    // Переход к следующей ячейке
                    CurrentRow++;
                }
                // Переход к следующему столбцу
                CurrentColumn++;
                CurrentRow = 1;
            }

            //Для второго отчета
            // Поиск ячейки с которой должен начатся вывод данных
            CurrentRow2 = 2;
            CurrentColumn2 = 1;
            StartIsFind2 = false;
            StartRow2 = 1;
            StartColumn2 = 1;

            while (!StartIsFind2 && CurrentColumn2 <= MaxColumnsToFindStart)
            {
                // Поиск стартовой ячейки
                // Поиск в текущем столбце
                while (!StartIsFind2 && CurrentRow2 <= MaxRowsToFindStart)
                {
                    // Проверка текущей ячейки
                    if (ReportWorksheet2.get_Range(CellName(CurrentRow2, CurrentColumn2), CellName(CurrentRow2, CurrentColumn2)).Text.ToString() == "#start")
                    {
                        StartIsFind2 = true;
                        StartRow2 = CurrentRow2;
                        StartColumn2 = CurrentColumn2;
                    }
                    // Переход к следующей ячейке
                    CurrentRow2++;
                }
                // Переход к следующему столбцу
                CurrentColumn2++;
                CurrentRow2 = 1;
            }



            // Вывод данных отчёта начиная со стартовой позиции
            if (StartIsFind)
            {
                // Вывод данных в шаблон
                // Переход к начальной позиции вывода данных
                CurrentRow = StartRow;
                // Вывод строк из таблицы
                // Добавление нужного количества строк
                for (CurrentRow = StartRow; CurrentRow < ds.Tables[0].Rows.Count + StartRow - 1; CurrentRow++)
                {
                    ReportWorksheet.get_Range(CellName(CurrentRow, clWeightDifference), CellName(CurrentRow, clWeightDifference)).EntireRow.Insert(xlDown, true);
                }

                object[,] ReportDataArray = new object[ds.Tables[0].Rows.Count, 9];

                for (DataRowNumber = 0; DataRowNumber < ds.Tables[0].Rows.Count; DataRowNumber++)
                {
                    for (DataColumnNumber = 0; DataColumnNumber < 9; DataColumnNumber++)
                    {
                        ReportDataArray[DataRowNumber, DataColumnNumber] = ds.Tables[0].Rows[DataRowNumber][DataColumnNumber];
                    }
                }
                ReportWorksheet.get_Range(CellName(StartRow, clShipmentNumber), CellName(ds.Tables[0].Rows.Count + StartRow - 1, clWeightDifference)).Value2 = ReportDataArray;
                
                if(_otch_num == 2)
                ExcelApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, ExcelApp, new object[] { "Svodnaia" });

            }
            //Для второго отчета
            if (StartIsFind2)
            {
                // Вывод данных в шаблон
                // Переход к начальной позиции вывода данных
                CurrentRow2 = StartRow2;
                // Вывод строк из таблицы
                // Добавление нужного количества строк
                for (CurrentRow2 = StartRow2; CurrentRow2 < ds2.Tables[0].Rows.Count + StartRow2 - 1; CurrentRow2++)
                {
                    ReportWorksheet2.get_Range(CellName(CurrentRow2, clWeightDifference2), CellName(CurrentRow2, clWeightDifference2)).EntireRow.Insert(xlDown, true);
                }

                object[,] ReportDataArray2 = new object[ds2.Tables[0].Rows.Count, 6];

                for (DataRowNumber = 0; DataRowNumber < ds2.Tables[0].Rows.Count; DataRowNumber++)
                {
                    for (DataColumnNumber = 0; DataColumnNumber < 6; DataColumnNumber++)
                    {
                        ReportDataArray2[DataRowNumber, DataColumnNumber] = ds2.Tables[0].Rows[DataRowNumber][DataColumnNumber];
                    }
                }


                ReportWorksheet2.get_Range(CellName(StartRow2, clShipmentNumber), CellName(ds2.Tables[0].Rows.Count + StartRow2 - 1, clWeightDifference2)).Value2 = ReportDataArray2;
                ReportWorksheet2.get_Range(CellName(2, 3), CellName(2, 3)).Value2 = dateTimePicker1.Value.Date.Day.ToString() + "."
                                                                                    + dateTimePicker1.Value.Date.Month.ToString() + "." 
                                                                                    + dateTimePicker1.Value.Date.Year.ToString() + " - "
                                                                                    + dateTimePicker2.Value.Date.Day.ToString() + "."
                                                                                    + dateTimePicker2.Value.Date.Month.ToString() + "."
                                                                                    + dateTimePicker2.Value.Date.Year.ToString();
                }

            if (StartIsFind || StartIsFind2)
            {
                // Отображение отчёта на экране
                ExcelApp.Visible = true;

                //сохранение результатов отчета по декадам для отчета средней оценки точности
                if (MessageBox.Show("Сохранить результаты отчета по декадам?", "Сообщение", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    if (_connection != null)
                    {
                        DataSaver saver = new DataSaver(_connection);

                        string mess = saver.InsertPaymentsPlanSum(dateTimePicker1.Value.Date);

                        MessageBox.Show(mess, "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }

            this.Close();
            
        }