complete config for reading excel data

This commit is contained in:
2025-12-24 13:45:37 +08:00
parent b460906b45
commit 6308aee750
21 changed files with 937 additions and 310 deletions

View File

@@ -39,6 +39,7 @@ using System.Windows.Documents;
using System.Windows.Forms;
using ThridLibray;
using LibDataBase;
using LibReadTetraExcel;
namespace TetraPackOCR
{
@@ -63,34 +64,11 @@ namespace TetraPackOCR
/// 声明一个PaddleOCR对象
/// </summary>
PaddleOCREngine Engine;
/// <summary>
///对应表格"P2生成数据"这一页
/// </summary>
ExcelWorksheet sheet1;
/// <summary>
/// 对应表格"QSV对应产品规格和梯度"这一页
/// </summary>
ExcelWorksheet sheet2;
/// <summary>
/// 对应"产品规格对应排布方式"这一页
/// </summary>
ExcelWorksheet sheet3;
/// <summary>
/// 表格路径
/// </summary>
string execlFileName = AppDomain.CurrentDomain.BaseDirectory + "Data\\Excle\\OCR文件0602.xlsx";
/// <summary>
/// 共印依据 QSV Design, Layers, Colours,产品规格
/// </summary>
string m_ProductStandard;
/// <summary>
/// 幅数 包材宽 梯度 X距离 Y距离
/// </summary>
int NumberOfLanes;
double m_width, m_Gradient, m_DistX, m_DistY, m_height;
int m_ColorMax = 0;
OrderConfig config = null;
/// <summary>
/// 定位Vpp文件
/// </summary>
@@ -666,131 +644,65 @@ namespace TetraPackOCR
}
log.Info("当前订单号为:" + order);
//读取表格内容
ExcelPackage.License.SetNonCommercialOrganization("My Noncommercial organization");
using (ExcelPackage package = new ExcelPackage(execlFileName))
config = ExcelHelper.ReadOCROrder(execlFileName, order);
if (config.ParseQSV)
{
sheet1 = package.Workbook.Worksheets["P2生成数据"];
sheet2 = package.Workbook.Worksheets["QSV对应产品规格和梯度"];
sheet3 = package.Workbook.Worksheets["产品规格对应排布方式"];
//根据订单遍历sheet1 找Sequence QSV NumOFLanes 字符
string currentQSV = "";
for (int i = 1; i < sheet1.Dimension.Rows; i++)
lbl_QSV.Text = config.QSV;
log.Info("当前订单QSV:" + config.QSV);
log.Info("当前订单Number Of Lanes:" + config.NumberOfLanes);
lbl_NO.Text = config.NumberOfLanes.ToString();
var result = config.OCRDesign
.GroupBy(kvp => kvp.Value, kvp => kvp.Key)
.ToDictionary(g => g.Key, g => g.ToList());
foreach (var kvp in result)
{
if (sheet1.GetValue(i, 3) != null)
{
if (sheet1.Cells[i, 3].Value.ToString() == order)
{
currentQSV = sheet1.Cells[i, 4].Value.ToString();
lbl_QSV.Text = currentQSV;
log.Info("当前订单QSV:" + currentQSV);
NumberOfLanes = Convert.ToInt32(sheet1.Cells[i, 5].Value.ToString());
log.Info("当前订单Number Of Lanes:" + NumberOfLanes);
lbl_NO.Text = sheet1.Cells[i, 5].Value.ToString();
int num = 0;
for (int k = 0; k < 10; k++)
{
string lanes = sheet1.Cells[i + k, 6].Value.ToString();
string design = sheet1.Cells[i + k, 7].Value.ToString().Split('-')[1];
lanes = lanes.Substring(1, lanes.Length - 2);
string[] tmp = lanes.Split(',');
num += tmp.Length;
List<string> textOCR = ExecelGetOcrText(design, sheet1.Cells[i + k, 8].Value.ToString());
foreach (string lan in tmp)
{
int lanInt = Convert.ToInt32(lan);
ocrTextRequest[lanInt] = textOCR;
ocrTextDesign[lanInt] = design;
}
listBox1.Items.Add(sheet1.Cells[i + k, 6].Value.ToString());
listBox1.Items.Add(string.Join(",", textOCR));
if (num >= NumberOfLanes)
break;
}
break;
}
}
}
if (!string.IsNullOrEmpty(currentQSV))
{
string qsv;
//根据得到的QSV遍历sheet2 找产品规格和宽度梯度
for (int j = 1; j <= sheet2.Dimension.Rows; j++)
{
qsv = sheet2.Cells[j, 1].Value.ToString();
if (qsv == currentQSV)
{
m_ProductStandard = sheet2.Cells[j, 2].Value.ToString();
lbl_ProductStandard.Text = m_ProductStandard;
log.Info("当前订单产品编号:" + m_ProductStandard);
m_width = Convert.ToDouble(sheet2.Cells[j, 3].Value.ToString());
lbl_width.Text = sheet2.Cells[j, 3].Value.ToString();
log.Info("当前订单幅宽:" + m_width);
m_height = Convert.ToDouble(sheet2.Cells[j, 4].Value.ToString());
lbl_height.Text = sheet2.Cells[j, 4].Value.ToString();
log.Info("当前订单幅高:" + m_height);
m_Gradient = Convert.ToDouble(sheet2.Cells[j, 5].Value.ToString());
lbl_Gradient.Text = sheet2.Cells[j, 5].Value.ToString();
log.Info("当前订单梯度:" + m_Gradient);
break;
}
}
if (string.IsNullOrEmpty(m_ProductStandard))
{
log.Debug("ProductStandard未找到请检查订单号是否正确");
btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
return;
}
//根据产品规格获取距离坐标
for (int n = 1; n < sheet3.Dimension.Rows; n++)
{
if (sheet3.GetValue(n, 1) != null)
{
if (sheet3.Cells[n, 1].Value.ToString() == m_ProductStandard)
{
string str = sheet3.Cells[n + ocrTextRequest[1].Count - 1, 4].Value.ToString();
string[] x_y = str.Split(',');
string[] X = x_y[0].Split(':');
string[] Y = x_y[1].Split(':');
m_DistX = Convert.ToDouble(X[1].Replace("mm", ""));
lbl_DistX.Text = X[1].Replace("mm", "");
log.Info("当前订单X偏移:" + m_DistX);
m_DistY = Convert.ToDouble(Y[1].Replace("mm", ""));
lbl_DistY.Text = Y[1].Replace("mm", "");
log.Info("当前订单Y偏移:" + m_DistY);
string alignColor = sheet3.Cells[n + ocrTextRequest[1].Count - 1, 3].Value.ToString();
if (alignColor.Contains("单排"))
m_ColorMax = ocrTextRequest.Values.Select(x => x.Count).Max();// ocrTextRequest[1].Count;
else
m_ColorMax = alignColor.Replace("排布", "").Split('').ToList().Select(int.Parse).Max();
log.Info("当前排布方式:" + alignColor);
log.Info("单行最大数量:" + m_ColorMax.ToString());
break;
}
}
}
if (m_DistX == 0 || m_DistY == 0)
{
log.Debug("DistXDistY未找到请检查订单号是否正确");
btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
return;
}
log.Info("相关数据已获取完成,且已显示在界面中,请查看。");
}
else
{
log.Debug("QSV未找到请检查订单号是否正确");
btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
return;
listBox1.Items.Add(string.Join(",", kvp.Value));
listBox1.Items.Add(string.Join(",", config.OCRRequest[kvp.Value[0]]));
}
}
else
{
log.Debug("QSV未找到请检查订单号是否正确");
btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
return;
}
if (config.ParseProduct)
{
lbl_ProductStandard.Text = config.ProductStandard;
log.Info("当前订单产品编号:" + config.ProductStandard);
lbl_width.Text = config.Width.ToString();
log.Info("当前订单幅宽:" + config.Width);
lbl_height.Text = config.Height.ToString();
log.Info("当前订单幅高:" + config.Height);
lbl_Gradient.Text = config.Gradient.ToString();
log.Info("当前订单梯度:" + config.Gradient);
}
else
{
log.Debug("ProductStandard未找到请检查订单号是否正确");
btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
return;
}
if (config.ParseArrange)
{
lbl_DistX.Text = config.DistX.ToString();
log.Info("当前订单X偏移:" + config.DistX);
lbl_DistY.Text = config.DistY.ToString();
log.Info("当前订单Y偏移:" + config.DistY);
log.Info("当前排布方式:" + config.ColorArray);
log.Info("单行最大数量:" + config.ColorMax.ToString());
}
else
{
log.Debug("DistXDistY未找到请检查订单号是否正确");
btn_OrderNum.Enabled = true;
btn_OrderNum.BackColor = Color.DeepSkyBlue;
return;
}
log.Info("相关数据已获取完成,且已显示在界面中,请查看。");
//判断当前Lans决定结果显示数量
InitLableColumn();
@@ -812,7 +724,7 @@ namespace TetraPackOCR
}
private void InitLableColumn()
{
switch (NumberOfLanes)
switch (config.NumberOfLanes)
{
case 1:
Invoke(new Action(() =>
@@ -1004,7 +916,7 @@ namespace TetraPackOCR
m_GotoZero = false;
m_startTime = DateTime.Now;
m_textWidth = 18 - (NumberOfLanes - 5);
m_textWidth = 18 - (config.NumberOfLanes - 5);
//m_textWidth = Convert.ToDouble(textBox1.Text);
ocrAcc.Clear();
autorunFlag = check_Autorun.Checked;
@@ -1039,9 +951,7 @@ namespace TetraPackOCR
/// </summary>
void ClearData()
{
m_ProductStandard = null;
NumberOfLanes = 0; m_width = 0; m_Gradient = 0; m_DistX = 0; m_DistY = 0;
m_height = 0;
config = new OrderConfig();
}
/// <summary>
/// 清空上次订单显示区
@@ -1301,7 +1211,7 @@ namespace TetraPackOCR
fs.Close();
log.Info("OCR存图已完成");
CutPicture(savePath + '\\' + strTime + ".bmp", 400 + 200 * (6 - m_ColorMax), 2000, 3400 + 200 * m_ColorMax, 1600);
CutPicture(savePath + '\\' + strTime + ".bmp", 400 + 200 * (6 - config.ColorMax), 2000, 3400 + 200 * config.ColorMax, 1600);
if (Engine == null)
{
log.Error("Engine未初始化");
@@ -1858,7 +1768,7 @@ namespace TetraPackOCR
return;
}
if (NumberOfLanes + 1 == mMatchingStr)
if (config.NumberOfLanes + 1 == mMatchingStr)
{
Thread.Sleep(3000);
EnableStartDetect();
@@ -1964,27 +1874,27 @@ namespace TetraPackOCR
if (ocrTextRequest[1].Count == 0)
return;
double xx = x - (m_textWidth * m_ColorMax) / 2.0;
double xx = x - (m_textWidth * config.ColorMax) / 2.0;
double yy = y;
double rr = r;
List<float> locationXY = new List<float>();
double ocrx = 0, ocry = 0;
locationXY.Add((float)NumberOfLanes);
int nol = Convert.ToInt32(NumberOfLanes);
locationXY.Add((float)config.NumberOfLanes);
int nol = Convert.ToInt32(config.NumberOfLanes);
log.Info("当前订单OCR区域共" + nol + "组:");
double degree = (rr * Math.PI) / 180;
for (int item = 0; item < nol; item++)
{
if (item == 0)
{
ocrx = xx - m_DistX * Math.Cos(degree) - m_DistY * Math.Sin(degree);
ocry = yy + m_DistY * Math.Cos(degree) - m_DistX * Math.Sin(degree);
ocrx = xx - config.DistX * Math.Cos(degree) - config.DistY * Math.Sin(degree);
ocry = yy + config.DistY * Math.Cos(degree) - config.DistX * Math.Sin(degree);
}
else
{
ocrx = ocrx + m_width * Math.Cos(degree) + m_Gradient * Math.Sin(degree);
ocry = ocry - m_Gradient * Math.Cos(degree) + m_width * Math.Sin(degree);
ocrx = ocrx + config.Width * Math.Cos(degree) + config.Gradient * Math.Sin(degree);
ocry = ocry - config.Gradient * Math.Cos(degree) + config.Width * Math.Sin(degree);
}
log.Info("第" + (item + 1) + "组坐标为X" + ocrx + ",Y:" + ocry + "。");
@@ -2001,14 +1911,14 @@ namespace TetraPackOCR
if (ocry < - 50)
{
ocrx = ocrx - m_height * Math.Sin(degree);
ocry = ocry + m_height * Math.Cos(degree);
ocrx = ocrx - config.Height * Math.Sin(degree);
ocry = ocry + config.Height * Math.Cos(degree);
log.Info("更新第" + (item + 1) + "组坐标为X" + ocrx + ",Y:" + ocry + "。");
}
else if (ocry > 400)
{
ocrx = ocrx + m_height * Math.Sin(degree);
ocry = ocry - m_height * Math.Cos(degree);
ocrx = ocrx + config.Height * Math.Sin(degree);
ocry = ocry - config.Height * Math.Cos(degree);
log.Info("更新第" + (item + 1) + "组坐标为X" + ocrx + ",Y:" + ocry + "。");
}