当前位置: 首页 > article >正文

Unity 使用 ExcelDataReader 读取Excel表

文章目录

  • 1.下载NuGet包
  • 2.通过NuGet包获取dll
  • 3.将dll复制unity Plugins文件夹下
  • 4.代码获取Excel表内容

1.下载NuGet包

通过NuGet下载:

  • ExcelDataReader
  • ExcelDataReader.DataSet
  • 离线下载方法

2.通过NuGet包获取dll

根据编译时程序集找到dll位置,找到与unity3d的.net版本匹配的dll
在这里插入图片描述

3.将dll复制unity Plugins文件夹下

请添加图片描述

4.代码获取Excel表内容

这里给个异步读取Excel表的ExcelHelp类:

/*
 * FileName:    ReadExcelTest
 * Author:      ming
 * CreateTime:  2024/11/15 10:52:36
 * Description: 读取Excel数据(程序运行期间只读取一次)
 *
*/

using ExcelDataReader;
using System.Data;
using System.IO;
using System.Threading.Tasks;
using System;

public class ExcelHelper
{
    private string _filePath;
    private DataSet _cacheDataSet;  // 缓存读取的DataSet
    private readonly object _lock = new object();   // 线程锁

    public ExcelHelper(string filePath)
    {
        _filePath = filePath;
    }

    // 异步读取Excel数据
    public async Task<DataSet> ReadExcelAsync()
    {
        if (_cacheDataSet != null)
            return _cacheDataSet;

        return await Task.Run<DataSet>(() =>
        {
            lock (_lock)
            {
                if (_cacheDataSet == null)  // 双重检查锁定
                {
                    using (var stream = File.Open(_filePath, FileMode.Open, FileAccess.Read))
                    {
                        using (var reader = ExcelReaderFactory.CreateReader(stream))
                        {
                            _cacheDataSet = reader.AsDataSet();
                        }
                    }
                }
            }

            return _cacheDataSet;
        });
    }

    // 根据 sheet 名获取 DataTable
    public async Task<DataTable> GetSheetByNameAsync(string sheetName)
    {
        await ReadExcelAsync();
        return _cacheDataSet.Tables[sheetName];
    }
    
    // 根据 sheet 索引获取 DataTable
    public async Task<DataTable> GetSheetByIndexAsync(int sheetIndex)
    {
        await ReadExcelAsync();
        if (sheetIndex >= 0 && sheetIndex < _cacheDataSet.Tables.Count)
            return _cacheDataSet.Tables[sheetIndex];
        throw new ArgumentOutOfRangeException("Sheet index out of range");
    }

    // 获取指定行的内容(从 0 开始的行索引)
    public async Task<object[]> GetRowAsync(string sheetName, int rowIndex)
    {
        var table = await GetSheetByNameAsync(sheetName);
        if (rowIndex >= 0 && rowIndex < table.Rows.Count)
        {
            return table.Rows[rowIndex].ItemArray;
        }
        throw new ArgumentOutOfRangeException("Row index out of range");
    }

    // 获取指定列的内容(从 0 开始的列索引)
    public async Task<object[]> GetColumnAsync(string sheetName, int columnIndex)
    {
        var table = await GetSheetByNameAsync(sheetName);
        if (columnIndex >= 0 && columnIndex < table.Rows.Count)
        {
            var column = new object[table.Rows.Count];
            for (int i = 0; i < table.Rows.Count; i++)
            {
                column[i] = table.Rows[i][columnIndex];
            }
            return column;
        }
        throw new ArgumentOutOfRangeException("Column index out of range");
    }

    // 获取指定单元格内容
    public async Task<object> GetCellAsync(string sheetName, int rowIndex, int columnIndex)
    {
        var table = await GetSheetByNameAsync(sheetName);
        if ( rowIndex >= 0 && rowIndex < table.Rows.Count &&
            columnIndex >= 0 && columnIndex < table.Columns.Count )
        {
            return table.Rows[rowIndex][columnIndex];
        }
        throw new ArgumentOutOfRangeException("Row or column index out of range");
    }

    // 获取指定 Sheet 行数
    public async Task<int> GetRowCountAsync(string sheetName)
    {
        var table = await GetSheetByNameAsync(sheetName);
        return table.Rows.Count;
    }

    // 获取指定 Sheet 列数
    public async Task<int> GetColumnCountAsync(string sheetName)
    {
        var table = await GetSheetByNameAsync(sheetName);
        return table.Columns.Count;
    }
}

http://www.kler.cn/a/409061.html

相关文章:

  • wireshark使用lua解析自定义协议
  • Mac配置maven环境及在IDEA中配置Maven
  • 部署一套开源客服系统,用户需要准备什么设备?
  • 数据库-基础理论
  • 解决Dcat Admin laravel框架登录报错问题,(blocked:mixed-content)
  • 基于之前的秒杀功能的优化(包括Sentinel在SpringBoot中的简单应用)
  • Ubuntu,openEuler,MySql安装
  • 力扣797. 所有可能的路径
  • 什么是Webpack,有什么特点
  • 基于FPGA(现场可编程门阵列)的SD NAND图片显示系统是一个复杂的项目,它涉及硬件设计、FPGA编程、SD卡接口、NAND闪存控制以及图像显示等多个方面
  • 【LeetCode】每日一题 2024_11_21 矩阵中的蛇(模拟)
  • 【机器学习】超简明Python基础教程
  • 数据抓取与存储:将网络爬虫数据保存到数据库的详细指南
  • 缓存大key如何解决
  • 基于Java Springboot餐饮美食分享平台
  • 【隐私计算大模型】联邦深度学习之拆分学习Split learning原理及安全风险、应对措施以及在大模型联合训练中的应用案例
  • BLIP-2模型的详解与思考
  • Docker+PostgreSQL数据库
  • java: itext8.05 create pdf
  • 初始Python篇(7)—— 正则表达式
  • 【Y20030005】Java+JSP+MySQL+Servlet的网络购物商城的设计与实现
  • RK3588适配MTK7921 USB接口WiFi驱动开发
  • mini-lsm通关笔记Week2Day5
  • 扩散模型中IGSO(3)分布PDF的近似表示
  • 鸿蒙学习高效开发与测试-集成开发环境(4)
  • 网络安全,文明上网(4)掌握网络安全技术