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

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,5000CU*H 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()

   {

     

   }

}


相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
118 5
|
29天前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
50 2
|
2月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
74 6
|
6月前
|
数据安全/隐私保护
杨老师课堂之Excel VBA 程序开发第七讲表格数据高亮显示
杨老师课堂之Excel VBA 程序开发第七讲表格数据高亮显示
50 1
|
5月前
|
数据挖掘 Python
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
486 0
|
2月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
161 0
|
2月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
49 0
|
4月前
|
人工智能 BI
用ChatGPT做excel表格真香!只需动嘴提要求和复制粘贴
用ChatGPT做excel表格真香!只需动嘴提要求和复制粘贴
|
5月前
|
数据可视化 数据管理 定位技术
如何将QGIS中的属性表与Excel表格关联?
作为UE开发人员,经常会使用到QGIS进行数据管理编辑。QGIS与Excel之间数据并不完全兼容,而UE开发过程中大部分的前期数据都储存在Eecel里。为了将Excel数据写入QGIS属性表实现数据可视化,我们内部总结了一个最快捷的方法
|
4月前
Map——全国省市区EXCEL表格(包含code)
Map——全国省市区EXCEL表格(包含code)
61 0

热门文章

最新文章