📄 form1.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Excel=Microsoft.Office.Interop.Excel;//对Excel对象库的命令空间的引用
using Word = Microsoft.Office.Interop.Word;//对Word对象库的命令空间的引用
using System.Collections;
using System.Threading;
namespace Match
{
public partial class MainForm : Form
{
#region 私有成员
private object missing = Type.Missing;
private Excel.Application TheExcelApp;//Excel应用程序对象
private Word.Application TheWordApp;
private Excel.Worksheet TheSheet;//Worksheet对象
private Excel.Worksheet WorksheetCopy;
private int iCurrentRow;//结果Excel中的行的索引
int PlayerIndex = 0;//控制WORD图中的运动员名字
private int iNumField=4;//场地数
private bool SetField= false;
private bool HasCreateWord = false;
private bool SortGroup = false;
private bool ImportData = false;
private bool Merged = false;
private int[,] Group0;
private int[,] Group1;
private int[,] Group2;
private int[,] Group3;
private int[,] Group4;
private int[,] Group5;
private int[,] Group6;
private int[,] Group7;
private object sWordTemFileName;//WORD模板路径
//男子
private ArrayList mAllInfors = new ArrayList();
//女子
private ArrayList fAllInfors = new ArrayList();
ArrayList[] Infors = new ArrayList[8];//男女共8个组
private ArrayList[] Levels =new ArrayList[8];//8个组对应的级别
private ArrayList[] InforsMerge;//长度为场地数
private ArrayList[] LevelsMerge;//长度为场地数
private ArrayList GroupMerge = new ArrayList();
private ArrayList[] OutputInfors; //长度为场地数
private string[] Fields=new string[8];
private OWC11.Worksheet TheWorksheet//TheWorksheet表示当前控件中的Sheet1
{
get { return (OWC11.Worksheet)this.axSpreadsheet.Sheets[1]; }
}
private OWC11.Worksheet TheResultsheet//TheResultsheet表示当前控件中的Sheet2
{
get { return (OWC11.Worksheet)this.axSpreadsheet.Sheets[2]; }
}
#endregion
#region 方法
public MainForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
#endregion
#region 私有函数
private void InitControl()//初始化控件
{
try
{
InitSpreadsheet();//初始化Spreadsheet控件
}
catch (Exception ex)
{
MessageBox.Show("初始化Spreadsheet控件失败\n" + ex.Message);
return;
}
try
{
TheExcelApp = new Excel.Application();
TheExcelApp.Visible = false;
}
catch (Exception ex)
{
MessageBox.Show("打开Excel程序失败!\n异常信息:" + ex.Message);
return;
}
}
private void CloseControl()
{
try
{
TheExcelApp.Quit();
}
catch (Exception ex)
{
MessageBox.Show("关闭Excel进程时发生异常\n异常信息:" + ex.Message);
}
}
private void InitData()//初始化数据
{
ImportData = false;
SetField= false;
SortGroup = false;
HasCreateWord = false;
Merged = false;
sWordTemFileName = null;
Fields = new string[8];
mAllInfors.Clear();
fAllInfors.Clear();
GroupMerge.Clear();
for (int i = 0; i < 8; i++)
{
Infors[i] = new ArrayList();
Levels[i] = new ArrayList();
}
}
private void InitSpreadsheet()//初始化Spreadsheet控件
{
TheWorksheet.UsedRange.Clear();
TheWorksheet.get_Range("A1", Type.Missing).Value2 = "组别";
TheWorksheet.get_Range("B1", Type.Missing).Value2 = "姓名";
TheWorksheet.get_Range("C1", Type.Missing).Value2 = "性别";
TheWorksheet.get_Range("D1", Type.Missing).Value2 = "级别";
TheWorksheet.get_Range("E1", Type.Missing).Value2 = "单位";
InitResultSheet();
this.axSpreadsheet.Caption = "运动员信息";
}
private void InitResultSheet()
{
TheResultsheet.UsedRange.Clear();
TheResultsheet.get_Range("A1", Type.Missing).Value2 = "组别";
TheResultsheet.get_Range("B1", Type.Missing).Value2 = "级别";
TheResultsheet.get_Range("C1", Type.Missing).Value2 = "场次";
TheResultsheet.get_Range("D1", Type.Missing).Value2 = "红方 姓名 单位";
TheResultsheet.get_Range("E1", Type.Missing).Value2 = "VS";
TheResultsheet.get_Range("F1", Type.Missing).Value2 = "青方 姓名 单位";
}
private void NumFieldToolStripMenuItem_Click(object sender, EventArgs e)//设置场地
{
if (!ImportData)
{
MessageBox.Show("还没导入数据,不能设置场地!");
return;
}
if (iNumField == 0) {
MessageBox.Show("还没有设置场地数!");
return;
}
if (!SortGroup)
{
SaveToArray();
SortByGroup();
SortGroup = true;
}
//////////场地设置
SetField mySetField = new SetField();
int[] NumPlayer = new int[8];
NumPlayer[0] = Infors[0].Count;
NumPlayer[1] = Infors[1].Count;
NumPlayer[2] = Infors[2].Count;
NumPlayer[3] = Infors[3].Count;
NumPlayer[4] = Infors[4].Count;
NumPlayer[5] = Infors[5].Count;
NumPlayer[6] = Infors[6].Count;
NumPlayer[7] = Infors[7].Count;
mySetField.SetData(NumPlayer, iNumField);
mySetField.SetFields(Fields);
mySetField.ShowDialog();
if (mySetField.GetReturn())
{
Fields = mySetField.GetField();
SetField = true;//已经设置好场地
Merged = false;
HasCreateWord = false;
GroupMerge.Clear();
}
}
private void Merge()
{
if (Merged) return;
InitGroup();//初始化Group[0~7] 确定它们的长度
for (int i = 0; i < 8; i++)//把各组中运动员信息按级别排序
{
int[,] Group = GetGroup(i);
SortByLevel(ref Infors[i], Group, i);
}
ArrayList[] FieldGroup = new ArrayList[iNumField];//在各场地中保存组别的编号
OutputInfors = new ArrayList[iNumField];
//根据场地合并
InforsMerge = new ArrayList[iNumField];//先对InforsMerge初始化
LevelsMerge = new ArrayList[iNumField];
for (int i = 0; i < iNumField; i++)
{
InforsMerge[i] = new ArrayList();
LevelsMerge[i] = new ArrayList();
FieldGroup[i] = new ArrayList();
OutputInfors[i] = new ArrayList();
}
//合并
for (int i = 0; i < 8; i++)
{
if (Fields[i] != null)
{
char cField = Convert.ToChar(Fields[i]);
int index = Convert.ToInt32(cField) - 65;
InforsMerge[index].AddRange(Infors[i]);
((ArrayList)FieldGroup[index]).Add(i);
}
}
for (int i = 0; i < iNumField; i++)
{
if (FieldGroup[i].Count == 0) { GroupMerge.Add(new int[0,0]); continue; }
int preNumPlayer = 0;//前面已经合并完的组的人数
int[,] groupMerge;
int SumLevels = 0;
for (int j = 0; j < ((ArrayList)FieldGroup[i]).Count; j++)
{
int GroupIndex = (int)((ArrayList)FieldGroup[i])[j];//得到组的编号
SumLevels += Levels[GroupIndex].Count;
LevelsMerge[i].AddRange(Levels[GroupIndex]);//级别合并
}
groupMerge = new int[2, SumLevels];
int groupMerge_index = 0;
for (int j = 0; j < ((ArrayList)FieldGroup[i]).Count; j++)
{
int GroupIndex = (int)((ArrayList)FieldGroup[i])[j];//得到组的编号
int[,] Group = GetGroup(GroupIndex);
int k;
for (k = 0; k < Group.Length / 2; k++)
{
groupMerge[0, k + groupMerge_index] = Group[0, k] + preNumPlayer;
groupMerge[1, k + groupMerge_index] = Group[1, k];
}
groupMerge_index += k;
preNumPlayer += Infors[GroupIndex].Count;//最后得到的是这个场地的人数
}
GroupMerge.Add(groupMerge);
}
Merged = true;
}
private void InitGroup()//Group数组的长度就是各组的级别数
{
for(int i=0;i<8;i++){
switch (i)
{
case 0: Group0 = new int[2, Levels[0].Count];
break;
case 1: Group1 = new int[2, Levels[1].Count];
break;
case 2: Group2 = new int[2, Levels[2].Count];
break;
case 3: Group3 = new int[2, Levels[3].Count];
break;
case 4: Group4 = new int[2, Levels[4].Count];
break;
case 5: Group5 = new int[2, Levels[5].Count];
break;
case 6: Group6 = new int[2, Levels[6].Count];
break;
case 7: Group7 = new int[2, Levels[7].Count];
break;
}
}
}
private int[,] GetGroup(int i)//Group数组的长度就是各组的级别数
{
switch (i)
{
case 0:
return Group0;
case 1:
return Group1;
case 2:
return Group2;
case 3:
return Group3;
case 4:
return Group4;
case 5:
return Group5;
case 6:
return Group6;
case 7:
return Group7;
}
return Group0;
}
private void SaveToArray()//把运动员信息保存到数组AllInfors中
{
for (int i = 2; i <= TheWorksheet.UsedRange.Rows.Count; i++)
{
Infor newInfor = new Infor();
newInfor.Group = (string)TheWorksheet.get_Range("A" + i, missing).Value2;
newInfor.Name = (string)TheWorksheet.get_Range("B" + i, missing).Value2;
newInfor.Sex = (string)TheWorksheet.get_Range("C" + i, missing).Value2;
newInfor.Level = TheWorksheet.get_Range("D" + i, missing).Value2.ToString();
newInfor.Unit = (string)TheWorksheet.get_Range("E" + i, missing).Value2;
if (newInfor.Sex == "男")//男女分开
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -