unity中读完表,怎么写入?

2021-06-17 08:58发布

4条回答

xcel 表的操作少不了要引入第三方库,首先我们需要引入 Excel.dll 和 ICSharpCode.SharpZipLib.dll,这两个类库在网上都能找到;然后我们还需要引入 System.Data.dll,这个类库在 Unity3D 的安装路径下的 Editor\Data\Mono\lib\mono\unity 文件夹下能找到。

代码如下:

 1 using Excel; 2 using System.Data; 3 using System.IO; 4 using UnityEngine; 5  6 public class Test : MonoBehaviour 
 7 { 8     #region -- 变量定义 9 10     #endregion11 12     #region -- 系统函数13     private void Start()14     {15         DataRowCollection _dataRowCollection = ReadExcel(Application.streamingAssetsPath + "/学生信息.xlsx");16         //这里从 1 开始循环,因为第一行被表头占据了。所以具体解析数据的时候需要根据具体情况来定。17         for (int i = 1; i < _dataRowCollection.Count; i++)18         {19             Debug.Log("学号:" + _dataRowCollection[i][0] + "--" + "姓名:" + _dataRowCollection[i][1] + "--" + "年龄:" + _dataRowCollection[i][2]);20         }21     }22     #endregion23 24     #region -- 自定义函数25     /// 26     /// 读取 Excel 表并返回一个 DataRowCollection 对象27     /// 28     /// Excel 表路径29     /// 读取的 Sheet 索引。Excel 表中是有多个 Sheet 的30     /// 31     private static DataRowCollection ReadExcel(string _path, int _sheetIndex = 0)32     {33         FileStream stream = File.Open(_path, FileMode.Open, FileAccess.Read, FileShare.Read);34         //IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//读取 Excel 1997-2003版本35         IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);//读取 2007及以后的版本36         DataSet result = excelReader.AsDataSet();37         return result.Tables[_sheetIndex].Rows;38     }39     /// 40     /// 读取 Excel 表并返回一个 DataRowCollection 对象41     /// 42     /// Excel 表路径43     /// 读取的 Sheet 名称。Excel 表中是有多个 Sheet 的44     /// 45     private static DataRowCollection ReadExcel(string _path, string _sheetName)46     {47         FileStream stream = File.Open(_path, FileMode.Open, FileAccess.Read, FileShare.Read);48         //IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//读取 Excel 1997-2003版本49         IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);//读取 2007及以后的版本50         DataSet result = excelReader.AsDataSet();51         return result.Tables[_sheetName].Rows;52     }53     #endregion54 55 }


啦啦啦
3楼 · 2021-06-17 15:39
using System.Collections;using System.Collections.Generic;using UnityEngine;using System.IO;  //操作文件夹时需引用该命名空间using System.Text;public class TxtWriteAndRead : MonoBehaviour{
    TextAsset m_Txt;

    void Start()
    {
        // AddTxtTextByFileStream("第一种方法添加text文本");

        // AddTxtTextByFileInfo("第二种方法添加txt文本");

        //重写数据
        // ReWriteMyTxtByFileStreamTxt();

        // ReadTxtFirst();
        //ReadTxtSecond();
        //ReadTxtThird();
        //ReadTxtForth();

        ReadTxtFifth();
    }

    /// 
    /// 创建txt 方法一
    /// 
    /// 
    public void AddTxtTextByFileStream(string txtText)
    {
        string path = Application.dataPath + "/Json/MyTxtByFileStream.txt";
        // 文件流创建一个文本文件
        FileStream file = new FileStream(path, FileMode.Create);
        //得到字符串的UTF8 数据流
        byte[] bts = System.Text.Encoding.UTF8.GetBytes(txtText);
        // 文件写入数据流
        file.Write(bts, 0, bts.Length);
        if (file != null)
        {
            //清空缓存
            file.Flush();
            // 关闭流
            file.Close();
            //销毁资源
            file.Dispose();
        }
    }

    /// 
    /// 可以重新写入文件到一个已存在的txt文本中去
    /// 
    void ReWriteMyTxtByFileStreamTxt()
    {
        string path = Application.dataPath + "/Json/MyTxtByFileStream.txt";

        string[] strs = { "123", "321", "234" };

        File.WriteAllLines(path, strs);

        /*
         文本内容为:(逐行显示的)
         123
         321
         234
         原文本内容为:
         第一种方法添加text文本
         */

        //如果想在某一行中添加一行新的,可以将原txt文本读取下来,保存到数组里,
        //然后新建一个数组,载将原数组文本与新加入的行数据同时写入到新数组里
        //然后用新数组数据替换(重写)原来的数据
    }

    /// 
    /// 创建txt 方法二
    /// 
    /// 
    public void AddTxtTextByFileInfo(string txtText)
    {
       string path = Application.dataPath + "/MyInfo.txt";
        StreamWriter sw;
        FileInfo fi = new FileInfo(path);

        if (!File.Exists(path))
        {
            sw = fi.CreateText();
        }
        else {
            sw = fi.AppendText();   //在原文件后面追加内容      
        }
        sw.WriteLine(txtText);
        sw.Close();
        sw.Dispose();
    }

    /// 
    /// 读取txt文本方法一
    /// 需要将txt文本放到Resources文件夹下读取
    /// 
    void ReadTxtFirst()
    {
        m_Txt = Resources.Load("readTxt");
        string str = m_Txt.text.ToString();
        print(str);  //txt文本数据读取
    }

    /// 
    /// 读取txt文本方法二
    /// 逐行读取 该方法可以单独获取某一行的数据
    /// 
    void ReadTxtSecond()
    {
        string path = Application.dataPath + "/Json/MyTxtByFileInfo.txt";
        //逐行读取返回的为数组数据
        string[] strs = File.ReadAllLines(path);

        foreach (string item in strs)
        {
            print(item); //第二种方法添加txt文本
                         //第二种方法添加txt文本  
        }
    }

    /// 
    /// 第三种读取方法
    /// 需引用  using System.Text;
    /// 
    void ReadTxtThird()
    {

        string path = Application.dataPath + "/Json/MyTxtByFileInfo.txt";

        string str = File.ReadAllText(path, Encoding.UTF8);

        print(str); //第二种方法添加txt文本
                    //第二种方法添加txt文本
    }

    /// 
    /// 第四种读取方法
    /// 
    void ReadTxtForth()
    {
        string path = Application.dataPath + "/Json/MyTxtByFileInfo.txt";
        //FileStream fsSource = new FileStream(path, FileMode.Open, FileAccess.Read);

        //文件读写流
        StreamReader strr = new StreamReader(path);
        //读取内容
        string str = strr.ReadToEnd();

        print(str);  //第二种方法添加txt文本
                     //第二种方法添加txt文本

    }

    /// 
    /// 第五种读取方法
    /// 文件流方式
    /// 
    void ReadTxtFifth() {
        string path = Application.dataPath + "/Json/MyTxtByFileInfo.txt";
        FileStream files = new FileStream(path, FileMode.Open, FileAccess.Read);
        byte[] bytes = new byte[files.Length];
        files.Read(bytes, 0, bytes.Length);
        files.Close();
        string str = UTF8Encoding.UTF8.GetString(bytes);
        print(str);     //第二种方法添加txt文本
                        //第二种方法添加txt文本
    }}


爱学习的小巴
4楼 · 2021-06-18 16:56

首先要注意的点:

1.你的unity版本是多少,去对应的安装目录中取dll

2.System.Data.dll 在D:\Program Files\Unity2017.2\Editor\Data\Mono\lib\mono\2.0

3.I18N开头的dll 在 D:\Program Files\Unity2017.2\Editor\Data\Mono\lib\mono\unity

4.2017.2版本demo工程(包含其他所需要的excel相关dll) 下载excel写入的表格 row,rol都是 从1 开始


摩羯摩羯
5楼 · 2022-03-23 17:51

引入pandas
使用pandas下的read_csv方法,读取csv文件,参数是文件的路径,这是一个相对路径,是相对于当前工作目录的,那么如何知道当前的工作目录呢?
使用os.getcwd()方法获取当前工作目录
读取前三后数据,查看一下是否读取正确,显然都是乱码,这是什么问题呢?
我们需要设定参数encoding,也就是编码方式,如果你不设定编码方式,默认是utf8,现在csv文件是gbk编码的,所以需要使用encoding='gbk'
我用的编辑器是eric4,注意,eric4默认是不支持中文的,如果你想要显示中文,前提是设置正确的编码,在preferences中
设置成utf8即可
回到pandas,我们可以有更多选项来设置打开数据时的操作:

相关问题推荐

  • 回答 5

    第一种方法:通过点击场景文件打开Unity游戏工程找到Unity游戏工程所在的目录,我这里的工程放在在E盘根路径的Unity_workspace文件夹中。注意:unity软件不支持中文路径,所以不要把工程放在中文文件夹下。我们在这里就打开New Unity Project 4工程,进入到Ne...

  • 回答 13
    已采纳

    如果是学习研究的话,当然是体验官方的最新版本。要是项目开发的话,还是要选择长期稳定版本,也就是大版本的LTS。比如2017.4或者是2018.4都是LTS版本,至于后面的小版本可以去看下更新的内容来做选择吧!...

  • 回答 9

    unity3D是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC...

  • 回答 11

    1、Unity3D:如果你需要开发大型游戏,或需要开发3D游戏的,请选这个。2、Cocos2D-x:如果你开发的是中小型游戏,对安装包大小比较在意的,请选这个。3、Andengine、Cocos2D-iPhone:如果你只为开发单平台游戏,又非常在意速度和安装包大小,请选这个。最后。...

  • 回答 11

    首先在场景中调整好你要观看的视角选择摄像机,按下Ctrl+Shift+F或者菜单栏->GameObject->Align with view在不行的话,可以调整摄像机的Position 和 Rotation

  • 回答 5

    将MeshRender组件移除即可:

  • 回答 9

    1.在Asset store里选择一个skybox。 2.从素材库中选择一个人物角色,也可以自己建模或者在其他软件中做好再导进来。 3.想好角色如何运动,然后用自己比较熟悉的语言编写来作展示,这段代码可以实现当你按下键盘上的A/D/S/W的按键时,角色会向前后左右四个方向的...

  • 回答 17

    还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学  学学js flash as等等  有个梯度就好多了如果要用好unity  不会编程那是不行的  学习的过程中都有个头疼的过程  记住  头越痛  代表你要接受的东西越多  坚持 你的大脑在和知识兼容中:D...

  • 回答 1

    需要添加如下引用: System.Configuration System.Data System.EnterpriseServices System.Security System.XML using UnityEngine; using System.Collections; using System;  using  System.Data;  using System.Data...

  • 物理引擎问题2021-06-15 17:35
    回答 4

    物理引擎则使用动量、扭矩等用高等数学手段来模拟真实物体,这将得到更真实的效果且使我们的编码更加容易。

  • 回答 1

    不能这样表述,三维通常是立体的空间,二维则是平面的。数学中通常是Oxyz表示空间直角坐标系,Oxy表示表示的是平面直角坐标系,你可以说空间直角坐标系中去掉Z轴可以转换为二维,因为去掉X或Y轴都能转换为二维。...

  • 回答 2

    GameObject.renderer.enabled//是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的GameObject.Destroy()//表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放,而是等到这...

  • Canvas三种渲染模式2021-04-29 19:50
    回答 10

    一:Overlay—覆盖模式类似于手机贴膜,所有UI都会显示在场景中2D,3D物体的上层在同一个Canvas下可以调整Canvas子物体的先后顺序,层级面板中越靠上则先被渲染多个Canvas下可以调整Canvas组件的Sort Order属性调整渲染顺序,数值越小的画布越先被渲染:Camer...

  • Unity引擎2021-04-29 19:47
    回答 4

    不得不说,Unity3d是个解放生产力的游戏引擎,自带了各种编辑器,可以进行一系列的可视化操作。需要注意的是,unity3d适合FPS游戏,物理游戏等中小型的游戏,并不太适合MMO开发。unity3d难学吗?如何学习unity3d呢?在学习之前又应该了解哪些内容呢?代码写不...

  • 回答 3

    不是人工检查的,如果你的问题里面有敏感关键字,是发不出去的,现在国内所有的网站在发布文章时都要进行检查的,所以你在发之前先检查一下看问题里面是否有违禁词语。

没有解决我的问题,去提问