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

news2024/12/27 13:14:38

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

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

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

本节内容

实现目标

通过已经得到的Excel表格数据,生成对应类对象(不赋值),一张表就是一个对象,其中包含了如下的字段

 就像这样子

 实现思路

上节已经获取了一个个单元格,那直接利用其中的字段进行字符串拼接

然后把这个字符串通过文件处理存到一个脚本文件之中就行了,自然就识别成了类对象了

实现过程 

生成数据结构类的脚本的路径

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

获得表中的字段名和字段类型 

   //生成数据结构类的方法
   private static void GenerateExcelDataClass(DataTable dataTable)
   {
       GetVariableNameRow(dataTable);
       GetVariableDataTypeRow(dataTable);


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

 确认或创建存储数据结构脚本的路径

  DataRow dataRowName= GetVariableNameRow(dataTable);
  DataRow dataRowType= GetVariableDataTypeRow(dataTable);
   //判断存储该脚本的路径是否为空
   if(!Directory.Exists(Data_Class_Path))
       Directory.CreateDirectory(Data_Class_Path);

狠狠拼接字符串

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

  str += "}";

存入先前的路径中,生成脚本 

Windows.File-WriteAllBytes - Unity 脚本 API

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

最终结果

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/";

    // 生成和读取表格的方法
    [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);
            }
           

        }
    }

    //生成数据结构类的方法
    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);

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

 

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

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

相关文章

算法-图论(建图,拓扑排序)

文章目录 建图的三种方式邻接矩阵邻接表链式前向星 拓扑排序拓扑排序基础原理介绍拓扑排序步骤解析拓扑排序模板leetcode-课程表 建图的三种方式 我们建图的三种方式分别是邻接矩阵, 邻接矩阵, 链式前向星 邻接矩阵 假设我们的点的个数为N个, 我们就把他们的下标依次标为1, …

Java邮件:如何配置以实现自动化邮件通知?

Java邮件发送性能优化策略&#xff1f;怎么实现Java 发邮件功能&#xff1f; Java邮件API提供了一个强大且灵活的框架&#xff0c;使得开发者能够轻松地集成邮件发送功能到他们的应用程序中。AokSend将详细介绍如何配置Java邮件&#xff0c;以实现自动化邮件通知。 Java邮件&…

大数据新视界 --大数据大厂之数据治理之道:构建高效大数据治理体系的关键步骤

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Leetcode 盛水最多的容器

算法思路&#xff1a; Explanation: Two-pointer technique: Start with two pointers, one at the beginning (left) and one at the end (right) of the height array.Calculate the area formed between the two vertical lines. The area is calculated as: Area ( righ…

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a;…

如何看待2020年的最新国际视频编解码标准H.266?

技术背景与发布 H.266&#xff0c;也被称为多功能视频编码&#xff08;Versatile Video Coding&#xff0c;简称VVC&#xff09;&#xff0c;是2020年定稿并发布的最新一代国际视频编码标准。 发布时间与机构&#xff1a;H.266由ISO/IEC MPEG和ITU-T VCEG联合制定&#xff0c;…

初学者指南:MyBatis 入门教程

主要介绍了Mybatis的基本使用、JDBC、数据库连接池、lombok注解&#xff01; 文章目录 前言 什么是Mybatis? 快速入门 使用Mybatis查询所有的用户信息 配置SQL提示 JDBC介绍 Mybatis 数据库连接池 lombok 总结 前言 主要介绍了Mybatis的基本使用、JDBC、数据库连接…

Prometheus 监控平台(Prometheus Monitoring Platform)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

使用TableGeneration生成表格数据集

使用TableGeneration生成表格数据集 1.TableGeneration介绍2.TableGeneration使用2.1配置环境2.2下载Chrome驱动2.3将驱动放入指定目录2.4 验证环境 3参数说明 1.TableGeneration介绍 TableGeneration是一个可以生成多种格式表格图片的工具&#xff0c;主要用于批量生成给AI训…

Element UI入门笔记(个人向)

Element UI入门笔记 将页面分割为一级菜单、二级菜单、导航栏三个部分&#xff1b;使用npm下载安装&#xff0c;使用语句npm i element-ui -s; 布局组件 el-form 用于创建和管理表单&#xff1b;从属性上看&#xff1a; :model&#xff1a;用于双向数据绑定&#xff0c;将表单…

轮询解决方案

概述 轮询的使用场景&#xff1a; 股票 K 线图聊天重要通知&#xff0c;实时预警 这些场景都是都要实时性的。 http 是请求响应模式&#xff0c;一定需要先请求&#xff0c;后响应。 解决方案&#xff1a; 短轮询&#xff1a;interval 定时发送请求。问题&#xff1a;大量…

18 C语言实现深度优先搜索

#include "stdio.h" #include "stdlib.h" #include "stdbool.h"#define MaxVertex 10typedef char ElemType;typedef struct Node { //链表中的值int nextVertex;//指向的位置struct Node *next; } Node;struct HeadNode {//链表头ElemType data…

第309题|证明函数单调有界的核心思路 |武忠祥老师每日一题

解题思路&#xff1a;两个极限存在准则&#xff1a;1.夹闭。 2.单调有界。 这里题目告诉了我们f(x)的导数,如果我们判断出了 导数的正负&#xff0c;就能得出f&#xff08;x&#xff09;的单调性。 显然是大于0的&#xff0c;看后半部分:是否大于0&#xff0c;这里直接比较和…

借助大模型将文档转换为视频

利用传统手段将文档内容转换为视频&#xff0c;比如根据文档内容录制一个视频&#xff0c;不仅需要投入大量的时间和精力&#xff0c;而且往往需要具备专业的视频编辑技能。使用大模型技术可以更加有效且智能化地解决上述问题。本实践方案旨在依托大语言模型&#xff08;Large …

[001-03-007].第26节:分布式锁迭代1->基于setnx命令实现分布式锁:

我的博客大纲 我的后端学习大纲 1、setnx命令&#xff1a; 2、逻辑梳理&#xff1a; 1.借助于redis中的命令setnx(key, value)&#xff0c;key不存在就新增&#xff0c;存在就什么都不做。同时有多个客户端发送setnx命令&#xff0c;只有一个客户端可以成功&#xff0c;返回1&…

velero v1.14.1迁移kubernetes集群

1 概述 velero是vmware开源的一个备份和恢复工具&#xff0c;可作用于kubernetes集群下的任意对象和应用数据&#xff08;PV上的数据&#xff09;。github地址是https://github.com/vmware-tanzu/velero。 对于应用数据&#xff0c;可分文件级别的复制和块级别的复制。文件级…

大模型国产化算力方案

方案1 - 摩尔线程 MTT S4000 | 摩尔线程 大模型训练平台架构 摩尔线程大模型训练平台&#xff0c;完全兼容 CUDA 和 Pytorch 训练系统&#xff0c;支持 Megatron-LM、DeepSpeed、FSDP 和 Colossal-AI 等大模型分布式训练框架。具有全兼容、高性能、高灵活性和简单易用等特点…

【算法系列】双指针:283.移动零

目录 双指针介绍 283.移动零 1.题目介绍 2. 解决思路&#xff1a; 动图演示 代码&#xff1a; 双指针介绍 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是快慢指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 1、对撞指…

dp+观察,CF 1864 D. Matrix Cascade

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 https://codeforces.com/problemset/problem/1864/D 二、解题报告 1、思路…

在虚拟机安装mysql数据库

一、安装步骤&#xff08;下载包-传输软件包-安装包-启用仓库-使用yum安装服务器&#xff09; 1、要在mysql官网下载yum仓库包 2、下载好rpm包后&#xff0c;将其通过xftp传输到root目录下 3、使用sudo yum install yum的仓库名&#xff08;sudo yum install mysql-community-…