3.读取Excel表数据

3.知识点补充-Excel数据读取


3.1 知识点

打开Excel表

注意

  • 假如ExcelDll放到Eiditor文件夹下 对Excel数据读取的脚本也要放到Eiditor文件夹下 否则无法访问 同时代码访问对应Excel表时不能打开占用对应Excel表 否则报错

在Eiditor文件夹下创建一个Excel表。写入一些内容。


创建打开Excel表方法

  • 主要知识点:

    1. FileStream读取文件流
    2. IExcelDataReader类,从流中读取Excel数据
    3. DataSet 数据集合类 将Excel数据转存进其中方便读取
  • 注意:

    • excelReader.AsDataSet()得到的是DataSet 代表整个Excel文件的数据
    • excelReader.AsDataSet().Tables得到的是tableConllection tableConllection是DataTable集合 代表的是一个是Excel文件中的子表集合
    • 比如PlayerInfo和Sheet2都算一个子表 对应数据结构是一个DataTable 只不过Sheet2是空而已
[MenuItem("Lesson03_知识点补充_Excel数据读取/打开Excel表")]
private static void OpenExcel()
{
    using (FileStream fileStream = File.Open(Application.dataPath + "/ArtRes/Excel/PlayerInfo.xlsx", FileMode.Open, FileAccess.Read))
    {
        // 通过ExcelReaderFactory的CreateOpenXmlReader和我们的文件流 获取Excel数据
        IExcelDataReader iExcelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

        // 将excel表中的数据转换为DataSet数据类型 方便我们 获取其中的内容
        DataSet dataSet = iExcelDataReader.AsDataSet();

        // 得到Excel文件中的所有表信息 现在Excel文件有PlayerInfo表和Sheet2空表 假如是空表不会遍历
        for (int i = 0; i < dataSet.Tables.Count; i++)
        {
            Debug.Log("表名:" + dataSet.Tables[i].TableName);
            Debug.Log("行数:" + dataSet.Tables[i].Rows.Count);
            Debug.Log("列数:" + dataSet.Tables[i].Columns.Count);
        }

        fileStream.Close();
    }
}

运行结果

获取Excel表中单元格的信息

主要知识点

  • FileStream读取文件流
  • IExcelDataReader类,从流中读取Excel数据
  • DataSet 数据集合类 将Excel数据转存进其中方便读取
  • DataTable 数据表类 表示Excel文件中的一个表
  • DataRow 数据行类 表示某张表中的一行数据
[MenuItem("Lesson03_知识点补充_Excel数据读取/获取Excel表中单元格的信息")]
private static void ReadExcel()
{
    // 打开 Excel 文件并创建文件流(FileMode.Open 表示以只读方式打开)
    using (FileStream fileStream = File.Open(Application.dataPath + "/ArtRes/Excel/PlayerInfo.xlsx", FileMode.Open, FileAccess.Read))
    {
        // 创建 ExcelDataReader 实例,用于读取 Excel 数据
        IExcelDataReader iExcelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

        // 将 Excel 数据读取为 DataSet 对象
        DataSet dataSet = iExcelDataReader.AsDataSet();

        // 遍历 DataSet 中的所有表格 一个Table代表Excel的一个子表
        for (int i = 0; i < dataSet.Tables.Count; i++)
        {
            // 得到当前表格
            DataTable table = dataSet.Tables[i];

            // 遍历当前表格中的所有行
            DataRow row;
            for (int j = 0; j < table.Rows.Count; j++)
            {
                // 得到当前行数据
                row = table.Rows[j];

                Debug.Log("*********新的一行************");

                // 遍历当前行中的所有列
                for (int k = 0; k < table.Columns.Count; k++)
                {
                    // 打印当前列的数据
                    Debug.Log(row[k].ToString());
                }
            }
        }

        // 关闭文件流
        fileStream.Close();
    }
}

获取Excel表中信息对于我们的意义?

  • 既然我们能够获取到Excel表中的所有数据

  • 那么我们可以根据表中数据来动态的生成相关数据

    • 数据结构类
    • 容器类
    • 2进制数据
  • 为什么不直接读取Excel表而要把它转成2进制数据

    • 提升读取效率
    • 提升数据安全性

3.2 知识点代码

using Excel;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using UnityEditor;
using UnityEngine;

public class Lesson03_知识点补充_Excel数据读取
{
    #region 知识点一 打开Excel表

    //注意:假如ExcelDll放到Eiditor文件夹下 对Excel数据读取的脚本也要放到Eiditor文件夹下 否则无法访问 同时代码访问对应Excel表时不能占用对应Excel表 否则报错

    //主要知识点:
    //1.FileStream读取文件流
    //2.IExcelDataReader类,从流中读取Excel数据
    //3.DataSet 数据集合类 将Excel数据转存进其中方便读取

    [MenuItem("Lesson03_知识点补充_Excel数据读取/打开Excel表")]
    private static void OpenExcel()
    {
        using (FileStream fileStream = File.Open(Application.dataPath + "/ArtRes/Excel/PlayerInfo.xlsx", FileMode.Open,
                   FileAccess.Read))
        {
            //通过ExcelReaderFactory的CreateOpenXmlReader和我们的文件流 获取Excel数据
            IExcelDataReader iExcelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

            //将excel表中的数据转换为DataSet数据类型 方便我们 获取其中的内容
            DataSet dataSet = iExcelDataReader.AsDataSet();

            //得到Excel文件中的所有表信息 现在Excel文件有PlayerInfo表和Sheet2空表 假如是空表不会遍历
            for (int i = 0; i < dataSet.Tables.Count; i++)
            {
                Debug.Log("表名:" + dataSet.Tables[i].TableName);
                Debug.Log("行数:" + dataSet.Tables[i].Rows.Count);
                Debug.Log("列数:" + dataSet.Tables[i].Columns.Count);
            }

            fileStream.Close();
        }
    }

    #endregion

    #region 知识点二 获取Excel表中单元格的信息

    //主要知识点:
    //1.FileStream读取文件流
    //2.IExcelDataReader类,从流中读取Excel数据
    //3.DataSet 数据集合类 将Excel数据转存进其中方便读取
    //4.DataTable 数据表类 表示Excel文件中的一个表
    //5.DataRow 数据行类 表示某张表中的一行数据

    [MenuItem("Lesson03_知识点补充_Excel数据读取/获取Excel表中单元格的信息")]
    private static void ReadExcel()
    {
        // 打开 Excel 文件并创建文件流(FileMode.Open 表示以只读方式打开)
        using (FileStream fileStream = File.Open(Application.dataPath + "/ArtRes/Excel/PlayerInfo.xlsx", FileMode.Open,
                   FileAccess.Read))
        {
            // 创建 ExcelDataReader 实例,用于读取 Excel 数据
            IExcelDataReader iExcelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);

            // 将 Excel 数据读取为 DataSet 对象
            DataSet dataSet = iExcelDataReader.AsDataSet();

            // 遍历 DataSet 中的所有表格
            for (int i = 0; i < dataSet.Tables.Count; i++)
            {
                // 得到当前表格
                DataTable table = dataSet.Tables[i];

                // 遍历当前表格中的所有行
                DataRow row;
                for (int j = 0; j < table.Rows.Count; j++)
                {
                    // 得到当前行数据
                    row = table.Rows[j];

                    Debug.Log("*********新的一行************");

                    // 遍历当前行中的所有列
                    for (int k = 0; k < table.Columns.Count; k++)
                    {
                        // 打印当前列的数据
                        Debug.Log(row[k].ToString());
                    }
                }
            }

            // 关闭文件流
            fileStream.Close();
        }
    }

    #endregion

    #region 知识点三 获取Excel表中信息对于我们的意义?

    //既然我们能够获取到Excel表中的所有数据
    //那么我们可以根据表中数据来动态的生成相关数据
    //1.数据结构类
    //2.容器类
    //3.2进制数据

    //为什么不直接读取Excel表而要把它转成2进制数据
    //1.提升读取效率
    //2.提升数据安全性

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏