|
@@ -4,11 +4,14 @@ using System.Collections.Generic;
|
|
using System.Data.Entity;
|
|
using System.Data.Entity;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text;
|
|
-using System.Windows.Forms.DataVisualization.Charting;
|
|
|
|
|
|
+using Charting = System.Windows.Forms.DataVisualization.Charting;
|
|
using CsvHelper;
|
|
using CsvHelper;
|
|
using CsvHelper.Configuration.Attributes;
|
|
using CsvHelper.Configuration.Attributes;
|
|
using System.IO;
|
|
using System.IO;
|
|
using System.Globalization;
|
|
using System.Globalization;
|
|
|
|
+using System.Windows;
|
|
|
|
+using Word = Microsoft.Office.Interop.Word;
|
|
|
|
+using System;
|
|
|
|
|
|
// https://www.c-sharpcorner.com/article/static-and-dynamic-line-chart-in-wpf-with-mvvm-pattern-using-prism-library/
|
|
// https://www.c-sharpcorner.com/article/static-and-dynamic-line-chart-in-wpf-with-mvvm-pattern-using-prism-library/
|
|
|
|
|
|
@@ -31,9 +34,14 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
public DelegateCommand StartCmd { get; set; }
|
|
public DelegateCommand StartCmd { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
- /// Команда "Экспортировать"
|
|
|
|
|
|
+ /// Команда "Экспортировать в CSV"
|
|
/// </summary>
|
|
/// </summary>
|
|
- public DelegateCommand ExportCmd { get; set; }
|
|
|
|
|
|
+ public DelegateCommand ExportCsvCmd { get; set; }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// Команда "Экспортировать в DOCX"
|
|
|
|
+ /// </summary>
|
|
|
|
+ public DelegateCommand ExportDocxCmd { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Даные для графика
|
|
/// Даные для графика
|
|
@@ -43,7 +51,7 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Интерфейс для отображения точек
|
|
/// Интерфейс для отображения точек
|
|
/// </summary>
|
|
/// </summary>
|
|
- private readonly Series SeriesInterface;
|
|
|
|
|
|
+ private readonly Charting.Series SeriesInterface;
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Фильтр по имени
|
|
/// Фильтр по имени
|
|
@@ -58,10 +66,11 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
/// </summary>
|
|
/// </summary>
|
|
public int PriceIndex { get; set; }
|
|
public int PriceIndex { get; set; }
|
|
|
|
|
|
- public EmployeeCostVM(Series series)
|
|
|
|
|
|
+ public EmployeeCostVM(Charting.Series series)
|
|
{
|
|
{
|
|
StartCmd = new DelegateCommand(StartExecuted);
|
|
StartCmd = new DelegateCommand(StartExecuted);
|
|
- ExportCmd = new DelegateCommand(ExportExecuted);
|
|
|
|
|
|
+ ExportCsvCmd = new DelegateCommand(ExportExecuted);
|
|
|
|
+ ExportDocxCmd = new DelegateCommand(ExportDocxExecuted);
|
|
Costs = new List<CostItem>();
|
|
Costs = new List<CostItem>();
|
|
SeriesInterface = series;
|
|
SeriesInterface = series;
|
|
FilterName = "";
|
|
FilterName = "";
|
|
@@ -101,6 +110,97 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 3. Profit
|
|
|
|
+ MessageBox.Show("Экспорт успешен", "Завершение", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void ExportDocxExecuted()
|
|
|
|
+ {
|
|
|
|
+ if (Costs.Count == 0)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 1. Показать диалог выбора файла
|
|
|
|
+ var ofd = new Microsoft.Win32.SaveFileDialog
|
|
|
|
+ {
|
|
|
|
+ Filter = "DOCX файлы (*.docx)|*.docx|Все файлы (*.*)|*.*"
|
|
|
|
+ };
|
|
|
|
+ bool? selected = ofd.ShowDialog();
|
|
|
|
+ if (selected == false)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ string fileName = ofd.FileName;
|
|
|
|
+
|
|
|
|
+ // 2. Сгенерировать DOCX
|
|
|
|
+ var app = new Word.Application();
|
|
|
|
+ var doc = app.Documents.Add();
|
|
|
|
+
|
|
|
|
+ // 2.1 Добавление заголовка
|
|
|
|
+ var heading = doc.Paragraphs.Add();
|
|
|
|
+ var headingRange = heading.Range;
|
|
|
|
+ headingRange.Text = "Ценность сотрудников";
|
|
|
|
+ heading.set_Style("Заголовок"); // зависит от текущего языка
|
|
|
|
+ headingRange.InsertParagraphAfter();
|
|
|
|
+
|
|
|
|
+ // 2.2 Добавление таблицы
|
|
|
|
+ var tableP = doc.Paragraphs.Add();
|
|
|
|
+ var tableRange = tableP.Range;
|
|
|
|
+ var table = doc.Tables.Add(tableRange, Costs.Count + 1, 2);
|
|
|
|
+ table.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
|
|
|
|
+ table.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
|
|
|
|
+ table.Range.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalTop;
|
|
|
|
+
|
|
|
|
+ // 2.3 Заголовок таблицы
|
|
|
|
+ table.Cell(1, 1).Range.Text = "Сотрудник";
|
|
|
|
+ table.Cell(1, 2).Range.Text = "Ценность в среднем";
|
|
|
|
+ table.Rows[1].Range.Bold = 1;
|
|
|
|
+ table.Rows[1].Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
|
|
|
+
|
|
|
|
+ // 2.4 Данные таблицы
|
|
|
|
+ int rowIndex = 2;
|
|
|
|
+ CostItem maxPriceness = null;
|
|
|
|
+ CostItem minPriceness = null;
|
|
|
|
+
|
|
|
|
+ Costs.ForEach(c =>
|
|
|
|
+ {
|
|
|
|
+ if (rowIndex == 2)
|
|
|
|
+ {
|
|
|
|
+ maxPriceness = c;
|
|
|
|
+ minPriceness = c;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ maxPriceness = c.Priceness > maxPriceness.Priceness ? c : maxPriceness;
|
|
|
|
+ minPriceness = c.Priceness < minPriceness.Priceness ? c : minPriceness;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ table.Cell(rowIndex, 1).Range.Text = c.HumanName;
|
|
|
|
+ table.Cell(rowIndex, 2).Range.Text = c.Priceness.ToString();
|
|
|
|
+
|
|
|
|
+ rowIndex++;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 2.5 Макс/мин
|
|
|
|
+ var maxP = doc.Paragraphs.Add();
|
|
|
|
+ var maxPRange = maxP.Range;
|
|
|
|
+ maxPRange.Font.Color = Word.WdColor.wdColorBlueGray;
|
|
|
|
+ maxPRange.Text = $"Сотрудник с наибольшей ценностью: {maxPriceness.HumanName} -- {maxPriceness.Priceness}";
|
|
|
|
+ maxPRange.InsertParagraphAfter();
|
|
|
|
+
|
|
|
|
+ var minP = doc.Paragraphs.Add();
|
|
|
|
+ var minPRange = minP.Range;
|
|
|
|
+ minPRange.Font.Color = Word.WdColor.wdColorBlueGray;
|
|
|
|
+ minPRange.Text = $"Сотрудник с наименьшей ценностью: {minPriceness.HumanName} -- {minPriceness.Priceness}";
|
|
|
|
+
|
|
|
|
+ // 3 Сохранение
|
|
|
|
+ doc.SaveAs2(fileName);
|
|
|
|
+ app.Visible = true;
|
|
|
|
+
|
|
|
|
+ // 4. Profit
|
|
|
|
+ MessageBox.Show("Экспорт успешен", "Завершение", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
}
|
|
|
|
|
|
private async void Refresh()
|
|
private async void Refresh()
|