コード例 #1
0
        private void btn_Otchet_Click(object sender, EventArgs e)
        {
            // Путь к файлу шаблона
            string TemplateFileName = "Zaiavlenie.xlt";
             TemplatePath = TemplatePath + TemplateFileName;
            //string TemplatePath = TemplateFileName;
            string TemplateWorksheetName = "Отчет";

            // Константы для поиска стартовой ячейки вывода данных отчёта
            int MaxRowsToFindStart = 18;		// Просматриваемых строк
            int MaxColumnsToFindStart = 10;		// Просматриваемых столбцов

            // Переменные для перебора строк
            bool StartIsFind;					// Флаг найденного старта
            int CurrentRow;						// Текущая строка
            int CurrentColumn;					// Текущий столбец
            int StartRow;						// Стартовая строка
            int StartColumn;					// Стартовый столбец
            int clWeightDifference = 14;		// Разница по весу
            // Константы 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 = "SELECT * FROM [udf_FS_Report_Declaration] (@date1, @date2 , @pfm ,'Post') UNION ALL " +
                            " SELECT * FROM [udf_FS_Report_Declaration] (@date1 , @date2, @pfm ,'Vip') UNION ALL " +
                            " SELECT * FROM [udf_FS_Report_Declaration] (@date1, @date2, @pfm ,'Proch')";
           
            SqlCommand ExelComm = new SqlCommand(Comm, _connection);
            ExelComm.Parameters.Add("@date1", SqlDbType.DateTime).Direction = ParameterDirection.Input;
            ExelComm.Parameters["@date1"].Value = dateTimePicker2.Value.Date;

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

            ExelComm.Parameters.Add("@pfm", SqlDbType.VarChar).Direction = ParameterDirection.Input;
            ExelComm.Parameters["@pfm"].Value = _information[1];

            DataSet ds = 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 { }

            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            // Создание книги по шаблону
            ExcelApp.Workbooks.Add(TemplatePath);
            // Получение ссылки на лист отчёта
            Microsoft.Office.Interop.Excel.Worksheet ReportWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelApp.ActiveWorkbook.Worksheets[TemplateWorksheetName];
            // Поиск ячейки с которой должен начатся вывод данных
            CurrentRow = 4;
            CurrentColumn = 1;
            StartIsFind = false;
            StartRow = 1;
            StartColumn = 1;
            //ExcelApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, ExcelApp, new object[] { }); 


            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;
            }

            // Вывод данных отчёта начиная со стартовой позиции
            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, 20];

                for (DataRowNumber = 0; DataRowNumber < ds.Tables[0].Rows.Count; DataRowNumber++)
                {
                    for (DataColumnNumber = 0; DataColumnNumber < 14; 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;
                ReportWorksheet.get_Range(CellName(3, 3), CellName(3, 3)).Value2 = dateTimePicker2.Value.Date.Day + "."+ 
                    dateTimePicker2.Value.Date.Month + "." + dateTimePicker2.Value.Date.Year + "  -  " + 
                    dateTimePicker1.Value.Date.Day + "." + dateTimePicker1.Value.Date.Month + "." + 
                    dateTimePicker1.Value.Date.Year;

                string Comm2 = "SELECT PFMname FROM Users WHERE Users.PFMcode = '" + _information[1].ToString() + "'";

                SqlCommand ExelComm2 = new SqlCommand(Comm2, _connection);
                /*ExelComm2.Parameters.Add("@pfm", SqlDbType.VarChar).Direction = ParameterDirection.Input;
                ExelComm2.Parameters["@pfm"].Value = _information[1];
                */
                DataSet ds2 = new DataSet();
                object PfmName = "";
                try
                {
                    if (_connection.State != System.Data.ConnectionState.Open)
                        _connection.Open();
                    PfmName = ExelComm2.ExecuteScalar();

                    SqlDataAdapter new_dataAdapter2 = new SqlDataAdapter(ExelComm2);
                    new_dataAdapter2.Fill(ds2);
                }
                catch { }
                //MessageBox.Show(PfmName.ToString());
                //object[,] ReportDataArray2 = new object[ds2.Tables[0].Rows.Count, 1];

                ReportWorksheet.get_Range(CellName(4, 3), CellName(4, 3)).Value2 = PfmName;
                ReportWorksheet.get_Range(CellName(ds.Tables[0].Rows.Count + StartRow + 1, 3), CellName(ds.Tables[0].Rows.Count + StartRow + 1, 3)).Value2 = tb_Nach_Podr.Text;
                ExcelApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, ExcelApp, new object[] { "Format" }); 

                // Отображение отчёта на экране
                ExcelApp.Visible = true;
                this.Close();
            }
        }