Excel文件读取解析

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

游戏中很多数据都是策划配置的Excel数据表,在使用中,我们一般会转化成csv文件,但是每改一次都要转一次也是麻烦,不如直接将Excel读取出来。

怎么解析呢,我们需要使用到一个插件,插件地址如下
http://exceldatareader.codeplex.com/
可以下载最新版引入到工程。在一个就是鉴于中文编码问题,这里的Excel要求是xlsx格式的,这样读出来的数据就不会出现乱码问题。

准备工作做好了,可以开工了。

private static DataTable GetTable(IExcelDataReader excelReader)    {        DataTable dt = new DataTable();        dt.TableName = excelReader.Name;        bool isInit = false;        string[] ItemArray = null;        int rowsNum = 0;        while (excelReader.Read())        {            rowsNum++;            if (rowsNum < 3) continue;            if(!isInit)            {                isInit = true;                for (int i = 0; i < excelReader.FieldCount + 1; i++)                {                    dt.Columns.Add("", typeof(string));                }                ItemArray = new string[excelReader.FieldCount];            }            if (excelReader.IsDBNull(0))            {                continue;            }            for (int i = 0; i < excelReader.FieldCount; i++)            {                string value = excelReader.IsDBNull(i) ? "" : excelReader.GetString(i);                ItemArray[i] = value;            }            dt.Rows.Add(ItemArray);        }        return dt;    }     public static DataSet GetDataSet(string path)    {        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read);        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);        //   DataSet ds = excelReader.AsDataSet();//excel有空时会报错        DataSet ds = new DataSet();        do        {            DataTable dt = GetTable(excelReader);            ds.Merge(dt);        } while (excelReader.NextResult());        excelReader.Close();        excelReader.Dispose();        stream.Close();        stream.Dispose();        return ds;    }    public static DataTable GetFirstDataTable(string path)    {        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read);        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);        DataTable dt = GetTable(excelReader);        excelReader.Close();        excelReader.Dispose();        stream.Close();        stream.Dispose();        return dt;    }
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

这是对应的读取代码,这里有一个问题,注释那一句

//   DataSet ds = excelReader.AsDataSet();//excel有空时会报错
    
    
    
    
  • 1

所以这里需要换个方式来写。

由于游戏的跨平台性,要讲数据存储成文本或二进制格式,这里我选了二进制,响应的代码如下

“`
 public static byte[] GetFirstDataTableBytes(string path)
    {
        DataTable dt = GetFirstDataTable(path);
        return TableToBytes(dt);
    }

public static byte[] TableToBytes(DataTable dt){    byte[] bytes = null;    List byteList = new List();    for (int i = 0; i < dt.Rows.Count; i++)    {        for (int j = 0; j < dt.Rows[i].ItemArray.Length; j++)        {            byte[] tmpBytes = ByteTools.WriteString(dt.Rows[i].ItemArray[j].ToString());            byteList.Add(tmpBytes);        }    }    bytes = ByteTools.GetBytes(byteList);    return bytes;}public static byte[] ExcelToBytes(DataSet ds){    byte[] bytes = null;    int len = 0;    for (int i = 0; i < ds.Tables.Count; i++)    {        byte[] tmpBytes = TableToBytes(ds.Tables[i]);        bytes.CopyTo(tmpBytes, len);        len += tmpBytes.Length;    }    return bytes;}
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

根据项目具体需求也可自行定义数据结构,比如自动转换成csv文件等,定义特殊符号区分有效数据和策划注释等。

可以批量打包所有策划数据,经测试40多个数据表打包后解析时间为1秒的样子,包括数据转换,数据关联,由于文件大小问题,还使用了zip压缩,所以这里还包括了数据解压时间,效率上是可以接受的。


本文参考了雨松MOMO的文章,链接如下http://www.xuanyusong.com/archives/2429,感谢原作者提供好文章

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

你可能感兴趣的:(Excel文件读取解析)