Unity3D_Excel表格的简单读写

注:本篇博客适用于读取 Excel 2007 版本及以上的文件

Excel 文件信息

1. 创建两个 C# 脚本文件(DoExcel、ShowExcel)

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

/// <summary>
/// 读取 Excel 表格
/// </summary>
/// 
public class DoExcel
{
    // 得到表格的信息
    private static DataSet ReadExcel(string path)
    {
        // FileStream 将文件转化为字节,可以操作任何类型的文件
        // File.Open 打开文件
        // (1)path 要打开的文件路径
        // (2)FileMode (以何种方式打开或者创建文件):CreateNew (创建新文件)、Create (创建并覆盖)、Open (打开) 、OpenOrCreate (打开并创建)、Truncate (盖文件)Append(追加)
        // (3)FileAcess(文件流对象如何访问该文件):Read (只读) 、Write (写)、ReadWirte(读写)
        // (4)FileShare (进程如何共享文件):None (拒绝共享)、Read、Write、ReadWrite (同时读写)、Delete
        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
        // CreateOpenXmlReader用于读取Excel2007版本及以上的文件
        // 后缀为.xlsx
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        // 后缀为.xls
        //IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
        DataSet result = excelReader.AsDataSet();
        excelReader.Close();
        return result;
    }
    /// <summary>
    /// 将 Excel 表格的信息转化为 结构体
    /// </summary>
    /// <param name="path">Excel 的路径</param>
    /// <param name="tablesIndex">读取 Excel 中的第几张表(表格左下角,若读取 sheet1,则该值为0,若读取 sheet2,则该值为1 ...)</param>
    /// <returns></returns>
    public static ExcelData[] Load(string path, int tablesIndex = 0)
    {
        // 根据路径 解析到Excel
        DataSet resultds = ReadExcel(path);
        // 表格中有内容的 列 数(第一列为 1)
        int column = resultds.Tables[tablesIndex].Columns.Count;
        // 表格中有内容的 行 数(第一行为 1)
        int row = resultds.Tables[tablesIndex].Rows.Count;
        // 初始化结构体数组长度,表格有多少行,结构体数组就有多少个元素
        ExcelData[] _data = new ExcelData[row];
        // 测试打印:行数,列数
        Debug.Log("表格行数为:" + row + ",列数为:" + column);
        for (int i = 0; i < row; i++)
        {
            // 第一行和第一列都是 0
            _data[i] = new ExcelData(
                resultds.Tables[tablesIndex].Rows[i][0].ToString(),
                resultds.Tables[tablesIndex].Rows[i][1].ToString(),
                resultds.Tables[tablesIndex].Rows[i][2].ToString(),
                resultds.Tables[tablesIndex].Rows[i][3].ToString(),
                resultds.Tables[tablesIndex].Rows[i][4].ToString(),
                resultds.Tables[tablesIndex].Rows[i][5].ToString(),
                resultds.Tables[tablesIndex].Rows[i][5].ToString());
        }

        // 测试:是否正确读取到了Excel中的信息(将读取到的信息打印出来)
        TestPrintWord(_data);
        return _data;
    }

    // 测试方法:测试赋值是否成功
    public static string TestPrintWord(ExcelData[] dataList)
    {
        string testStr = "";
        for (int i = 0; i < dataList.Length; i++)
        {
            testStr += dataList[i].xueHao + "\t";
            testStr += dataList[i].xingMing + "\t";
            testStr += dataList[i].banJi + "\t";
            testStr += dataList[i].yuWen + "\t";
            testStr += dataList[i].shuXue + "\t";
            testStr += dataList[i].yingYu + "\t";
            testStr += dataList[i].zongFen + "\t\n";
        }
        Debug.Log(testStr);
        return testStr;
    }
    public static void Write(string path)
    {
        // 得到对应路径中的文件信息(如果没有就创建)
        FileInfo fileInfo = new FileInfo(path);
        //如果得到了文件中的信息(fileInfo 不为空)
        if (fileInfo.Exists)
        {
            fileInfo.Delete();  // ensures we create a new workbook   
            Debug.Log("删除表");
            fileInfo = new FileInfo(path);
        }
        using (ExcelPackage package = new ExcelPackage(fileInfo))
        {
            // 添加一张表,并命名(左下角的 sheet)
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("我的Excel");
            // 第 1 行,第 1 列
            worksheet.Cells[1, 1].Value = "序号";
            // 第 1 行,第 2 列
            worksheet.Cells[1, 2].Value = "姓名";
            // 第 1 行,第 3 列
            worksheet.Cells[1, 3].Value = "电话";
            // 第 2 行,A 列
            worksheet.Cells["A2"].Value = "1";
            // 第 2 行,B 列
            worksheet.Cells["B2"].Value = "小曼";
            // 第 2 行,C 列
            worksheet.Cells["C2"].Value = "2313840742";
            package.Save();
            Debug.Log("导出Excel成功");
        }
    }
    public static void Write2(string Path,string message = "")
    {
        string content = "Agent绝对坐标, Agent相对于Sign, Sign相对于Agent,发生时刻, Sign的名字,持续时常\n" + message;
        File.WriteAllText(Path, content);

    }

}
// 结构体:一般来说 根据 Excel 的表头编写,Excel 中有多少列,结构体中就有多少个字段
public struct ExcelData
{
    public string xueHao;
    public string xingMing;
    public string banJi;
    public string yuWen;
    public string shuXue;
    public string yingYu;
    public string zongFen;

    public ExcelData(string XueHao, string XingMing, string BanJi, string YuWen, string ShuXue, string YingYu, string ZongFen)
    {
        xueHao = XueHao;
        xingMing = XingMing;
        banJi = BanJi;
        yuWen = YuWen;
        shuXue = ShuXue;
        yingYu = YingYu;
        zongFen = ZongFen;
    }
}
using UnityEngine;
using UnityEngine.UI;

public class ShowExcel : MonoBehaviour
{
    private void Update()
    {
        // 按下空格键之后读名为“Read.xlsx”的表格,生成一个名为“Write.xlsx”的表格
        if (Input.GetKeyDown(KeyCode.Space))
        {
            DoExcel.Load(Application.streamingAssetsPath + "/Read.xlsx");
            DoExcel.Write2(Application.streamingAssetsPath + "/Write.xlsx");
        }
    }
}

2. 导入Dll文件

dll文件 及 示例工程可在文章末尾进行下载,只有导入了如下图所示的dll文件,工程打包之后才能用,否则只能在编辑器中使用。

 

 3. 设置 .NET 级别为 .NET 4.x

不设置为 4.x 打包之后只能读取Excel,不能生成Excel,如打包后没有生成 Excel的需求则不用设置此项

 

 示例工程(点击下载

 

posted on 2022-08-09 11:31  考拉宝贝  阅读(558)  评论(0编辑  收藏  举报

导航