Refactoring, Not fount table formatting etc
This commit is contained in:
parent
cfb15d1279
commit
7e5020ec25
@ -1,8 +1,8 @@
|
||||
using Microsoft.Win32;
|
||||
using System.IO;
|
||||
using RehauSku.Forms;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using ExcelDna.Integration;
|
||||
|
||||
namespace RehauSku
|
||||
{
|
||||
@ -24,24 +24,29 @@ namespace RehauSku
|
||||
RootKey.Close();
|
||||
}
|
||||
|
||||
public static bool IsPriceListPathEmpty()
|
||||
{
|
||||
return string.IsNullOrEmpty(priceListPath);
|
||||
}
|
||||
|
||||
public static string PriceListPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsPriceListPathEmpty() || !File.Exists(priceListPath))
|
||||
if (string.IsNullOrEmpty(priceListPath) || !File.Exists(priceListPath))
|
||||
{
|
||||
DialogResult result = MessageBox.Show("Прайс-лист отсутствует или неверный файл шаблона прайс-листа. " +
|
||||
"Укажите файл шаблона прайс-листа.",
|
||||
"Нет файла шаблона",
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
|
||||
if (result == DialogResult.OK)
|
||||
{
|
||||
//MessageBox.Show("Прайс-лист отсутствует или неверный файл прайс-листа", "Укажите файл прайс-листа", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
string fileName = Dialog.GetFilePath();
|
||||
priceListPath = fileName;
|
||||
RootKey.SetValue("PriceListPath", fileName);
|
||||
return priceListPath;
|
||||
}
|
||||
|
||||
else
|
||||
throw new Exception("Нет файла шаблона");
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
return priceListPath;
|
||||
|
@ -9,8 +9,6 @@ namespace RehauSku.PriceListTools
|
||||
|
||||
public void FillTarget()
|
||||
{
|
||||
ExcelApp.ScreenUpdating = false;
|
||||
|
||||
foreach (Source source in SourceFiles)
|
||||
{
|
||||
TargetFile.Sheet.Columns[TargetFile.amountCell.Column]
|
||||
@ -21,11 +19,11 @@ namespace RehauSku.PriceListTools
|
||||
newColumnHeader.Value2 = $"{source.Name}";
|
||||
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();
|
||||
ExcelApp.ScreenUpdating = true;
|
||||
|
||||
Forms.Dialog.SaveWorkbookAs();
|
||||
}
|
||||
|
@ -26,10 +26,10 @@ namespace RehauSku.PriceListTools
|
||||
|
||||
public void FillTarget()
|
||||
{
|
||||
ExcelApp.ScreenUpdating = false;
|
||||
FillColumnsWithDictionary(Current.PositionAmount, TargetFile.amountCell.Column);
|
||||
foreach (var kvp in Current.PositionAmount)
|
||||
FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column);
|
||||
|
||||
FilterByAmount();
|
||||
ExcelApp.ScreenUpdating = true;
|
||||
|
||||
Forms.Dialog.SaveWorkbookAs();
|
||||
}
|
||||
|
@ -19,13 +19,17 @@ namespace RehauSku.PriceListTools
|
||||
throw new Exception("Неверный диапазон");
|
||||
}
|
||||
}
|
||||
|
||||
public void FillTarget()
|
||||
{
|
||||
ExcelApp.ScreenUpdating = false;
|
||||
GetSelected();
|
||||
FillColumnsWithDictionary(PositionAmount, TargetFile.amountCell.Column);
|
||||
|
||||
foreach (var kvp in PositionAmount)
|
||||
{
|
||||
FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column);
|
||||
}
|
||||
|
||||
FilterByAmount();
|
||||
ExcelApp.ScreenUpdating = true;
|
||||
|
||||
Forms.Dialog.SaveWorkbookAs();
|
||||
}
|
||||
@ -33,7 +37,6 @@ namespace RehauSku.PriceListTools
|
||||
private void GetSelected()
|
||||
{
|
||||
object[,] cells = Selection.Value2;
|
||||
Dictionary<string, double> SkuAmount = new Dictionary<string, double>();
|
||||
PositionAmount = new Dictionary<Position, double>();
|
||||
|
||||
int rowsCount = Selection.Rows.Count;
|
||||
@ -72,21 +75,18 @@ namespace RehauSku.PriceListTools
|
||||
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
|
||||
{
|
||||
SkuAmount.Add(sku, amount.Value);
|
||||
PositionAmount.Add(position, amount.Value);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var kvp in SkuAmount)
|
||||
{
|
||||
PositionAmount.Add(new Position(null, kvp.Key, null), kvp.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace RehauSku.PriceListTools
|
||||
{
|
||||
@ -9,15 +8,13 @@ namespace RehauSku.PriceListTools
|
||||
|
||||
public void FillTarget()
|
||||
{
|
||||
ExcelApp.ScreenUpdating = false;
|
||||
|
||||
foreach (Source source in SourceFiles)
|
||||
{
|
||||
FillColumnsWithDictionary(source.PositionAmount, TargetFile.amountCell.Column);
|
||||
foreach (var kvp in source.PositionAmount)
|
||||
FillColumnsWithDictionary(kvp, TargetFile.amountCell.Column);
|
||||
}
|
||||
|
||||
FilterByAmount();
|
||||
ExcelApp.ScreenUpdating = true;
|
||||
|
||||
Forms.Dialog.SaveWorkbookAs();
|
||||
}
|
||||
|
@ -11,7 +11,6 @@ namespace RehauSku.PriceListTools
|
||||
{
|
||||
protected private Application ExcelApp = (Application)ExcelDnaUtil.Application;
|
||||
protected private Target TargetFile;
|
||||
protected private List<KeyValuePair<Position, double>> Missing;
|
||||
|
||||
public void OpenNewPrice()
|
||||
{
|
||||
@ -34,77 +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);
|
||||
}
|
||||
|
||||
if (Missing.Count > 0)
|
||||
foreach (int column in columns)
|
||||
{
|
||||
DialogResult result =
|
||||
MessageBox.Show
|
||||
($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?",
|
||||
"Отсутствует позиция в конечной таблице заказов",
|
||||
MessageBoxButtons.YesNo,
|
||||
MessageBoxIcon.Information);
|
||||
|
||||
if (result == DialogResult.Yes)
|
||||
{
|
||||
var lookUp = new List<KeyValuePair<Position, double>>(Missing);
|
||||
|
||||
foreach (var missingPosition in lookUp)
|
||||
{
|
||||
TryFillVariantlessSkuToColumns(missingPosition, columns);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Missing.Count > 0)
|
||||
{
|
||||
FillMissing(columns);
|
||||
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)
|
||||
{
|
||||
if (positionAmount.Key.Group == null) break;
|
||||
|
||||
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];
|
||||
Range sumCell = TargetFile.Sheet.Cells[row, column];
|
||||
|
||||
if (sumCell.Value2 == null)
|
||||
{
|
||||
@ -117,78 +54,112 @@ 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);
|
||||
row = GetPositionRow(sku, positionAmount.Key.Group, TargetFile.skuCell.Column);
|
||||
|
||||
if (foundCell == null)
|
||||
if (row != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
|
||||
|
||||
while (foundCell != null && foundCellGroup != positionAmount.Key.Group)
|
||||
foreach (int column in columns)
|
||||
{
|
||||
if (positionAmount.Key.Group == null) break;
|
||||
Range amountCell = TargetFile.Sheet.Cells[row, column];
|
||||
|
||||
foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
|
||||
foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
|
||||
}
|
||||
|
||||
if (foundCell == null)
|
||||
if (amountCell.Value2 == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var column in columns)
|
||||
{
|
||||
Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
|
||||
|
||||
if (sumCell.Value2 == null)
|
||||
{
|
||||
sumCell.Value2 = positionAmount.Value;
|
||||
amountCell.Value2 = positionAmount.Value;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
sumCell.Value2 += positionAmount.Value;
|
||||
amountCell.Value2 += positionAmount.Value;
|
||||
}
|
||||
|
||||
Range oldSkuCell = TargetFile.Sheet.Cells[row, TargetFile.oldSkuCell.Column];
|
||||
oldSkuCell.Value2 = positionAmount.Key.Sku;
|
||||
}
|
||||
}
|
||||
|
||||
Missing.Remove(positionAmount);
|
||||
}
|
||||
|
||||
protected private void FillMissing(int[] columns)
|
||||
else
|
||||
{
|
||||
int startRow =
|
||||
TargetFile.Sheet.AutoFilter.Range.Row +
|
||||
TargetFile.Sheet.AutoFilter.Range.Rows.Count + 5;
|
||||
FillMissing(positionAmount, columns);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < Missing.Count; i++)
|
||||
protected private void FillMissing(KeyValuePair<Position, double> positionAmount, params int[] columns)
|
||||
{
|
||||
Range group = TargetFile.Sheet.Cells[startRow + i, TargetFile.groupCell.Column];
|
||||
Range sku = TargetFile.Sheet.Cells[startRow + i, TargetFile.skuCell.Column];
|
||||
Range name = TargetFile.Sheet.Cells[startRow + i, TargetFile.nameCell.Column];
|
||||
Range foundCell = TargetFile.oldSkuCell.EntireColumn.Find(positionAmount.Key.Sku);
|
||||
int row;
|
||||
|
||||
group.Value2 = Missing[i].Key.Group;
|
||||
sku.Value2 = Missing[i].Key.Sku;
|
||||
name.Value2 = Missing[i].Key.Name;
|
||||
if (foundCell == null)
|
||||
{
|
||||
row = TargetFile.Sheet.Cells[TargetFile.Sheet.Rows.Count, TargetFile.skuCell.Column]
|
||||
.End[XlDirection.xlUp]
|
||||
.Row + 1;
|
||||
|
||||
group.ClearFormats();
|
||||
sku.ClearFormats();
|
||||
name.ClearFormats();
|
||||
TargetFile.Sheet.Rows[row]
|
||||
.EntireRow
|
||||
.Insert(XlInsertShiftDirection.xlShiftDown, XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
|
||||
|
||||
Range previous = TargetFile.Sheet.Rows[row - 1];
|
||||
Range current = TargetFile.Sheet.Rows[row];
|
||||
|
||||
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)
|
||||
{
|
||||
Range amount = TargetFile.Sheet.Cells[startRow + i, column];
|
||||
amount.Value2 = Missing[i].Value;
|
||||
amount.ClearFormats();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
using Microsoft.Office.Interop.Excel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace RehauSku.PriceListTools
|
||||
{
|
||||
@ -19,12 +20,15 @@ namespace RehauSku.PriceListTools
|
||||
Sheet = workbook.ActiveSheet;
|
||||
Name = workbook.Name;
|
||||
|
||||
amountCell = Sheet.Cells.Find(amountHeader);
|
||||
skuCell = Sheet.Cells.Find(skuHeader);
|
||||
groupCell = Sheet.Cells.Find(groupHeader);
|
||||
nameCell = Sheet.Cells.Find(nameHeader);
|
||||
Range[] cells = new []
|
||||
{
|
||||
amountCell = Sheet.Cells.Find(amountHeader),
|
||||
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} не распознан");
|
||||
}
|
||||
@ -38,9 +42,9 @@ namespace RehauSku.PriceListTools
|
||||
|
||||
List<Source> sourceFiles = new List<Source>();
|
||||
|
||||
ExcelApp.ScreenUpdating = false;
|
||||
foreach (string file in files)
|
||||
{
|
||||
ExcelApp.ScreenUpdating = false;
|
||||
Workbook wb = ExcelApp.Workbooks.Open(file);
|
||||
try
|
||||
{
|
||||
@ -57,8 +61,8 @@ namespace RehauSku.PriceListTools
|
||||
System.Windows.Forms.MessageBoxIcon.Information);
|
||||
wb.Close();
|
||||
}
|
||||
}
|
||||
ExcelApp.ScreenUpdating = true;
|
||||
}
|
||||
|
||||
return sourceFiles;
|
||||
}
|
||||
@ -67,7 +71,7 @@ namespace RehauSku.PriceListTools
|
||||
{
|
||||
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;
|
||||
|
||||
@ -83,6 +87,7 @@ namespace RehauSku.PriceListTools
|
||||
{
|
||||
PositionAmount[p] += (double)amount;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
PositionAmount.Add(p, (double)amount);
|
||||
|
@ -1,21 +1,29 @@
|
||||
using Microsoft.Office.Interop.Excel;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace RehauSku.PriceListTools
|
||||
{
|
||||
internal class Target : PriceList
|
||||
{
|
||||
private const string oldSkuHeader = "Прежний материал";
|
||||
public Range oldSkuCell { get; private set; }
|
||||
|
||||
public Target(Workbook workbook)
|
||||
{
|
||||
Sheet = workbook.ActiveSheet;
|
||||
Name = workbook.FullName;
|
||||
|
||||
amountCell = Sheet.Cells.Find(amountHeader);
|
||||
skuCell = Sheet.Cells.Find(skuHeader);
|
||||
groupCell = Sheet.Cells.Find(groupHeader);
|
||||
nameCell = Sheet.Cells.Find(nameHeader);
|
||||
Range[] cells = new[]
|
||||
{
|
||||
amountCell = Sheet.Cells.Find(amountHeader),
|
||||
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 } не является прайс-листом");
|
||||
}
|
||||
|
@ -1,10 +1,9 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
using ExcelDna.Integration.CustomUI;
|
||||
using RehauSku.PriceListTools;
|
||||
using ExcelDna.Integration.CustomUI;
|
||||
using RehauSku.Forms;
|
||||
using RehauSku.PriceListTools;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace RehauSku.Ribbon
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user