⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 本软件是为南开大学体育部开发的,作为跆拳道比赛分组,分级别的小工具.在程序中导入Excel格式的文件,文件中是比赛运动员的相关信息.按设置场地要求自动生成比赛对阵图(word格式)和对阵表(Excel
💻 CS
📖 第 1 页 / 共 3 页
字号:
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 + -