RhSolutions-AddIn/src/PriceListTools/AbstractTool.cs
2022-02-02 18:02:17 +03:00

175 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ExcelDna.Integration;
using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Application = Microsoft.Office.Interop.Excel.Application;
namespace RehauSku.PriceListTools
{
internal abstract class AbstractTool
{
protected private Application ExcelApp = (Application)ExcelDnaUtil.Application;
protected private Target TargetFile;
public void OpenNewPrice()
{
Workbook wb = ExcelApp.Workbooks.Open(RegistryUtil.PriceListPath);
try
{
TargetFile = new Target(wb);
}
catch (Exception ex)
{
MessageBox.Show
(ex.Message,
"Ошибка открытия шаблонного прайс-листа",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
wb.Close();
throw ex;
}
}
protected private void FillColumnsWithDictionary(KeyValuePair<Position, double> positionAmount, params int[] columns)
{
int? row = GetPositionRow(positionAmount.Key.Sku, positionAmount.Key.Group, TargetFile.skuCell.Column);
if (row != null)
{
foreach (int column in columns)
{
Range sumCell = TargetFile.Sheet.Cells[row, column];
if (sumCell.Value2 == null)
{
sumCell.Value2 = positionAmount.Value;
}
else
{
sumCell.Value2 += positionAmount.Value;
}
}
}
else
{
string sku = positionAmount.Key.Sku.Substring(1, 6);
row = GetPositionRow(sku, positionAmount.Key.Group, TargetFile.skuCell.Column);
if (row != null)
{
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
{
FillMissing(positionAmount, columns);
}
}
}
protected private void FillMissing(KeyValuePair<Position, double> positionAmount, params int[] columns)
{
Range foundCell = TargetFile.oldSkuCell.EntireColumn.Find(positionAmount.Key.Sku);
int row;
if (foundCell == null)
{
row = TargetFile.Sheet.Cells[TargetFile.Sheet.Rows.Count, TargetFile.skuCell.Column]
.End[XlDirection.xlUp]
.Row + 1;
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)
{
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()
{
AutoFilter filter = TargetFile.Sheet.AutoFilter;
int startColumn = filter.Range.Column;
filter.Range.AutoFilter(TargetFile.amountCell.Column - startColumn + 1, "<>");
TargetFile.Sheet.Range["A1"].Activate();
}
}
}