|
@@ -6,12 +6,23 @@ using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Windows.Forms.DataVisualization.Charting;
|
|
|
using CsvHelper;
|
|
|
+using CsvHelper.Configuration.Attributes;
|
|
|
using System.IO;
|
|
|
+using System.Globalization;
|
|
|
|
|
|
// https://www.c-sharpcorner.com/article/static-and-dynamic-line-chart-in-wpf-with-mvvm-pattern-using-prism-library/
|
|
|
|
|
|
namespace DontHarmDesktop.ViewModels.Reports
|
|
|
{
|
|
|
+ class CostItem
|
|
|
+ {
|
|
|
+ [Name("Имя")]
|
|
|
+ public string HumanName { get; set; }
|
|
|
+
|
|
|
+ [Name("Priceness")]
|
|
|
+ public int Priceness { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
public class EmployeeCostVM : BindableBase
|
|
|
{
|
|
|
/// <summary>
|
|
@@ -27,7 +38,7 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
|
/// <summary>
|
|
|
/// Даные для графика
|
|
|
/// </summary>
|
|
|
- private List<KeyValuePair<string, int>> Costs { get; set; }
|
|
|
+ private List<CostItem> Costs { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// Интерфейс для отображения точек
|
|
@@ -51,7 +62,7 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
|
{
|
|
|
StartCmd = new DelegateCommand(StartExecuted);
|
|
|
ExportCmd = new DelegateCommand(ExportExecuted);
|
|
|
- Costs = new List<KeyValuePair<string, int>>();
|
|
|
+ Costs = new List<CostItem>();
|
|
|
SeriesInterface = series;
|
|
|
FilterName = "";
|
|
|
PriceIndex = -1;
|
|
@@ -65,9 +76,10 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
|
public void ExportExecuted()
|
|
|
{
|
|
|
// 1. Показать диалог выбора файла
|
|
|
- var ofd = new Microsoft.Win32.OpenFileDialog();
|
|
|
- ofd.Multiselect = false;
|
|
|
- ofd.Filter = "CSV файлы (*.csv)|*.csv|Все файлы (*.*)|*.*";
|
|
|
+ var ofd = new Microsoft.Win32.SaveFileDialog
|
|
|
+ {
|
|
|
+ Filter = "CSV файлы (*.csv)|*.csv|Все файлы (*.*)|*.*"
|
|
|
+ };
|
|
|
bool? selected = ofd.ShowDialog();
|
|
|
if (selected == false)
|
|
|
{
|
|
@@ -76,12 +88,19 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
|
string fileName = ofd.FileName;
|
|
|
|
|
|
// 2. Сгенерировать CSV
|
|
|
- var writer = new StreamWriter(fileName);
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- Costs.ForEach(c =>
|
|
|
+ using (var writer = new StreamWriter(fileName, false, Encoding.UTF8))
|
|
|
{
|
|
|
-
|
|
|
- });
|
|
|
+ using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
|
|
+ {
|
|
|
+ csv.WriteHeader<CostItem>();
|
|
|
+ csv.NextRecord();
|
|
|
+ Costs.ForEach(c =>
|
|
|
+ {
|
|
|
+ csv.WriteRecord(c);
|
|
|
+ csv.NextRecord();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private async void Refresh()
|
|
@@ -126,16 +145,16 @@ namespace DontHarmDesktop.ViewModels.Reports
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- Costs.Add(new KeyValuePair<string, int>
|
|
|
- (
|
|
|
- u.HumanName,
|
|
|
- (int)priceness
|
|
|
- ));
|
|
|
+ Costs.Add(new CostItem
|
|
|
+ {
|
|
|
+ HumanName = u.HumanName,
|
|
|
+ Priceness = (int)priceness
|
|
|
+ });
|
|
|
});
|
|
|
|
|
|
SeriesInterface.Points.Clear();
|
|
|
Costs.ForEach(
|
|
|
- item => SeriesInterface.Points.AddXY(item.Key, item.Value)
|
|
|
+ item => SeriesInterface.Points.AddXY(item.HumanName, item.Priceness)
|
|
|
);
|
|
|
}
|
|
|
}
|