Merge pull request #14 from schebotar/dev

Dev
This commit is contained in:
Serghei Cebotari 2022-02-01 20:33:33 +03:00 committed by GitHub
commit 180807d749
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 165 additions and 208 deletions

View File

@ -1,8 +1,8 @@
using Microsoft.Win32; using Microsoft.Win32;
using System.IO;
using RehauSku.Forms; using RehauSku.Forms;
using System;
using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using ExcelDna.Integration;
namespace RehauSku namespace RehauSku
{ {
@ -24,22 +24,27 @@ namespace RehauSku
RootKey.Close(); RootKey.Close();
} }
public static bool IsPriceListPathEmpty()
{
return string.IsNullOrEmpty(priceListPath);
}
public static string PriceListPath public static string PriceListPath
{ {
get get
{ {
if (IsPriceListPathEmpty() || !File.Exists(priceListPath)) if (string.IsNullOrEmpty(priceListPath) || !File.Exists(priceListPath))
{ {
//MessageBox.Show("Прайс-лист отсутствует или неверный файл прайс-листа", "Укажите файл прайс-листа", MessageBoxButtons.OK, MessageBoxIcon.Warning); DialogResult result = MessageBox.Show("Прайс-лист отсутствует или неверный файл шаблона прайс-листа. " +
string fileName = Dialog.GetFilePath(); "Укажите файл шаблона прайс-листа.",
priceListPath = fileName; "Нет файла шаблона",
RootKey.SetValue("PriceListPath", fileName); MessageBoxButtons.OK, MessageBoxIcon.Warning);
return priceListPath;
if (result == DialogResult.OK)
{
string fileName = Dialog.GetFilePath();
priceListPath = fileName;
RootKey.SetValue("PriceListPath", fileName);
return priceListPath;
}
else
throw new Exception("Нет файла шаблона");
} }
else else

View File

@ -9,8 +9,6 @@ namespace RehauSku.PriceListTools
public void FillTarget() public void FillTarget()
{ {
ExcelApp.ScreenUpdating = false;
foreach (Source source in SourceFiles) foreach (Source source in SourceFiles)
{ {
TargetFile.Sheet.Columns[TargetFile.amountCell.Column] TargetFile.Sheet.Columns[TargetFile.amountCell.Column]
@ -21,11 +19,11 @@ namespace RehauSku.PriceListTools
newColumnHeader.Value2 = $"{source.Name}"; newColumnHeader.Value2 = $"{source.Name}";
newColumnHeader.WrapText = true; newColumnHeader.WrapText = true;
FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column - 1, TargetFile.amountCell.Column); foreach(var kvp in source.PositionAmount)
FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column - 1, TargetFile.amountCell.Column);
} }
FilterByAmount(); FilterByAmount();
ExcelApp.ScreenUpdating = true;
Forms.Dialog.SaveWorkbookAs(); Forms.Dialog.SaveWorkbookAs();
} }

View File

@ -26,10 +26,10 @@ namespace RehauSku.PriceListTools
public void FillTarget() public void FillTarget()
{ {
ExcelApp.ScreenUpdating = false; foreach (var kvp in Current.PositionAmount)
FillColumnsWithDictionary(Current.PositionAmount, TargetFile.amountCell.Column); FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column);
FilterByAmount(); FilterByAmount();
ExcelApp.ScreenUpdating = true;
Forms.Dialog.SaveWorkbookAs(); Forms.Dialog.SaveWorkbookAs();
} }

View File

@ -7,7 +7,7 @@ namespace RehauSku.PriceListTools
{ {
internal class ExportTool : PriceListTool internal class ExportTool : PriceListTool
{ {
private Dictionary<string, double> SkuAmount { get; set; } private Dictionary<Position, double> PositionAmount;
private Range Selection; private Range Selection;
public void TryGetSelection() public void TryGetSelection()
@ -22,59 +22,23 @@ namespace RehauSku.PriceListTools
public void FillTarget() public void FillTarget()
{ {
ExcelApp.ScreenUpdating = false;
GetSelected(); GetSelected();
FillColumn(SkuAmount, TargetFile.amountCell.Column);
foreach (var kvp in PositionAmount)
{
FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column);
}
FilterByAmount(); FilterByAmount();
ExcelApp.ScreenUpdating = true;
Forms.Dialog.SaveWorkbookAs(); Forms.Dialog.SaveWorkbookAs();
} }
private void FillColumn(IEnumerable<KeyValuePair<string, double>> dictionary, int column)
{
List<KeyValuePair<string, double>> missing = new List<KeyValuePair<string, double>>();
foreach (var kvp in dictionary)
{
Range cell = TargetFile.skuCell.EntireColumn.Find(kvp.Key);
if (cell == null)
{
missing.Add(kvp);
}
else
{
Range sumCell = TargetFile.Sheet.Cells[cell.Row, column];
if (sumCell.Value2 == null)
{
sumCell.Value2 = kvp.Value;
}
else
{
sumCell.Value2 += kvp.Value;
}
}
}
if (missing.Count > 0)
{
System.Windows.Forms.MessageBox.Show
($"{missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?",
"Отсутствует позиция в конечной таблице заказов",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Information);
}
}
private void GetSelected() private void GetSelected()
{ {
object[,] cells = Selection.Value2; object[,] cells = Selection.Value2;
SkuAmount = new Dictionary<string, double>(); PositionAmount = new Dictionary<Position, double>();
int rowsCount = Selection.Rows.Count; int rowsCount = Selection.Rows.Count;
for (int row = 1; row <= rowsCount; row++) for (int row = 1; row <= rowsCount; row++)
@ -111,13 +75,16 @@ namespace RehauSku.PriceListTools
continue; continue;
} }
if (SkuAmount.ContainsKey(sku)) Position position = new Position(null, sku, null);
if (PositionAmount.ContainsKey(position))
{ {
SkuAmount[sku] += amount.Value; PositionAmount[position] += amount.Value;
} }
else else
{ {
SkuAmount.Add(sku, amount.Value); PositionAmount.Add(position, amount.Value);
} }
} }
} }

View File

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace RehauSku.PriceListTools namespace RehauSku.PriceListTools
{ {
@ -9,15 +8,13 @@ namespace RehauSku.PriceListTools
public void FillTarget() public void FillTarget()
{ {
ExcelApp.ScreenUpdating = false;
foreach (Source source in SourceFiles) foreach (Source source in SourceFiles)
{ {
FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column); foreach (var kvp in source.PositionAmount)
FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column);
} }
FilterByAmount(); FilterByAmount();
ExcelApp.ScreenUpdating = true;
Forms.Dialog.SaveWorkbookAs(); Forms.Dialog.SaveWorkbookAs();
} }

View File

@ -13,5 +13,4 @@
Name = name; Name = name;
} }
} }
} }

View File

@ -11,7 +11,6 @@ namespace RehauSku.PriceListTools
{ {
protected private Application ExcelApp = (Application)ExcelDnaUtil.Application; protected private Application ExcelApp = (Application)ExcelDnaUtil.Application;
protected private Target TargetFile; protected private Target TargetFile;
protected private List<KeyValuePair<Position, double>> Missing;
public void OpenNewPrice() public void OpenNewPrice()
{ {
@ -34,75 +33,15 @@ namespace RehauSku.PriceListTools
} }
} }
protected private void FillColumnsWithDictionary(IEnumerable<KeyValuePair<Position, double>> dictionary, params int[] columns) protected private void FillColumnsWithDictionary(KeyValuePair<Position, double> positionAmount, params int[] columns)
{ {
Missing = new List<KeyValuePair<Position, double>>(); int? row = GetPositionRow(positionAmount.Key.Sku, positionAmount.Key.Group, TargetFile.skuCell.Column);
foreach (var positionAmount in dictionary) if (row != null)
{ {
FillPositionAmountToColumns(positionAmount, columns); foreach (int column in columns)
}
if (Missing.Count > 0)
{
DialogResult result =
MessageBox.Show
($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?",
"Отсутствует позиция в конечной таблице заказов",
MessageBoxButtons.YesNo,
MessageBoxIcon.Information);
if (result == DialogResult.Yes)
{ {
var lookUp = new List<KeyValuePair<Position, double>>(Missing); Range sumCell = TargetFile.Sheet.Cells[row, column];
foreach (var missingPosition in lookUp)
{
TryFillVariantlessSkuToColumns(missingPosition, columns);
}
}
}
if (Missing.Count > 0)
{
FillMissing();
MessageBox.Show
($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath}\n" +
$"Под основной таблицей составлен список не найденных артикулов",
"Отсутствует позиция в конечной таблице заказов",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
protected private void FillPositionAmountToColumns(KeyValuePair<Position, double> positionAmount, int[] columns)
{
Range foundCell = TargetFile.skuCell.EntireColumn.Find(positionAmount.Key.Sku);
if (foundCell == null)
{
Missing.Add(positionAmount);
return;
}
string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
while (foundCell != null && foundCellGroup != positionAmount.Key.Group)
{
foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
}
if (foundCell == null)
{
Missing.Add(positionAmount);
}
else
{
foreach (var column in columns)
{
Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
if (sumCell.Value2 == null) if (sumCell.Value2 == null)
{ {
@ -115,73 +54,113 @@ namespace RehauSku.PriceListTools
} }
} }
} }
}
protected private void TryFillVariantlessSkuToColumns(KeyValuePair<Position, double> positionAmount, int[] columns) else
{
string sku = positionAmount.Key.Sku.Substring(1, 6);
Range foundCell = TargetFile.skuCell.EntireColumn.Find(sku);
if (foundCell == null)
{ {
return; string sku = positionAmount.Key.Sku.Substring(1, 6);
}
string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString(); row = GetPositionRow(sku, positionAmount.Key.Group, TargetFile.skuCell.Column);
while (foundCell != null && foundCellGroup != positionAmount.Key.Group) if (row != null)
{
foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
}
if (foundCell == null)
{
return;
}
foreach (var column in columns)
{
Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
if (sumCell.Value2 == null)
{ {
sumCell.Value2 = positionAmount.Value; foreach (int column in columns)
{
Range amountCell = TargetFile.Sheet.Cells[row, column];
if (amountCell.Value2 == null)
{
amountCell.Value2 = positionAmount.Value;
}
else
{
amountCell.Value2 += positionAmount.Value;
}
Range oldSkuCell = TargetFile.Sheet.Cells[row, TargetFile.oldSkuCell.Column];
oldSkuCell.Value2 = positionAmount.Key.Sku;
}
} }
else else
{ {
sumCell.Value2 += positionAmount.Value; FillMissing(positionAmount, columns);
} }
} }
Missing.Remove(positionAmount);
} }
protected private void FillMissing() protected private void FillMissing(KeyValuePair<Position, double> positionAmount, params int[] columns)
{ {
int startRow = Range foundCell = TargetFile.oldSkuCell.EntireColumn.Find(positionAmount.Key.Sku);
TargetFile.Sheet.AutoFilter.Range.Row + int row;
TargetFile.Sheet.AutoFilter.Range.Rows.Count + 5;
for (int i = 0; i < Missing.Count; i++) if (foundCell == null)
{ {
Range group = TargetFile.Sheet.Cells[startRow + i, TargetFile.groupCell.Column]; row = TargetFile.Sheet.Cells[TargetFile.Sheet.Rows.Count, TargetFile.skuCell.Column]
Range sku = TargetFile.Sheet.Cells[startRow + i, TargetFile.skuCell.Column]; .End[XlDirection.xlUp]
Range name = TargetFile.Sheet.Cells[startRow + i, TargetFile.nameCell.Column]; .Row + 1;
Range amount = TargetFile.Sheet.Cells[startRow + i, TargetFile.amountCell.Column];
group.Value2 = Missing[i].Key.Group; TargetFile.Sheet.Rows[row]
sku.Value2 = Missing[i].Key.Sku; .EntireRow
name.Value2 = Missing[i].Key.Name; .Insert(XlInsertShiftDirection.xlShiftDown, XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
amount.Value2 = Missing[i].Value;
group.ClearFormats(); Range previous = TargetFile.Sheet.Rows[row - 1];
sku.ClearFormats(); Range current = TargetFile.Sheet.Rows[row];
name.ClearFormats();
amount.ClearFormats(); previous.Copy(current);
current.ClearContents();
TargetFile.Sheet.Cells[row, TargetFile.groupCell.Column].Value2 = positionAmount.Key.Group;
TargetFile.Sheet.Cells[row, TargetFile.oldSkuCell.Column].Value2 = positionAmount.Key.Sku;
TargetFile.Sheet.Cells[row, TargetFile.nameCell.Column].Value2 = positionAmount.Key.Name;
TargetFile.Sheet.Cells[row, TargetFile.skuCell.Column].Value2 = "Не найден";
} }
else
{
row = foundCell.Row;
}
foreach (int column in columns)
{
if (TargetFile.Sheet.Cells[row, column].Value2 == null)
{
TargetFile.Sheet.Cells[row, column].Value2 = positionAmount.Value;
}
else
{
TargetFile.Sheet.Cells[row, column].Value2 += positionAmount.Value;
}
}
}
protected private int? GetPositionRow(string sku, string group, int column)
{
int? row = null;
Range foundCell = TargetFile.Sheet.Columns[column].Find(sku);
string foundGroupValue;
if (foundCell == null) return null;
else
{
row = foundCell.Row;
foundGroupValue = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
}
if (string.IsNullOrEmpty(group) || group.Equals(foundGroupValue))
return row;
else
while (true)
{
foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
if (foundCell == null) return row;
foundGroupValue = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
if (group.Equals(foundGroupValue)) return foundCell.Row;
}
} }
protected private void FilterByAmount() protected private void FilterByAmount()

View File

@ -2,6 +2,7 @@
using Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Excel;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace RehauSku.PriceListTools namespace RehauSku.PriceListTools
{ {
@ -19,12 +20,15 @@ namespace RehauSku.PriceListTools
Sheet = workbook.ActiveSheet; Sheet = workbook.ActiveSheet;
Name = workbook.Name; Name = workbook.Name;
amountCell = Sheet.Cells.Find(amountHeader); Range[] cells = new []
skuCell = Sheet.Cells.Find(skuHeader); {
groupCell = Sheet.Cells.Find(groupHeader); amountCell = Sheet.Cells.Find(amountHeader),
nameCell = Sheet.Cells.Find(nameHeader); skuCell = Sheet.Cells.Find(skuHeader),
groupCell = Sheet.Cells.Find(groupHeader),
nameCell = Sheet.Cells.Find(nameHeader)
};
if (amountCell == null || skuCell == null || groupCell == null || nameCell == null) if (cells.Any(x => x == null))
{ {
throw new ArgumentException($"Файл {Name} не распознан"); throw new ArgumentException($"Файл {Name} не распознан");
} }
@ -38,9 +42,9 @@ namespace RehauSku.PriceListTools
List<Source> sourceFiles = new List<Source>(); List<Source> sourceFiles = new List<Source>();
ExcelApp.ScreenUpdating = false;
foreach (string file in files) foreach (string file in files)
{ {
ExcelApp.ScreenUpdating = false;
Workbook wb = ExcelApp.Workbooks.Open(file); Workbook wb = ExcelApp.Workbooks.Open(file);
try try
{ {
@ -57,8 +61,8 @@ namespace RehauSku.PriceListTools
System.Windows.Forms.MessageBoxIcon.Information); System.Windows.Forms.MessageBoxIcon.Information);
wb.Close(); wb.Close();
} }
ExcelApp.ScreenUpdating = true;
} }
ExcelApp.ScreenUpdating = true;
return sourceFiles; return sourceFiles;
} }
@ -67,7 +71,7 @@ namespace RehauSku.PriceListTools
{ {
PositionAmount = new Dictionary<Position, double>(); PositionAmount = new Dictionary<Position, double>();
for (int row = amountCell.Row + 1; row < Sheet.AutoFilter.Range.Rows.Count; row++) for (int row = amountCell.Row + 1; row <= Sheet.Cells[Sheet.Rows.Count, amountCell.Column].End[XlDirection.xlUp].Row; row++)
{ {
object amount = Sheet.Cells[row, amountCell.Column].Value2; object amount = Sheet.Cells[row, amountCell.Column].Value2;
@ -83,6 +87,7 @@ namespace RehauSku.PriceListTools
{ {
PositionAmount[p] += (double)amount; PositionAmount[p] += (double)amount;
} }
else else
{ {
PositionAmount.Add(p, (double)amount); PositionAmount.Add(p, (double)amount);

View File

@ -1,21 +1,29 @@
using Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Excel;
using System; using System;
using System.Linq;
namespace RehauSku.PriceListTools namespace RehauSku.PriceListTools
{ {
internal class Target : PriceList internal class Target : PriceList
{ {
private const string oldSkuHeader = "Прежний материал";
public Range oldSkuCell { get; private set; }
public Target(Workbook workbook) public Target(Workbook workbook)
{ {
Sheet = workbook.ActiveSheet; Sheet = workbook.ActiveSheet;
Name = workbook.FullName; Name = workbook.FullName;
amountCell = Sheet.Cells.Find(amountHeader); Range[] cells = new[]
skuCell = Sheet.Cells.Find(skuHeader); {
groupCell = Sheet.Cells.Find(groupHeader); amountCell = Sheet.Cells.Find(amountHeader),
nameCell = Sheet.Cells.Find(nameHeader); skuCell = Sheet.Cells.Find(skuHeader),
groupCell = Sheet.Cells.Find(groupHeader),
nameCell = Sheet.Cells.Find(nameHeader),
oldSkuCell = Sheet.Cells.Find(oldSkuHeader)
};
if (amountCell == null || skuCell == null || groupCell == null || nameCell == null) if (cells.Any(x => x == null))
{ {
throw new ArgumentException($"Шаблон { Name } не является прайс-листом"); throw new ArgumentException($"Шаблон { Name } не является прайс-листом");
} }

View File

@ -1,10 +1,9 @@
using System.Runtime.InteropServices; using ExcelDna.Integration.CustomUI;
using System.Windows.Forms;
using ExcelDna.Integration.CustomUI;
using RehauSku.PriceListTools;
using RehauSku.Forms; using RehauSku.Forms;
using RehauSku.PriceListTools;
using System; using System;
using System.Collections.Generic; using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace RehauSku.Ribbon namespace RehauSku.Ribbon
{ {