浅谈Unity之读取Excel表格保存到Sqlite数据库

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 读取Excel表格保存到Sqlite数据库

1.读取Excel表格和保存sqlite数据库所用到的dll文件  

最后如下图所示


废话不多说了,直接上代码吧


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using Mono.Data.Sqlite;

using System;

using System.IO;

using System.Data;

using Excel;

public class SQLiteDataBase

{

   private SqliteConnection conn; // SQLite连接

   private SqliteDataReader reader;

   private SqliteCommand command;// SQLite命令

   private float timespeed = 0.001f;

   /// <summary>

   /// 执行SQL语句  公共方法

   /// </summary>

   /// <param name="sqlQuery"></param>

   /// <returns></returns>

   public SqliteDataReader ExecuteQuery(string sqlQuery)

   {

       command = conn.CreateCommand();

       command.CommandText = sqlQuery;

       reader = command.ExecuteReader();

       return reader;

   }

   #region 打开/关闭数据库

   /// <summary>

   /// 打开数据库

   /// </summary>

   /// <param name="connectionString">@"Data Source = " + path</param>

   public SQLiteDataBase(string connectionString)

   {

       try

       {

           //构造数据库连接

           conn = new SqliteConnection(connectionString);

           //打开数据库

           conn.Open();

           Debug.Log("打开数据库");

       }

       catch (Exception e)

       {

           Debug.Log(e.Message);

       }

   }

   /// <summary>

   /// 关闭数据库连接

   /// </summary>

   public void CloseSqlConnection()

   {

       if (command != null) { command.Dispose(); command = null; }

       if (reader != null) { reader.Dispose(); reader = null; }

       if (conn != null) { conn.Close(); conn = null; }

       Debug.Log("关闭数据库!");

   }

   #endregion;

   #region 创建表单

   /// <summary>

   /// 创建表单  第一种

   /// </summary>

   /// <param name="name">表单名</param>

   /// <param name="col">字段</param>

   /// <param name="colType">类型</param>

   public void CreationMenu(string name, string[] col, string[] colType)

   {

       string query = "create table " + name + " (" + col[0] + " " + colType[0];

       for (int i = 1; i < col.Length; ++i)

       {

           query += ", " + col[i] + " " + colType[i];

       }

       query += ")";        

       command = new SqliteCommand(query, conn);

       command.ExecuteNonQuery();

   }

   /// <summary>  第二种  区别第一种用了公共方法  原理应该是一样的  经测试都可以使用

   /// 创建表  param name=表名 col=字段名 colType=字段类型

   /// </summary>

   public SqliteDataReader CreateTable(string name, string[] col, string[] colType)

   {

       if (col.Length != colType.Length)

       {

           throw new SqliteException("columns.Length != colType.Length");

       }

       string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0];

       for (int i = 1; i < col.Length; ++i)

       {

           query += ", " + col[i] + " " + colType[i];

       }

       query += ")";

       return ExecuteQuery(query);

   }

   #endregion;

   #region 查询数据

   /// <summary>

   /// 查询表中全部数据 param tableName=表名  

   /// </summary>

   public SqliteDataReader ReadFullTable(string tableName)

   {

       string query = "SELECT * FROM " + tableName;

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 按条件查询数据 param tableName=表名 items=查询字段 col=查找字段 operation=运算符 values=内容

   /// </summary>

   public SqliteDataReader SelectWhere(string tableName, string[] items, string[] col, string[] operation, string[] values)

   {

       if (col.Length != operation.Length || operation.Length != values.Length)

       {

           throw new SqliteException("col.Length != operation.Length != values.Length");

       }

       string query = "SELECT " + items[0];

       for (int i = 1; i < items.Length; ++i)

       {

           query += ", " + items[i];

       }

       query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";

       for (int i = 1; i < col.Length; ++i)

       {

           query += " AND " + col[i] + operation[i] + "'" + values[i] + "' ";

       }

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 查询表

   /// </summary>

   public SqliteDataReader Select(string tableName, string col, string values)

   {

       string query = "SELECT * FROM " + tableName + " WHERE " + col + " = " + values;

       return ExecuteQuery(query);

   }

   public SqliteDataReader Select(string tableName, string col, string operation, string values)

   {

       string query = "SELECT * FROM " + tableName + " WHERE " + col + operation + values;

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 升序查询

   /// </summary>

   public SqliteDataReader SelectOrderASC(string tableName, string col)

   {

       string query = "SELECT * FROM " + tableName + " ORDER BY " + col + " ASC";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 降序查询

   /// </summary>

   public SqliteDataReader SelectOrderDESC(string tableName, string col)

   {

       string query = "SELECT * FROM " + tableName + " ORDER BY " + col + " DESC";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 查询表行数

   /// </summary>

   public SqliteDataReader SelectCount(string tableName)

   {

       string query = "SELECT COUNT(*) FROM " + tableName;

       return ExecuteQuery(query);

   }

   #endregion

   #region 插入数据

   /// <summary>

   /// 插入数据 param tableName=表名 values=插入数据内容

   /// 插入一条数据

   /// </summary>

   public SqliteDataReader InsertInto(string tableName, string[] values)

   {

       string query = "INSERT INTO " + tableName + " VALUES ('" + values[0];

       for (int i = 1; i < values.Length; ++i)

       {

           query += "', '" + values[i];

       }

       query += "')";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 插入数据     插入多条数据

   /// </summary>    经测试这个方法是可用的

   /// 因为我的数据有两万条运行卡着不动了,所以用协程时间控制一下 虽然慢但是不卡死,写到数据库中之后用数据库就好了

   /// <param name="tableName">表名字</param>

   /// <param name="values">字典</param>

   /// <returns></returns>

   public IEnumerator InsertInto(string tableName, Dictionary<string, List<string>> values)

   {

       int ii = 0;

       foreach (var item in values)

       {

           string query = "";

           string value = "";

           foreach (var ite in item.Value)

           {

               value += "','" + ite;

           }

           query = "INSERT INTO " + tableName + " VALUES ('" + item.Key + value + "')";

           //Debug.Log(query);

           command = conn.CreateCommand();

           command.CommandText = query;

           command.ExecuteNonQuery();

           Debug.Log("写入成功" + ii++);

           yield return new WaitForSeconds(timespeed);

       }

       Debug.Log("写入成功");

   }

 

   #region 没测试过的

   /// <summary>

   /// 插入数据 param tableName=表名 cols=插入字段 value=插入内容

   /// </summary>

   public SqliteDataReader InsertIntoSpecific(string tableName, string[] cols, string[] values)

   {

       if (cols.Length != values.Length)

       {

           throw new SqliteException("columns.Length != values.Length");

       }

       string query = "INSERT INTO " + tableName + "('" + cols[0];

       for (int i = 1; i < cols.Length; ++i)

       {

           query += "', '" + cols[i];

       }

       query += "') VALUES ('" + values[0];

       for (int i = 1; i < values.Length; ++i)

       {

           query += "', '" + values[i];

       }

       query += "')";

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 更新数据 param tableName=表名 cols=更新字段 colsvalues=更新内容 selectkey=查找字段(主键) selectvalue=查找内容

   /// </summary>

   public SqliteDataReader UpdateInto(string tableName, string[] cols, string[] colsvalues, string selectkey, string selectvalue)

   {

       string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + colsvalues[0];

       for (int i = 1; i < colsvalues.Length; ++i)

       {

           query += ", " + cols[i] + " =" + colsvalues[i];

       }

       query += " WHERE " + selectkey + " = " + selectvalue + " ";

       return ExecuteQuery(query);

   }

   #endregion

   #endregion

   #region 删除

   /// <summary>

   /// 删除表   IF EXISTS判断表存不存在防止出错  已测试

   /// </summary>

   public SqliteDataReader DeleteContents(string tableName)

   {

       string query = "DROP TABLE IF EXISTS " + tableName;

       Debug.Log("删除表成功");

       return ExecuteQuery(query);

   }

   /// <summary>

   /// 删除数据 param tableName=表名 cols=字段 colsvalues=内容  

   /// </summary>

   public SqliteDataReader Delete(string tableName, string[] cols, string[] colsvalues)

   {

       string query = "DELETE FROM " + tableName + " WHERE " + cols[0] + " = " + colsvalues[0];

       for (int i = 1; i < colsvalues.Length; ++i)

       {

           query += " or " + cols[i] + " = " + colsvalues[i];

       }

       return ExecuteQuery(query);

   }

   #endregion

}

public class SQLiteDataBaseTion : MonoBehaviour

{

   [Header("Excel表数据长度")]   //表格一共有多少列数 最长的一个

   public int tableint;

   public string[] fields, type;   //字段\类型

   [Header("数据库名字")]

   public string dbname;

   private SQLiteDataBase _SQLiteData;

   private SqliteDataReader reader;

   private string path;

   private  string connectionString;

   public static Dictionary<string, List<string>> JDDateDic = new Dictionary<string, List<string>>();//机电数据

   public static Dictionary<string, List<string>> OneCDateDic = new Dictionary<string, List<string>>();//一层数据

   private void Awake()

   {

       fields = new string[tableint];

       type = new string[tableint];

       for (int i = 0; i < tableint; i++)

       {

           fields[i] = "sql" + i.ToString();

           type[i] = "varchar";

       }

   }

   // Start is called before the first frame update

   void Start()

   {

       //读取excel表格数据

       ReadExcelClick("jiegou.xlsx", 0, OneCDateDic);

       path = Application.streamingAssetsPath + "/"+ dbname + ".db";

       connectionString = @"Data Source = " + path;

       //创建数据库文件  存在就打开

       CreateSQL(dbname);        

       //创建表

       //_SQLiteData.CreationMenu("jiegou", fields, type);

       //将数据插入数据库

       //StartCoroutine(_SQLiteData.InsertInto("jiegou", OneCDateDic));

       //删除表  

       //_SQLiteData.DeleteContents("jiegou");

   }

   /// <summary>

   ///   创建数据库文件

   /// </summary>

   /// <param name="sqlname">文件名字</param>

   public void CreateSQL(string sqlname)

   {

       if (!File.Exists(Application.streamingAssetsPath + "/" + sqlname + ".db"))

       {

           //不存在就创建

           File.Create(Application.streamingAssetsPath + "/" + sqlname + ".db");

           //创建之后再打开

           _SQLiteData = new SQLiteDataBase(connectionString);

       }

       else

       {

           Debug.Log("已存在");

           //打开数据库

           _SQLiteData = new SQLiteDataBase(connectionString);

       }

   }

   /// 读取数据库某一行数据    "646c173c-7d14-47b0-80fe-53c1c8ce2b0e-0037044a"

   public List<string> SomeLine(string idname,out List <string >listidnames)

   {

       reader = _SQLiteData.ReadFullTable("jidian");

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

       while (reader.Read())

       {

           //Debug.Log(reader.GetString(reader.GetOrdinal("idname")));//  reader.ToString();

           if (reader.GetString(0).ToString() == idname)

           {

               for (int i = 0; i < reader.FieldCount; i++)

               {

                   try

                   {

                       if (reader.GetString(i) != null)

                       {

                           Debug.Log(reader.GetString(i));

                           idname_.Add(reader.GetString(i));

                       }

                   }

                   catch (Exception e)

                   {

                       Debug.Log(e.Message);

                       break;

                   }

               }

               listidnames = idname_;

               return listidnames;

           }          

       }

       listidnames = idname_;

       return listidnames;

   }

   //读取 Excel表格

   void ReadExcelClick(string _name, int _num, Dictionary<string, List<string>> _Dic)

   {

       //1.打开文件,创建一个文件流操作对象

       //FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/" + "机电.xlsx", FileMode.Open, FileAccess.Read);

       FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/" + _name, FileMode.Open, FileAccess.Read);

       //2.创建一个excel读取类

       IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

       //方法1:读取

       //while (reader.Read())

       //{

       //    string name = reader.GetString(0);

       //    string birth = reader.GetString(1);

       //    string brief = reader.GetString(2);

       //    Debug.Log("姓名:" + name + " --- " + "生卒:" + birth + " --- " + "简介:" + brief);

       //}

       //方法2:读取

       DataSet result = reader.AsDataSet();

       //获取行数

       int rows = result.Tables[_num].Rows.Count;

       Debug.Log(rows);

       //获取列数

       int column = result.Tables[_num].Columns.Count;

       for (int i = 0; i < rows; i++)

       {

           //获取i行的第一列数据

           string name = result.Tables[_num].Rows[i][0].ToString();

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

           for (int j = 1; j < column; j++)

           {

               string birth = result.Tables[_num].Rows[i][j].ToString();

               _S.Add(birth);

           }

           if (_Dic.ContainsKey(name))

           {

               continue;

           }

           _Dic.Add(name, _S);

       }

       Debug.Log(_Dic.Count);

   }

   private void OnDisable()

   {

       _SQLiteData.CloseSqlConnection();

   }

   // Update is called once per frame

   void Update()

   {

     

   }

}


相关文章
|
23天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
3月前
|
数据采集 人工智能 自然语言处理
表格增强生成TAG登场:解锁AI自然语言与数据库的完美结合
【10月更文挑战第4天】表格增强生成(TAG)范式解锁了AI自然语言处理与数据库的深度融合,旨在让用户通过自然语言便捷地查询和管理数据。TAG结合了语言模型的强大推理能力和数据库系统的高效计算能力,通过查询合成、执行及答案生成三步完成复杂查询。相较于传统Text2SQL和RAG方法,TAG在准确性上显著提升,但其应用仍面临技术门槛和数据质量等挑战。[论文地址:](https://arxiv.org/pdf/2408.14717)
85 4
|
6月前
|
关系型数据库 MySQL 数据库
使用Python读取xlsx表格数据并导入到MySQL数据库中时遇到的问题24
【7月更文挑战第24天】使用Python读取xlsx表格数据并导入到MySQL数据库中
70 7
|
5月前
|
SQL 前端开发 Java
已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中。需要对提交的信息进行修改,信息填入不能为空,为空则则有提示。
该博客文章通过示例演示了如何使用JSP结合SQL Server数据库向表`tb_book2`中添加图书信息,包括信息填写、前端验证、JavaBean封装图书属性、使用`PreparedStatement`执行插入操作,并确保了提交的信息不能为空,否则会给出提示。
|
7月前
|
存储 关系型数据库 数据库
回顾数据库的三级模式,为什么比直接存文件表格好?
【6月更文挑战第10天】本文介绍数据库用于解决Excel等文件系统存在的数据冗余、不一致和访问困难等问题。DBMS中的关系有一对一、一对多、多对一和多对多四种类型。键有候选键、超级键、主键、备用键和外键等类型,功能依赖分为平凡和非平凡两种。
53 0
回顾数据库的三级模式,为什么比直接存文件表格好?
|
7月前
|
SQL 关系型数据库 MySQL
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
|
7月前
|
SQL 存储 数据可视化
excel表格sql数据库
Excel表格和SQL数据库是两种不同的数据管理工具,它们各自有自己的特点和用途。下面我将分别介绍它们,并探讨它们之间的关系和互操作性。 一、Excel表格 Excel是微软公司推出的一款
|
7月前
|
图形学
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
278 0
|
7月前
|
关系型数据库 MySQL 数据库
mysql数据库表格的增删改查
mysql数据库表格的增删改查

热门文章

最新文章