瀏覽代碼

Разработка формы для формирования диаграмм + экспорт задач с помощью Excel и Word

Данилов Денис 1 年之前
父節點
當前提交
f5f55a2e74
共有 5 個文件被更改,包括 425 次插入2 次删除
  1. 73 0
      esoft/Pages/Diagram.xaml
  2. 287 0
      esoft/Pages/Diagram.xaml.cs
  3. 9 1
      esoft/Pages/ExecutorsListPage.xaml
  4. 6 0
      esoft/Pages/ExecutorsListPage.xaml.cs
  5. 50 1
      esoft/esoft.csproj

+ 73 - 0
esoft/Pages/Diagram.xaml

@@ -0,0 +1,73 @@
+<Page x:Class="esoft.Pages.Diagram"
+      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+      xmlns:local="clr-namespace:esoft.Pages"
+      xmlns:chart="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization"
+      mc:Ignorable="d" 
+      d:DesignHeight="1000"
+      Title="Графики" Width="1920" >
+
+    <Grid Background="#e6e6e6">
+
+        <Grid.RowDefinitions>
+            <RowDefinition Height="70"/>
+            <RowDefinition Height="323*"/>
+            <RowDefinition Height="75"/>
+        </Grid.RowDefinitions>
+
+        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Height="42" Width="1900">
+
+            <Separator Width="100" Background="{x:Null}"/>
+
+            <TextBlock Text="Уровень исполнителей:" FontSize="25" FontWeight="Bold" Height="30"/>
+            <ComboBox x:Name="cmbExecuter" MinWidth="200" SelectionChanged="UpdateChar" Height="25" Margin="10, 10, 0, 0"/>
+
+            <Separator Width="50" Background="{x:Null}"/>
+
+            <TextBlock Text="Тип диаграммы:" FontSize="25" FontWeight="Bold" Height="30"/>
+            <ComboBox x:Name="cmbType" MinWidth="200" FontSize="15" HorizontalAlignment="Right" SelectionChanged="UpdateChar" Height="25" Margin="10, 10, 0, 0"/>
+
+            <Separator Width="620" Background="{x:Null}"/>
+
+            <Button Grid.Row="3" HorizontalAlignment="Right" Name="BtnClear" Content="Очистить фильтр" Width="196" Height="40" BorderThickness="0" Style="{StaticResource  StandartButtons}" Margin="12, 0, 0, -10" Click="BtnClear_Click">
+                <Button.Resources>
+                    <Style TargetType="Border">
+                        <Setter Property="CornerRadius" Value="10"/>
+                    </Style>
+                </Button.Resources>
+            </Button>
+
+        </StackPanel>
+
+        <WindowsFormsHost Grid.Row="1" Margin="10,10,10,10">
+            <chart:Chart x:Name="chartDiagram">
+                <chart:Chart.Legends>
+                    <chart:Legend/>
+                </chart:Chart.Legends>
+            </chart:Chart>
+        </WindowsFormsHost>
+
+        <StackPanel Orientation="Horizontal" Grid.Row="2">
+
+            <Button Grid.Row="3" HorizontalAlignment="Left" Name="btnExportToExcel" Content="Экспорт в Excel" Width="165" Height="40" BorderThickness="0" Style="{StaticResource  StandartButtons}" Margin="50, -10, 0, 0" Click="btnExportToExcel_Click">
+                <Button.Resources>
+                    <Style TargetType="Border">
+                        <Setter Property="CornerRadius" Value="10"/>
+                    </Style>
+                </Button.Resources>
+            </Button>
+
+            <Button Grid.Row="3" HorizontalAlignment="Left" Name="btnExportToWord" Content="Экспорт в Word" Width="165" Height="40" BorderThickness="0" Style="{StaticResource  StandartButtons}" Margin="20, -10, 0, 0" Click="btnExportToWord_Click">
+                <Button.Resources>
+                    <Style TargetType="Border">
+                        <Setter Property="CornerRadius" Value="10"/>
+                    </Style>
+                </Button.Resources>
+            </Button>
+
+        </StackPanel>
+
+    </Grid>
+</Page>

+ 287 - 0
esoft/Pages/Diagram.xaml.cs

@@ -0,0 +1,287 @@
+using esoft.Class;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Forms.DataVisualization.Charting;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Excel = Microsoft.Office.Interop.Excel;
+using Word = Microsoft.Office.Interop.Word;
+
+namespace esoft.Pages
+{
+    public partial class Diagram : Page
+    {
+        // Список уровней исполнителей
+        List<string> listLvl = new List<string>
+        {
+                "junior",
+                "middle",
+                "senior"
+        };
+
+        public Diagram()
+        {
+            InitializeComponent();
+            chartDiagram.ChartAreas.Add(new ChartArea("Основная Область"));
+
+            // Инициализация серии для диаграммы
+            var currentSeries = new Series("Исполнители")
+            {
+                IsValueShownAsLabel = true
+            };
+            chartDiagram.Series.Add(currentSeries);
+
+            // Установка источника данных для комбо-боксов
+            cmbExecuter.ItemsSource = listLvl;
+            cmbType.ItemsSource = Enum.GetValues(typeof(SeriesChartType));
+        }
+
+        private void BtnClear_Click(object sender, RoutedEventArgs e)
+        {
+            cmbExecuter.SelectedIndex = -1;
+        }
+
+        private void btnExportToExcel_Click(object sender, RoutedEventArgs e)
+        {
+            // Получение списка всех задач и списка исполнителей
+            var allTask = TaskFill.TaskFills();
+            var executer = ExecuterFill.Fill();
+
+            // Создание экземпляра приложения Excel
+            var application = new Excel.Application();
+            application.SheetsInNewWorkbook = executer.Count();
+
+            Excel.Workbook wb = application.Workbooks.Add(Type.Missing);
+
+            // Создание листов Excel для каждого исполнителя
+            for (int i = 0; i < executer.Count; i++)
+            {
+                int startRowIndex = 1;
+
+                Excel.Worksheet worksheet = application.Worksheets.Item[i + 1];
+                worksheet.Name = executer[i].FioUser;
+
+                // Заполнение заголовков таблицы
+                worksheet.Cells[1][startRowIndex] = "Дата создания";
+                worksheet.Cells[2][startRowIndex] = "Менеджер";
+                worksheet.Cells[3][startRowIndex] = "Статус задачи";
+                worksheet.Cells[4][startRowIndex] = "Тип работы";
+                worksheet.Cells[5][startRowIndex] = "Срок даты окончания";
+                worksheet.Cells[6][startRowIndex] = "Время на выполнение";
+                worksheet.Cells[7][startRowIndex] = "Время на выполнение в часах";
+                worksheet.Cells[8][startRowIndex] = "Сложность";
+
+                startRowIndex++;
+
+                // Заполнение данными каждой задачи
+                foreach (var titleTask in allTask.Where(x => x.FioUser == executer[i].FioUser))
+                {
+                    // Заполнение заголовка задачи
+                    Excel.Range headerRange = worksheet.Range[worksheet.Cells[1][startRowIndex], worksheet.Cells[8][startRowIndex]];
+                    headerRange.Merge();
+                    headerRange.Value = titleTask.Title;
+                    headerRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
+                    headerRange.Font.Italic = true;
+
+                    startRowIndex++;
+
+                    // Заполнение основных данных задачи
+                    foreach (var mainDateTask in allTask.Where(x => x.FioUser == executer[i].FioUser))
+                    {
+                        worksheet.Cells[1][startRowIndex] = mainDateTask.CreateDateTime.ToString("dd.MM.yyyy HH:mm");
+                        worksheet.Cells[2][startRowIndex] = mainDateTask.FioManager;
+                        worksheet.Cells[3][startRowIndex] = mainDateTask.Status;
+                        worksheet.Cells[4][startRowIndex] = mainDateTask.WorkType;
+                        worksheet.Cells[5][startRowIndex] = mainDateTask.Deadline.ToString("dd.MM.yyyy HH:mm");
+                        worksheet.Cells[6][startRowIndex] = mainDateTask.Time;
+
+                        worksheet.Cells[7][startRowIndex].Formula = $"=F{startRowIndex}/60";
+
+                        worksheet.Cells[8][startRowIndex] = mainDateTask.Difficulty;
+                        worksheet.Cells[8][startRowIndex].NumberFormat = "0";
+
+                        startRowIndex++;
+                    }
+                }
+
+                // Вычисление итогового количества задач
+                Excel.Range cauntTask = worksheet.Range[worksheet.Cells[1][startRowIndex], worksheet.Cells[7][startRowIndex]];
+                cauntTask.Merge();
+                cauntTask.Value = "Итоговое количество задач:";
+                cauntTask.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
+
+                worksheet.Cells[8][startRowIndex] = allTask.Where(x => x.ExecutorID == executer[i].ID).ToList().Count();
+
+                startRowIndex++;
+
+                // Установка границ таблицы
+                Excel.Range rangBorder = worksheet.Range[worksheet.Cells[1][1], worksheet.Cells[8][startRowIndex - 1]];
+                rangBorder.Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle =
+                    rangBorder.Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle =
+                    rangBorder.Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle =
+                    rangBorder.Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle =
+                    rangBorder.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle =
+                    rangBorder.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
+
+                worksheet.Columns.AutoFit();
+            }
+            application.Visible = true;
+        }
+
+        private void btnExportToWord_Click(object sender, RoutedEventArgs e)
+        {
+            // Получение списка всех задач и списка исполнителей
+            var allTask = TaskFill.TaskFills();
+            var allExecuters = ExecuterFill.Fill();
+
+            // Создание экземпляра приложения Word
+            var application = new Word.Application();
+            Word.Document document = application.Documents.Add();
+
+            // Для каждого исполнителя создается свой раздел в документе Word
+            foreach (var ex in allExecuters)
+            {
+                // Добавление заголовка раздела с именем исполнителя
+                Word.Paragraph executerParagraph = document.Paragraphs.Add();
+                Word.Range executerRange = executerParagraph.Range;
+                executerRange.Text = ex.FioUser;
+                executerParagraph.set_Style("Заголовок");
+                executerRange.InsertParagraphAfter();
+
+                // Получение списка задач для текущего исполнителя
+                List<TaskFill> executerTasks = allTask.Where(x => x.ExecutorID == ex.ID).ToList();
+                if (executerTasks.Count == 0)
+                    continue;
+
+                // Создание таблицы для отображения задач текущего исполнителя
+                Word.Paragraph tableParagraph = document.Paragraphs.Add();
+                Word.Range tableRange = tableParagraph.Range;
+                Word.Table tasksTable = document.Tables.Add(tableRange,
+                    executerTasks.Count(), 3);
+                tasksTable.Borders.InsideLineStyle = tasksTable.Borders.OutsideLineStyle
+                    = Word.WdLineStyle.wdLineStyleSingle;
+                tasksTable.Range.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
+
+                Word.Range cellRange;
+
+                // Добавление заголовков столбцов таблицы
+                cellRange = tasksTable.Cell(1, 1).Range;
+                cellRange.Text = "Название задачи";
+                cellRange = tasksTable.Cell(1, 2).Range;
+                cellRange.Text = "Крайняя дата задачи";
+                cellRange = tasksTable.Cell(1, 3).Range;
+                cellRange.Text = "Статус";
+
+                tasksTable.Rows[1].Range.Bold = 1;
+                tasksTable.Rows[1].Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
+
+                // Заполнение таблицы данными о задачах
+                for (int i = 1; i < executerTasks.Count(); i++)
+                {
+                    cellRange = tasksTable.Cell(i + 2, 1).Range;
+                    cellRange.Text = executerTasks[i].Title;
+
+                    cellRange = tasksTable.Cell(i + 2, 2).Range;
+                    cellRange.Text = executerTasks[i].Deadline.ToString();
+
+                    cellRange = tasksTable.Cell(i + 2, 3).Range;
+                    cellRange.Text = executerTasks[i].Status;
+                }
+
+                // Проверка просроченных и оставшихся задач
+                List<TaskFill> timeOutTask = executerTasks.Where(x => x.Deadline < DateTime.Now).ToList();
+                if (timeOutTask.Count > 0)
+                {
+                    // Добавление информации о просроченных задачах
+                    foreach (TaskFill task in timeOutTask)
+                    {
+                        Word.Paragraph timeOutParagraph = document.Paragraphs.Add();
+                        Word.Range timeOutRange = timeOutParagraph.Range;
+                        timeOutRange.Text = $"Задача {task.Title} просрочена на {(DateTime.Now - task.Deadline).TotalDays} дней";
+                        timeOutParagraph.set_Style("Подзаголовок");
+                        timeOutRange.Font.Color = Word.WdColor.wdColorRed;
+                        timeOutRange.InsertParagraphAfter();
+                    }
+                }
+
+                // Проверка непросроченных задач
+                List<TaskFill> noTimeOutTask = executerTasks.Where(x => x.Deadline >= DateTime.Now).ToList();
+                if (noTimeOutTask.Count > 0)
+                {
+                    // Добавление информации о непросроченных задачах
+                    foreach (TaskFill task in noTimeOutTask)
+                    {
+                        Word.Paragraph timeOutParagraph = document.Paragraphs.Add();
+                        Word.Range timeOutRange = timeOutParagraph.Range;
+                        timeOutRange.Text = $"На выполнение задачи {task.Title} осталось {(task.Deadline - DateTime.Now).TotalHours} часов";
+                        timeOutParagraph.set_Style("Intense Quote");
+                        timeOutRange.Font.Color = Word.WdColor.wdColorGreen;
+                        timeOutRange.InsertParagraphAfter();
+                    }
+                }
+
+                // Добавление разрыва страницы между разделами для каждого исполнителя
+                if (ex != allExecuters.LastOrDefault())
+                    document.Words.Last.InsertBreak(Word.WdBreakType.wdPageBreak);
+            }
+            // Отображение приложения Word
+            application.Visible = true;
+        }
+
+
+        private void UpdateChar(object sender, SelectionChangedEventArgs e)
+        {
+            // Проверка выбранного элемента в комбо-боксах cmbExecuter и cmbType
+            if (cmbExecuter.SelectedItem is string grade && cmbType.SelectedItem is SeriesChartType chartType)
+            {
+                // Получение текущей серии диаграммы
+                Series currentSeries = chartDiagram.Series.FirstOrDefault();
+
+                // Установка типа диаграммы
+                currentSeries.ChartType = chartType;
+
+                // Очистка точек текущей серии
+                currentSeries.Points.Clear();
+
+                // Получение списка исполнителей
+                var categoryList = ExecuterFill.Fill();
+
+                // Добавление точки на диаграмму для выбранного уровня исполнителя
+                currentSeries.Points.AddXY(grade, categoryList.Where(x => x.Grade == grade).Count());
+            }
+
+            // Если выбран только тип диаграммы
+            else if (cmbType.SelectedItem is SeriesChartType chartTypeTwo)
+            {
+                // Получение текущей серии диаграммы
+                Series currentSeries = chartDiagram.Series.FirstOrDefault();
+
+                // Установка типа диаграммы
+                currentSeries.ChartType = chartTypeTwo;
+
+                // Очистка точек текущей серии
+                currentSeries.Points.Clear();
+
+                // Получение списка исполнителей
+                var categoryList = ExecuterFill.Fill();
+
+                // Добавление точек на диаграмму для всех уровней исполнителей
+                foreach (var category in listLvl)
+                {
+                    currentSeries.Points.AddXY(category, categoryList.Where(x => x.Grade == category).Count());
+                }
+            }
+        }
+
+    }
+}

+ 9 - 1
esoft/Pages/ExecutorsListPage.xaml

@@ -122,6 +122,14 @@
                 </Style>
             </Button.Resources>
         </Button>
-        
+
+        <Button Grid.Row="1" HorizontalAlignment="Left" Name="BtnDiagram" Content="Формирование диаграмм" Width="255" Height="40" BorderThickness="0" Style="{StaticResource  StandartButtons}" Margin="340,805,0,0" Click="BtnDiagram_Click">
+            <Button.Resources>
+                <Style TargetType="Border">
+                    <Setter Property="CornerRadius" Value="10"/>
+                </Style>
+            </Button.Resources>
+        </Button>
+
     </Grid>
 </Page>

+ 6 - 0
esoft/Pages/ExecutorsListPage.xaml.cs

@@ -343,5 +343,11 @@ namespace esoft.Pages
                 }
             }
         }
+
+        private void BtnDiagram_Click(object sender, RoutedEventArgs e)
+        {
+            // Переход на страницу графиков
+            NavigationService.Navigate(new Pages.Diagram());
+        }
     }
 }

+ 50 - 1
esoft/esoft.csproj

@@ -53,8 +53,11 @@
     <Reference Include="System" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Security" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Core" />
@@ -64,9 +67,11 @@
     <Reference Include="System.Xaml">
       <RequiredTargetFramework>4.0</RequiredTargetFramework>
     </Reference>
+    <Reference Include="UIAutomationProvider" />
     <Reference Include="WindowsBase" />
     <Reference Include="PresentationCore" />
     <Reference Include="PresentationFramework" />
+    <Reference Include="WindowsFormsIntegration" />
     <Reference Include="Xceed.Wpf.AvalonDock, Version=4.5.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL">
       <HintPath>..\packages\Extended.Wpf.Toolkit.4.5.1\lib\net40\Xceed.Wpf.AvalonDock.dll</HintPath>
     </Reference>
@@ -150,6 +155,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Pages\Diagram.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Pages\EditPriceCoefficient.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
@@ -175,6 +184,9 @@
     <Compile Include="Pages\AddExecutorPage.xaml.cs">
       <DependentUpon>AddExecutorPage.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Pages\Diagram.xaml.cs">
+      <DependentUpon>Diagram.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Pages\EditPriceCoefficient.xaml.cs">
       <DependentUpon>EditPriceCoefficient.xaml</DependentUpon>
     </Compile>
@@ -238,7 +250,44 @@
   <ItemGroup>
     <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <COMReference Include="Microsoft.Office.Core">
+      <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
+      <VersionMajor>2</VersionMajor>
+      <VersionMinor>8</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>primary</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+    <COMReference Include="Microsoft.Office.Interop.Excel">
+      <Guid>{00020813-0000-0000-C000-000000000046}</Guid>
+      <VersionMajor>1</VersionMajor>
+      <VersionMinor>9</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>primary</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+    <COMReference Include="Microsoft.Office.Interop.Word">
+      <Guid>{00020905-0000-0000-C000-000000000046}</Guid>
+      <VersionMajor>8</VersionMajor>
+      <VersionMinor>7</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>primary</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+    <COMReference Include="VBIDE">
+      <Guid>{0002E157-0000-0000-C000-000000000046}</Guid>
+      <VersionMajor>5</VersionMajor>
+      <VersionMinor>3</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>primary</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>