首页 > 技术文章 > unity读取Excel表格保存到Sqlite数据库

qq2351194611 2022-05-24 09:05 原文

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#脚本亲测可用

 

 

 

 

推荐阅读