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
- Excel文件读取解析
- java 操作 poi 解析、读取 Excel 文件
- Workbook解析excel文件 读取信息
- windows应用程序,读取excel文件并解析
- JAVA读取EXCEL文件号段解析
- iOS-解析读取CSV文件,解析excel文件
- java通过poi解析Excel文件,直接读取客户端文件
- 读取excel,并解析
- java 解析,读取excel
- DataStage 最佳实践之读取解析EXCEL文件
- Springboot 之 使用POI读取解析Excel文件
- POI读取并解析xlsx格式的excel文件
- 文件操作Excel解析(1)读取和写入Excel文件
- 文件操作Excel解析(2)读取和写入Excel文件_根据积分获取奖品
- 读取Excel文件
- 读取Excel文件
- 读取excel文件
- 读取Excel文件
- Java EE V7.0学习笔记:JPA
- android studio 怎么设置显示作者
- 【Jsoup】HTML解析器,轻松获取网页内容
- ubuntu ftp server-转
- hibernate错误
- Excel文件读取解析
- LeetCode ZigZag Conversion
- 为何使用java反射机制
- 视频在线教育:2015年在线教育盘点:收购、死亡、K12
- ORA-01465: invalid hex number 问题处理
- git常用命令
- 各开源框架使用与设计总结
- 安卓开发中非常炫的效果集合
- tableview滚动到指定位置