Unity 读取Excel工作表 以及排行榜的制作

一、读取Excel

/// <summary>
    ///返回数据的集合 
    ///数据的格式为 每一行为一条数据
    ///例:"Me|40|29|2019530" 
    /// </summary>
    /// <returns></returns>
    public List<string> LoadData()
    {
        // StreamingAssets目录下的  党员信息.xlsx文件的路径:Application.streamingAssetsPath + "/党员信息.xlsx" 
        FileStream fileStream = File.Open(Application.streamingAssetsPath + "/排行榜.xlsx",     
        FileMode.Open, FileAccess.Read);
        IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
        // 表格数据全部读取到result里
        DataSet result = excelDataReader.AsDataSet();

        // 获取表格有多少列 
        int columns = result.Tables[0].Columns.Count;
        // 获取表格有多少行 
        int rows = result.Tables[0].Rows.Count;

        //获取表格的行数 -1去掉第一行
        //testRow = rows - 1;

        //Debug.Log("行" + rows);
        // 根据行列依次打印表格中的每个数据 

        List<string> excelDta = new List<string>();

        //第一行为表头,不读取
        for (int i = 1; i < rows; i++)
        {
            value = null;
            all = null;
            for (int j = 0; j < columns; j++)
            {
                // 获取表格中指定行指定列的数据 
                value = result.Tables[0].Rows[i][j].ToString();
                //Debug.Log("value = " + value);
                if (value == "")
                {
                    continue;
                }
                all = all + value + "|";
            }
            if (all != null)
            {
                print(all);
                excelDta.Add(all);
            }
        }
        return excelDta;
    }

二、重新写入Excel

 /// <summary>
    /// list内容格式
    /// "Me|40|29|2019530" 
    /// </summary>
    /// <param name="newList"></param>
    public void WriteExcel(List<string> newList)
    {
        //自定义excel的路径

        string path = Application.streamingAssetsPath + "/排行榜.xlsx";
        // print(Application.dataPath);

        FileInfo newFile = new FileInfo(path);

        if (newFile.Exists)
        {
            //创建一个新的excel文件

            newFile.Delete();

            newFile = new FileInfo(path);
        }

        //通过ExcelPackage打开文件
        using (ExcelPackage package = new ExcelPackage(newFile))
        {
            //在excel空文件添加新sheet

            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("message");
            //添加列名

            worksheet.Cells[1, 1].Value = "playerName";

            worksheet.Cells[1, 2].Value = "accuracy";

            worksheet.Cells[1, 3].Value = "usedTime";

            worksheet.Cells[1, 4].Value = "rankingTime";

            for (int i = 0; i < newList.Count; i++)
            {
                string[] messages = newList[i].Split('|'); //赵一|党员|1年|赵一.png| 
                string itemName = messages[0];
                string itemWork = messages[1];
                string itemYear = messages[2];
                string imageName = messages[3];
                //添加一行数据

                int num = i + 2;

                worksheet.Cells["A" + num].Value = itemName;

                worksheet.Cells["B" + num].Value = itemWork;

                worksheet.Cells["C" + num].Value = itemYear;

                worksheet.Cells["D" + num].Value = imageName;
            }

            //保存excel
            package.Save();
            print("重写完成");
        }
    }

三、排行榜的制作

 /// <summary>
    /// tmpSubmit - 游戏结束输入
    /// </summary>
    public void SubmitRanking(string tmpSubmit)
    {
        startRanking = LoadData();

        Debug.Log(startRanking.Count);
        //Debug.Log("Excel:"+startRanking.Count);
        //Debug.Log("EndExcel:"+startRanking[startRanking.Count-1]);
        if (startRanking.Count == 8)
        {
            if (FloatReckonRatio(startRanking[startRanking.Count - 1]) < FloatReckonRatio(tmpSubmit))
            {
                startRanking[startRanking.Count - 1] = tmpSubmit;
                ListSort(startRanking);
                //Debug.Log(startRanking[startRanking.Count-1]);
                //把最后一面顶替掉然后进行排序
                Debug.Log("进入排行榜成功");
            }
            else
            {
                Debug.Log("进入排行榜失败");
            }

            Debug.Log("有八位数据");
        }
        else
        {
            startRanking.Add(tmpSubmit);
            ListSort(startRanking);
            Debug.Log("未够十位数");
        }

        startRanking = LoadData();
        for (int i = 0; i < startRanking.Count; i++)
        {
            Debug.Log(startRanking[i]);
        }
    }

    /// <summary>
    /// 计算是 占比值 玩家分数
    /// </summary>
    /// <param name="tmpFormerRan"></param>
    /// <returns></returns>
    public float FloatReckonRatio(string tmpFormerRan)
    {
        float ratioFloat = 0;

        for (int i = 0; i < tmpFormerRan.Length; i++)
        {
            string[] tmpString = tmpFormerRan.Split('|');

            float accuracy = float.Parse(tmpString[1]) / 100f;
            float usedTime = 1 / float.Parse(tmpString[2]);
            float total = accuracy + usedTime;

            ratioFloat = total;
        }
        return ratioFloat;
    }

    /// <summary>
    /// 让List进行重新排序排序
    /// </summary>
    /// <param name="tmpList"></param>
    public List<string> ListSort(List<string> tmpList)
    {
        List<string> _tmpData = new List<string>();

        //数据至少有两个 才开始进行排序
        if (tmpList.Count > 1)
        {
            _tmpData = tmpList;
            for (int i = 0; i < _tmpData.Count; i++)
            {
                for (int j = 0; j < _tmpData.Count - 1 - i; j++)
                {
                    if (FloatReckonRatio(_tmpData[j]) < FloatReckonRatio(_tmpData[j + 1]))
                    {
                        string data = _tmpData[j];
                        _tmpData[j] = _tmpData[j + 1];
                        _tmpData[j + 1] = data;
                    }
                }
            }
        }
        else
        {
            _tmpData = tmpList;
        }

        //读取重新建表
        WriteExcel(_tmpData);
        return _tmpData;
    }

整个脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using Excel;
using OfficeOpenXml;
using System.Data;

public class TestExcel : MonoBehaviour
{

    public static TestExcel instance;
    string value;
    string all;
    int testRow;

    private List<string> storageExcel = new List<string>();
    private List<string> startRanking;              //开始的时候存储的排行榜数据
    private string submit;

    private void Awake()
    {
        instance = this;
    }

    private void Start()
    {
        submit = "Me|40|29|2019530";
        SubmitRanking(submit);
    }

    /// <summary>
    ///返回数据的集合 
    ///数据的格式为 每一行为一条数据
    ///例:"Me|40|29|2019530" 
    /// </summary>
    /// <returns></returns>
    public List<string> LoadData()
    {
        // StreamingAssets目录下的  党员信息.xlsx文件的路径:Application.streamingAssetsPath + "/党员信息.xlsx" 
        FileStream fileStream = File.Open(Application.streamingAssetsPath + "/排行榜.xlsx", FileMode.Open, FileAccess.Read);
        IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
        // 表格数据全部读取到result里
        DataSet result = excelDataReader.AsDataSet();

        // 获取表格有多少列 
        int columns = result.Tables[0].Columns.Count;
        // 获取表格有多少行 
        int rows = result.Tables[0].Rows.Count;

        //获取表格的行数 -1去掉第一行
        //testRow = rows - 1;

        //Debug.Log("行" + rows);
        // 根据行列依次打印表格中的每个数据 

        List<string> excelDta = new List<string>();

        //第一行为表头,不读取
        for (int i = 1; i < rows; i++)
        {
            value = null;
            all = null;
            for (int j = 0; j < columns; j++)
            {
                // 获取表格中指定行指定列的数据 
                value = result.Tables[0].Rows[i][j].ToString();
                //Debug.Log("value = " + value);
                if (value == "")
                {
                    continue;
                }
                all = all + value + "|";
            }
            if (all != null)
            {
                print(all);
                excelDta.Add(all);
            }
        }
        return excelDta;
    }

    /// <summary>
    /// list内容格式
    /// "Me|40|29|2019530" 
    /// </summary>
    /// <param name="newList"></param>
    public void WriteExcel(List<string> newList)
    {
        //自定义excel的路径

        string path = Application.streamingAssetsPath + "/排行榜.xlsx";
        // print(Application.dataPath);

        FileInfo newFile = new FileInfo(path);

        if (newFile.Exists)
        {
            //创建一个新的excel文件

            newFile.Delete();

            newFile = new FileInfo(path);
        }

        //通过ExcelPackage打开文件
        using (ExcelPackage package = new ExcelPackage(newFile))
        {
            //在excel空文件添加新sheet

            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("message");
            //添加列名

            worksheet.Cells[1, 1].Value = "playerName";

            worksheet.Cells[1, 2].Value = "accuracy";

            worksheet.Cells[1, 3].Value = "usedTime";

            worksheet.Cells[1, 4].Value = "rankingTime";

            for (int i = 0; i < newList.Count; i++)
            {
                string[] messages = newList[i].Split('|'); //赵一|党员|1年|赵一.png| 
                string itemName = messages[0];
                string itemWork = messages[1];
                string itemYear = messages[2];
                string imageName = messages[3];
                //添加一行数据

                int num = i + 2;

                worksheet.Cells["A" + num].Value = itemName;

                worksheet.Cells["B" + num].Value = itemWork;

                worksheet.Cells["C" + num].Value = itemYear;

                worksheet.Cells["D" + num].Value = imageName;
            }

            //保存excel
            package.Save();
            print("重写完成");
        }
    }

    /// <summary>
    /// tmpSubmit - 游戏结束输入
    /// </summary>
    public void SubmitRanking(string tmpSubmit)
    {
        startRanking = LoadData();

        Debug.Log(startRanking.Count);
        //Debug.Log("Excel:"+startRanking.Count);
        //Debug.Log("EndExcel:"+startRanking[startRanking.Count-1]);
        if (startRanking.Count == 8)
        {
            if (FloatReckonRatio(startRanking[startRanking.Count - 1]) < FloatReckonRatio(tmpSubmit))
            {
                startRanking[startRanking.Count - 1] = tmpSubmit;
                ListSort(startRanking);
                //Debug.Log(startRanking[startRanking.Count-1]);
                //把最后一面顶替掉然后进行排序
                Debug.Log("进入排行榜成功");
            }
            else
            {
                Debug.Log("进入排行榜失败");
            }

            Debug.Log("有八位数据");
        }
        else
        {
            startRanking.Add(tmpSubmit);
            ListSort(startRanking);
            Debug.Log("未够十位数");
        }

        startRanking = LoadData();
        for (int i = 0; i < startRanking.Count; i++)
        {
            Debug.Log(startRanking[i]);
        }
    }

    /// <summary>
    /// 计算是 占比值 玩家分数
    /// </summary>
    /// <param name="tmpFormerRan"></param>
    /// <returns></returns>
    public float FloatReckonRatio(string tmpFormerRan)
    {
        float ratioFloat = 0;

        for (int i = 0; i < tmpFormerRan.Length; i++)
        {
            string[] tmpString = tmpFormerRan.Split('|');

            float accuracy = float.Parse(tmpString[1]) / 100f;
            float usedTime = 1 / float.Parse(tmpString[2]);
            float total = accuracy + usedTime;

            ratioFloat = total;
        }
        return ratioFloat;
    }

    /// <summary>
    /// 让List进行重新排序排序
    /// </summary>
    /// <param name="tmpList"></param>
    public List<string> ListSort(List<string> tmpList)
    {
        List<string> _tmpData = new List<string>();

        //数据至少有两个 才开始进行排序
        if (tmpList.Count > 1)
        {
            _tmpData = tmpList;
            for (int i = 0; i < _tmpData.Count; i++)
            {
                for (int j = 0; j < _tmpData.Count - 1 - i; j++)
                {
                    if (FloatReckonRatio(_tmpData[j]) < FloatReckonRatio(_tmpData[j + 1]))
                    {
                        string data = _tmpData[j];
                        _tmpData[j] = _tmpData[j + 1];
                        _tmpData[j + 1] = data;
                    }
                }
            }
        }
        else
        {
            _tmpData = tmpList;
        }

        //读取重新建表
        WriteExcel(_tmpData);
        return _tmpData;
    }
}

读取Excel的百度网盘路径D文件:
链接:https://pan.baidu.com/s/1VrBqEdUDsiP_Z3pGi0CqOg
提取码:t2lt

为避免打包exe后读取不到excel数据,须将
Unity\Editor\Data\Mono\lib\mono\unity目录下的一系列i18n相关dll导入项目Plugins文件夹中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352