Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

news2025/3/13 7:37:14

本文仅作笔记学习和分享,不用做任何商业用途

本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)-CSDN博客

做完了数据结构类,该做一个存储类了,也就是生成一个字典类(只是声明) 

实现和上一节的数据结构类的方式大同小异,所以不再赘述,其中标有y的是今天这一节的代码,仅作参考 

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

public class ExcelTools 
{
    // 表格文件夹的路径
    private static string Excel_Path = Application.dataPath + "/Excel/";

    //数据结构类脚本存储
    private static string Data_Class_Path = Application.dataPath + "/Scripts/ExcelData/DataClass/";

    //容器类脚存储
    private static string Data_Container_Path = Application.dataPath + "/Scripts/ExcelData/Container/";

    // 生成和读取表格的方法
    [MenuItem("Tool/GenerateExcel")]
    private static void GenerateExcelInfo()
    {
        // 创建或返回表格文件夹的路径
        DirectoryInfo directoryInfo = Directory.CreateDirectory(Excel_Path);
        // 获取文件夹中的所有文件
        FileInfo[] fileInfo = directoryInfo.GetFiles();
        // 数据表集合
        DataTableCollection dataTableCollection;

        for (int i = 0; i < fileInfo.Length; i++)
        {
            // 筛选出扩展名为 .xlsx 或 .xls 的文件
            if (fileInfo[i].Extension != ".xlsx" && fileInfo[i].Extension != ".xls")
                continue;

            // 打开文件流读取表格
            using (FileStream fs = fileInfo[i].Open(FileMode.Open, FileAccess.Read))
            {
                // 使用 IExcelDataReader 读取表格数据
                IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fs);
                dataTableCollection = excelDataReader.AsDataSet().Tables; // 转换为数据表集合
                fs.Close();
            }

            // 输出每个工作表的名称
            foreach (DataTable temp in dataTableCollection)
            {
                Debug.Log(temp.TableName);

                //生成数据结构类
                GenerateExcelDataClass(temp);
                //生成数据容器类
                GenerateExcelContainer(temp);
            }
           

        }
    }

    //生成数据结构类的方法-x
    private static void GenerateExcelDataClass(DataTable dataTable)
    {
       DataRow dataRowName= GetVariableNameRow(dataTable);
       DataRow dataRowType= GetVariableDataTypeRow(dataTable);
        //判断存储该脚本的路径是否为空
        if(!Directory.Exists(Data_Class_Path))
            Directory.CreateDirectory(Data_Class_Path);

        string str = "public class " + dataTable.TableName.ToString()+"\n{\n";

        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            str += "  public " + dataRowType[0].ToString() + " " + dataRowName[i].ToString() + ";" + "\n";
        }

        str += "}";

        ///dataTable.TableName.ToString() =类名,".cs"=后缀名,str=内容
        File.WriteAllText(Data_Class_Path+dataTable.TableName.ToString()+".cs", str);

    }
    //生成容器类的方法-y
    private static void GenerateExcelContainer(DataTable dataTable)
    {
        int keyIndex = GetKey(dataTable);
        //得到该key所代表的字段类型
        DataRow keyForType = GetVariableDataTypeRow(dataTable);
        //检查路径
        if (!Directory.Exists(Data_Container_Path))
            Directory.CreateDirectory(Data_Container_Path);

        //拼接字符串
        string str = "using System.Collections.Generic;\n";

        str += "public class " + dataTable.TableName.ToString() + "Container"+"\n{\n";
        
        str += "    ";
        str += "  " + "public " + "Dictionary<" + keyForType[keyIndex] + "," + dataTable.TableName.ToString() + "> ";
        str += "dataDic = new Dictionary" + "<" + keyForType[keyIndex] + "," + dataTable.TableName.ToString() + " >();\n";

        str += "}";

        //写入文件
        ///dataTable.TableName.ToString() =类名,".cs"=后缀名,str=内容
        File.WriteAllText(Data_Container_Path + dataTable.TableName.ToString() + "Container.cs", str);
    }

    //获取表中行字段名字的方法-x
    private static DataRow GetVariableNameRow(DataTable dataTable)
    { 
    return dataTable.Rows[0];   //索引可修改
    }
    //获取表中行字段数据类型的方法-x
    private static DataRow GetVariableDataTypeRow(DataTable dataTable)
    {
        return dataTable.Rows[1];//索引可修改
    }

    //获取key的索引-y
    private static int GetKey(DataTable dataTable)
    { 
     DataRow keyRow =dataTable.Rows[2];//key所在的行,此处索引可改
        //然后找到key所在的列,也就是具体单元格的位置
        for (int i = 0; i<dataTable.Columns.Count ; i++)
        {
            if (keyRow[i].ToString() == "Key")//通过keyRow[i]得到第三行每一列的值
                return i;    
        }
        return 0;
    }
}

结果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI基础 L5 Uninformed Search II 无信息搜索

How good is search? • Completeness: Does it always find a solution if one exists? 是否通解 • Optimality: Is the solution optimal (i.e., lowest cost)? 是否最优 • Time Complexity: How long does it take to find a solution? 时间多久 • Space Complexit…

程序员都在使用的画图工具

大家好&#xff0c;我是袁庭新。 程序员都在使用的画图工具&#xff0c;你一定没用过这款画图工具吧&#xff01;我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的&#xff0c;如下图所示&#xff1a; 再例如Redis集群故障恢复原理图我也是通…

【论文阅读】DETRs Beat YOLOs on Real-time Object Detection

文章目录 摘要一、介绍二、相关工作2.1 实时目标检测器2.2 端到端目标检测器 三、检测器的端到端速度3.1 分析 NMS3.2 端到端速度基准 四、实时 DETR4.1 模型概述4.2 高效混合编码器4.3不确定性最小的查询选择4.4 缩放的RT - DETR 五、实验5.1 与SOTA对比5.2 混合编码器的消融研…

VMware Fusion Pro 13 for Mac虚拟机软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 地址&#xff1a;www.macfxb.cn 二、开始安装 安装完成&#xff01;&#xff01;&#xff01;

F12抓包06-4:导出metersphere脚本

metersphere是一站式的开源持续测试平台&#xff0c;我们可以将浏览器请求导出为HAR文件&#xff0c;导入到metersphere&#xff0c;生成接口测试。 metersphere有2种导入入口&#xff08;方式&#xff09;&#xff0c;导入结果不同&#xff1a; 1.导入到“接口定义”&#xf…

ctfshow-web入门-sql注入(web237-web240)insert 注入

目录 1、web237 2、web238 3、web239 4、web240 1、web237 查询语句&#xff1a; //插入数据$sql "insert into ctfshow_user(username,pass) value({$username},{$password});"; 我们需要闭合单引号和括号 添加&#xff0c;查数据库名&#xff0c;payload&…

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户&#xff1a; 在OPPO手机中格式化存储卡后可以恢复图片吗&#xff1f;我删除了 OPPO上的视频和图片&#xff0c;我感觉很糟糕&#xff0c;因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…

解锁2024年PDF转PPT新技能,TOP4神器在手,职场晋升竟然如此简单

如今职场节奏快&#xff0c;信息传递和展示方式多样。PDF 兼容性强且稳定&#xff0c;用于分享和保存文件&#xff1b;PPT 演示功能强大&#xff0c;在开会、教学和汇报中不可或缺。实际工作中常需将 PDF 转 PPT&#xff0c;以便更好地演示和编辑。市场上因此出现众多高效方便的…

使用NetBackup GUI 图形化进行oracle备份和恢复

转载 一、环境介绍&#xff1a; 这个实验都是在vmware workstation里完成的。由于NetBackup7只能装在64位的系统上&#xff0c;所以这里采用了64位的rhel5.5系统&#xff0c;以及oracle 10gr2 for linux_x64的软件包。数据库的数据文件存储在ASM中。安装rhel、oracle、netback…

Selenium 实现图片验证码识别

前言 在测试过程中&#xff0c;有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试&#xff0c;怎么做图片验证码识别&#xff1f;本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk&#xff1a;1.8 tessdata&…

关于CPP——std::future异步操作

目录 一、std::future 简介 1.1 概念 1.2 应用场景 1.3 关联的方法 1.3.1 std::async 1.3.2 std::package 1.3.3 std::promise 二、future 用法 2.1 使用std::async关联异步任务 2.2 使用std::packaged_task 1. 获取任务结果的机制&#xff1a; 2. 异步任务的管理&a…

jmeter之仅一次控制器

仅一次控制器作用&#xff1a; 不管线程组设置多少次循环&#xff0c;它下面的组件都只会执行一次 Tips&#xff1a;很多情况下需要登录才能访问其他接口&#xff0c;比如&#xff1a;商品列表、添加商品到购物车、购物车列表等&#xff0c;在多场景下&#xff0c;登录只需要…

【STM32 Blue Pill编程】-ADC数据采样(轮询、中断和DMA模式)

ADC数据采样(轮询、中断和DMA模式) 文章目录 ADC数据采样(轮询、中断和DMA模式)1、硬件准备及接线2、ADC轮询模式2.1 轮询模式配置2.2 代码实现3、ADC中断模式3.1 中断模式配置3.2 代码实现4、ADC的DMA模式4.1 DMA模式配置4.2 代码实现在本文中,我们将介绍如何使用 ADC 并…

[JAVA基础知识汇总-1] 创建线程的几种方式

文章目录 1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 线程池 可以认为有四种方式&#xff0c;也可以认为有一种&#xff0c;因为都跟Runnable接口有关 1. 继承Thread类 代码 public class Thread1ExtendsThread extends Thread { // public Thread1(String …

思维导图与头脑风暴:你值得拥有的四大工作与学习利器

在工作与学习中&#xff0c;我们都遇到过这样的情况&#xff1a;我们需要就某一问题或项目&#xff0c;汇集多人的智慧与创意&#xff0c;这时&#xff0c;头脑风暴便成为了我们不可或缺的利器&#xff1b;而为了更好地进行头脑风暴&#xff0c;选择一款合适的在线思维导图工具…

【Qt开发】QT6.5.3安装方法(使用国内源)亲测可行!!!

目录 &#x1f315;下载在线安装包&#x1f315; 把安装包放到系统盘&#x1f315;开始安装&#x1f315;参考文章 &#x1f315;下载在线安装包 https://mirrors.nju.edu.cn/qt/official_releases/online_installers/ &#x1f315; 把安装包放到系统盘 我的系统盘是G盘&…

uniapp 全屏日历,动态无限加载

不好用请移至评论区揍我 原创代码,请勿转载,谢谢! 注:本人仅在微信小程序测试过,未在其他app/h5尝试过,按理说应该是可以的,代码没有引用任何第三方组件 日历中每个日期下方的空白部分均可自定义,写在代码中的<view class="item">我是内容</view>…

Go入门指南(The Way to Go) 完整版PDF

The Way To Go可以说是入门 Go 的经典书籍&#xff0c;这本书有内容丰富各种资料链接&#xff0c;这是截止到目前&#xff0c;大叔看到的写得最好的go 语言教材&#xff0c;非常详细.一口气读下来&#xff0c;舍不得放手&#xff0c;大叔强烈推荐你去学习 百度网盘分享

docker基于minio部署outline团队知识库

outline 介绍 Outline 是一个开源的Wiki 知识库和团队协作文档管理工具&#xff0c;美观、实时协作、功能丰富且兼容 Markdown&#xff0c;设计用于帮助团队和组织有效地创建、共享和管理文档。 Outline 具有简单易用的界面和强大的功能&#xff0c;可以替代传统的文档管理系…

winndows系统修改cmd用户中文名、系统中文用户名修改为英文用户名的方法

文章目录 一、问题描述二、修改步骤1. 准备&#xff1a;2. 注销&#xff1a;3. 修改&#xff1a;4. 继续修改&#xff1a; 一、问题描述 电脑用户显示中文名&#xff08;我这里已经修改了&#xff09; 二、修改步骤 1. 准备&#xff1a; 我们需要使用 Administrator 登录&am…