Excel文件读取解析

来源:互联网 发布:java 泛型实现通用dao 编辑:程序博客网 时间:2024/06/02 07:13

游戏中很多数据都是策划配置的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;    }

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

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

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

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

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

public static byte[] TableToBytes(DataTable dt){    byte[] bytes = null;    List<byte[]> byteList = new List<byte[]>();    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;}

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

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


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

0 0
原创粉丝点击