Unity 关于Excel文件的读取和修改

Unity 可以对Excel表进行读取和修改操作。

可以指定Excel的Sheet。将数据通过行列的对应关系进行读取或修改。

读取:

方法一:

    /// <summary>
    /// 读取Excel表
    /// </summary>
    /// <param name="excelpath">表路径</param>
    /// <param name="sheetname">sheet名称</param>
    public static List<string[]> ReadExcelFuncOne(string excelpath,string sheetname) {
        FileStream fileStream = File.Open(excelpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
        DataSet dataset = excelDataReader.AsDataSet();
        List<string[]> result = new List<string[]>();
        DataRowCollection dataRow = dataset.Tables[sheetname].Rows;
        for (int i = 0; i < dataRow.Count; i++)
        {
            DataRow datarow = dataRow[i];
            string[] temp = new string[datarow.ItemArray.Length];
            for (int j = 0; j < datarow.ItemArray.Length; j++)
            {
                temp[j] = datarow.ItemArray[j].ToString();
            }
            result.Add(temp);
        }
        return result;
    }

注意File.Open函数里面的【FileShare.ReadWrite】参数,如果没有的话当Excel表处于打开状态下,读取会报错。

方法二:

    /// <summary>
    /// 读取Excel表
    /// </summary>
    /// <param name="excelpath">表路径</param>
    /// <param name="sheetname">sheet名称</param>
    public static List<string[]> ReadExcelFuncTwo(string excelpath, string sheetname) {
        FileStream fileStream = File.Open(excelpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        ExcelPackage pck = new ExcelPackage(new MemoryStream(), fileStream);
        ExcelWorkbook ewb = pck.Workbook;
        ExcelWorksheet ew = ewb.Worksheets[sheetname];
        int columns = ew.Dimension.End.Column;//获取列数   
        int rows = ew.Dimension.End.Row;//获取行数

        List<string[]> result = new List<string[]>();

        //第一行为表头,不读取        
        for (int i = 1; i <=rows; i++)
        {
            string[] rowData = new string[columns];
            for (int j = 1; j <=columns; j++)
            {
                // 获取表格中指定行指定列的数据 
                rowData[j - 1] = ew.Cells[i, j].Value.ToString();
            }
            result.Add(rowData);
        }
        return result;
    }

 

 注意数据的起始下标不是从[0,0]开始 ,而是从[1,1]开始的。

 

写入:

    /// <summary>
    /// 写Excel表
    /// </summary>
    /// <param name="excelpath"></param>
    /// <param name="sheetname"></param>
    /// <param name="data"></param>
    public static void WriteExcel(string excelpath, string sheetname,List<string[]> data) {
        if (data == null || data.Count == 0) return;
        FileInfo fileInfo = new FileInfo(excelpath);
        using (ExcelPackage package = new ExcelPackage(fileInfo))
        {
            package.Workbook.Worksheets.Delete(sheetname);
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheetname);
            for (int i = 0; i < data.Count; i++)
            {
                for (int k = 0; k < data[i].Length; k++)
                {
                    worksheet.Cells[i+1, k + 1].Value = data[i][k];
                }
            }
            package.Save();
        }
    }

 

 我测试中发现当表在打开状态下会写入失败。后面如果发现有办法在打开状态下写入的话再更新。

 

测试过程:

本地Excel表

读表测试

读表正常

写入测试也正常

 

引用的dll

 

下面会附上工程 .unitypackage包的网盘地址,包含引用的dll。有需要的小伙伴可以下载。

如果需要发布出来的话还需要引用一些dll。这些dll可以在unity的安装路径下找到。

 

 

测试工程网盘地址 我使用的是unity版本是2019.2

 链接:https://pan.baidu.com/s/1cZaoYhEVCDR5KNdHUSUqrA
 提取码:wpsi

posted on 2020-07-30 14:30  呆子园  阅读(1589)  评论(1)    收藏  举报

导航