Unity使用EPPlus读取写入表格

unity:2021.3.26f1c1

实现读取指定行内容、指定列内容、指定单元格内容、修改指定单元格内容、清空指定行、存储表格功能,注意,代码中没有创建表格功能 ,因为这个脚本本身是设计来更改已有表格

一、环境配置

导入Nuget for unity包https://github.com/GlitchEnzo/NuGetForUnity (因为epplus是nuget包)配置参考官方文档

最好配置一下安装位置,不然会在文件目录吐一堆非常难看,把包位置放在自己想放的地方(但是可能会出现代码找不到包的情况)

搜索EPPlus并安装

二、代码

我这里由于个人需求开了三个表格,只需要开一个的把列表改成一个就行了

cs 复制代码
using System;
using System.IO;
using System.Collections.Generic;
using OfficeOpenXml;

public  class TableUtility
{
    private readonly Dictionary<string, string> _tables = new Dictionary<string, string>();
    private readonly Dictionary<string, ExcelPackage> _packages = new Dictionary<string, ExcelPackage>();

    public TableUtility()
    {
        ExcelPackage.License.SetNonCommercialPersonal("个人姓名");//注册许可证
    }

    // 1. 打开表格:注册三个Excel文件路径(必须已存在)
    public void OpenTables(string tableAPath, string tableBPath, string tableCPath)
    {
        RegisterTable("A", tableAPath);
        RegisterTable("B", tableBPath);
        RegisterTable("C", tableCPath);
    }

    public void RegisterTable(string key, string filePath)
    {
        if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("key不能为空");
        if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentException("filePath不能为空");
        if (!File.Exists(filePath)) throw new FileNotFoundException($"文件不存在: {filePath}");
        
        _tables[key] = filePath;
        var package = new ExcelPackage(new FileInfo(filePath));
        _packages[key] = package;
    }

    private ExcelWorksheet GetWorksheet(string tableKey)
    {
        if (!_packages.TryGetValue(tableKey, out var package))
            throw new KeyNotFoundException($"未找到表格key: {tableKey}");
        return package.Workbook.Worksheets[0]; // 默认取第一个工作表
    }

    // 读取指定行内容(返回字符串数组,1-based行索引)
    public string[] ReadRow(string tableKey, int rowIndex)
    {
        var ws = GetWorksheet(tableKey);
        int colCount = ws.Dimension?.End.Column ?? 0;
        var result = new string[colCount];
        for (int c = 1; c <= colCount; c++)
        {
            result[c - 1] = ws.Cells[rowIndex, c].Text;
        }
        return result;
    }

    // 读取指定列内容(返回字符串数组,1-based列索引)
    public string[] ReadColumn(string tableKey, int colIndex)
    {
        var ws = GetWorksheet(tableKey);
        int rowCount = ws.Dimension?.End.Row ?? 0;
        var result = new string[rowCount];
        for (int r = 1; r <= rowCount; r++)
        {
            result[r - 1] = ws.Cells[r, colIndex].Text;
        }
        return result;
    }

    // 读取指定单元格内容(1-based行列索引)
    public string ReadCell(string tableKey, int rowIndex, int colIndex)
    {
        var ws = GetWorksheet(tableKey);
        return ws.Cells[rowIndex, colIndex].Text;
    }

    // 修改指定单元格内容(1-based行列索引)
    public void WriteCell(string tableKey, int rowIndex, int colIndex, object value)
    {
        var ws = GetWorksheet(tableKey);
        ws.Cells[rowIndex, colIndex].Value = value;
    }

    // 清空指定行(1-based行索引)
    public void ClearRow(string tableKey, int rowIndex)
    {
        var ws = GetWorksheet(tableKey);
        int colCount = ws.Dimension?.End.Column ?? 0;
        for (int c = 1; c <= colCount; c++)
        {
            ws.Cells[rowIndex, c].Clear();
        }
    }

    // 存储表格(保存所有已打开的表格)
    public void SaveAll()
    {
        foreach (var kv in _packages)
        {
            kv.Value.Save();
        }
    }

    // 存储指定表格
    public void Save(string tableKey)
    {
        if (!_packages.TryGetValue(tableKey, out var package))
            throw new KeyNotFoundException($"未找到表格key: {tableKey}");
        package.Save();
    }

    // 释放资源
    public void Dispose()
    {
        foreach (var pkg in _packages.Values)
        {
            pkg?.Dispose();
        }
        _packages.Clear();
        _tables.Clear();
    }
}

使用示例

cs 复制代码
var table = new TableUtility();
table.RegisterTable("A", "path/to/tableA.xlsx");
var row = table.ReadRow("A", 1); // 读取第1行
table.WriteCell("A", 2, 3, "新值"); // 写入第2行第3列
table.ClearRow("A", 5); // 清空第5行
table.Save("A"); // 保存表格A
table.Dispose(); // 释放资源
相关推荐
呆呆敲代码的小Y1 小时前
【Unity 实用工具篇】 | Unity中的软遮罩组件 SoftMaskForUGUI 快速上手使用
游戏·unity·游戏引擎·免费游戏·遮罩·软遮罩·softmask
野生技术架构师1 小时前
Kafka深度剖析:Topic-Partition-Segment 关系、分区策略与数据可靠性实现
kafka·c#·linq
gc_22991 小时前
学习C#调用AspNetCoreRateLimit包限制客户端访问次数(3:动态配置)
c#·限流·动态配置·coreratelimit
唐青枫1 小时前
C# 原始字符串字面量全面解析:多行字符串终于优雅了!
c#·.net
缺点内向4 小时前
如何在 C# 中将 Excel 工作表拆分为多个窗格
开发语言·c#·.net·excel
yangshuquan10 小时前
关于 C# 函数参数修饰符 out 和 in 的真相
c#·参数·in·修饰符·out
B0URNE10 小时前
【Unity基础详解】(11)Unity核心:输入系统
unity·游戏引擎
全栈师10 小时前
C#中控制权限的逻辑写法
开发语言·c#
夏霞11 小时前
c# 使用vs code 创建.net8.0以及.net6.0 webApi项目的教程
开发语言·c#·.net