1. 程式人生 > 其它 >unity讀取Excel表格儲存到Sqlite資料庫

unity讀取Excel表格儲存到Sqlite資料庫

1.讀取Excel表格和儲存sqlite資料庫所用到的dll檔案   下載連結: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() { } }
c#指令碼親測可用

搜尋

複製