unity中读写二进制文件

摘要:
在这感慨下[自从用了unity之后,代码架构能力越来越差。unity的一切对象都是component,要恶补coding]。今天记录下用NPOI将excel写入二进制。unity中读取二进制内容。//ReadExcel=˃WriteData......//////读取excel生出.gd二进制文件//////Excel文件路径///publicboolWriteToFile{if{Directory.CreateDirectory;}try{using{IWorkbookwk=newHSSFWorkbook;for{  ISheetsheet=wk.GetSheetAt;using{using{//Console.WriteLine;//Console.WriteLine;if{GameEvtMgr.Debug;//可删除已生成的.gd文件continue;}GameEvtMgr.Debug;bw.Write;//写入当前sheet中rows.length默认sheet.LastRowNum+1-4;for{IRowrow=sheet.GetRow;//第一行:字段行客户端取值对照//第二行:字段描述行skip//第三行:数据类型行[byteshortintstringboolean...long]//第四行:中文描述skipIRowrows=sheet.GetRow;//取excel中第三行类型value,写入值时参考if(rows!=null){BWriteByType;//以类型rows做类型写入参考}}}}}}}}}}catch{//Console.WriteLine;GameEvtMgr.Debug;returnfalse;}GameEvtMgr.Debug;returntrue;}publicvoidBWriteByType{switch{case"byte":writer.Write;break;case"short":writer.Write;break;case"int":writer.Write;break;case"string":writer.Write;break;case"bool":writer.Write(cell.NumericCellValue==1?

都半年没写博客了,自从上个项目开始,感觉时间好紧迫。在这感慨下[自从用了unity之后,代码架构能力越来越差。unity的一切对象都是component,要恶补coding]。

废话不说了。今天记录下用NPOI将excel写入二进制。unity中读取二进制内容。 go......

NPOI 不用多介绍了,一年前用过一次做打印,都是不深入的使用。

首先是规定好策划配置表

前四行为策划/程序对应表,四行之后为可用数据。

//ReadExcel => WriteData ......

/// <summary>
/// 读取excel生出.gd二进制文件
/// </summary>
/// <param name="path">Excel文件路径</param>
/// <returns></returns>
public bool WriteToFile(string path)
{
if (Directory.Exists(writeToPath) == false)
{
Directory.CreateDirectory(writeToPath);
}

try
{
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
IWorkbook wk = new HSSFWorkbook(fs);
for (int i = 0; i < wk.NumberOfSheets; i++)
{  
ISheet sheet = wk.GetSheetAt(i);
using (FileStream fsWrite = new FileStream(writeToPath + sheet.SheetName + ".gd", FileMode.Create, FileAccess.Write))
{
using (BinaryWriter bw = new BinaryWriter(fsWrite))
{
//Console.WriteLine(sheet.SheetName);
//Console.WriteLine(sheet.LastRowNum);
if (sheet.LastRowNum == 0)
{
GameEvtMgr.Debug(sheet.SheetName + "为空,请检查文档内容"); //可删除已生成的.gd文件
continue;
}
GameEvtMgr.Debug("表名称:" + sheet.SheetName + " 共计:" + (sheet.LastRowNum + 1 - initLength) + "行");
bw.Write(sheet.LastRowNum + 1 - initLength); //写入当前sheet中rows.length 默认sheet.LastRowNum + 1 -4(excel前四行);

for (int j = 0; j <= sheet.LastRowNum; j++)
{

IRow row = sheet.GetRow(j);
//第一行:字段行 客户端取值对照
//第二行:字段描述行 skip
//第三行:数据类型行 [byte short int string boolean ...long]
//第四行:中文描述 skip

IRow rows = sheet.GetRow(2); //取excel中第三行类型value,写入值时参考
if (rows != null)
{

}
if (j >= 4)
{
if (row != null)
{
for (int z = 0; z < row.LastCellNum; z++)
{
//Console.WriteLine(row.FirstCellNum + " " + row.LastCellNum);
ICell cell = row.GetCell(z);
if (cell != null)
{
BWriteByType(bw, rows.GetCell(z).StringCellValue, cell); //以类型rows做类型写入参考
}
}
}
}
}
}
}
}
}
}
catch (Exception ex)
{
//Console.WriteLine(ex.Message);
GameEvtMgr.Debug(ex.Message);
return false;
}
GameEvtMgr.Debug("End");
return true;
}

public void BWriteByType(BinaryWriter writer, string value, ICell cell)
{
switch (value)
{
case "byte":
writer.Write((byte)cell.NumericCellValue);
break;
case "short":
writer.Write((short)cell.NumericCellValue);
break;
case "int":
writer.Write((int)cell.NumericCellValue);
break;
case "string":
writer.Write(cell.ToString());
break;
case "bool":
writer.Write(cell.NumericCellValue == 1 ? true : false);
break;
case "long":
writer.Write((long)cell.NumericCellValue);
break;
default:
//throw new Exception("excel 类型错误");
GameEvtMgr.Debug("Excel类型有误");
break;
}
}

//读取数据 => 首先的写一个类,字段都对应表中每个字段名。方便客户端调用数据

private void ReadBattle02Data()
{
Battle02 bt = new Battle02();
using (FileStream fs = new FileStream(writeToPath + "Battle02.gd", FileMode.Open, FileAccess.Read))
{
using (BinaryReader br = new BinaryReader(fs))
{
int count = br.ReadInt32();
for (int i = 0; i < count; i++)
{
bt.ID = br.ReadInt32();
bt.Audio = br.ReadString();
bt.Prefab = br.ReadString();
bt.IsOpen = br.ReadBoolean();
Console.WriteLine(bt.ID + " " + bt.Audio + " " + bt.Prefab + " " + bt.IsOpen);
}
}
}
}

class Battle02
{
private int id;
private string audio;
private string prefab;
private bool isOpen;
public int ID
{
get { return id; }
set { id = value; }
}
public string Audio
{
get { return audio; }
set { audio = value; }
}
public string Prefab
{
get { return prefab; }
set { prefab = value; }
}
public bool IsOpen
{
get { return isOpen; }
set { isOpen = value; }
}
}

ok 读取都ok。客户端还需规划规划。下次再来补这个方式的注意事项以及优缺点。困的不行了^_^

免责声明:文章转载自《unity中读写二进制文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java实现快速排序VCSA6.7 升级6.7 U3下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity资源内存管理--webstream控制

一 使用前提 1,需要使用资源热更新 2,使用Assetbundle资源热更(AssetBundle是产生webstream的元凶) 二 为什么要用AssetBundle AssetBundle本质上就是一个压缩算法,只不过比起zip等一些压缩多了一些信息,比如平台信息(Ios,android),依赖信息等,既然是压缩,那就很好理解了,AssetBundl...

Java导出CSV文件

阅读原文 调用类 @Test public void testWrite() throws Exception { FileOutputStream fos = new FileOutputStream("E:/cjsworkspace/cjs-excel-demo/target/abc.csv"); OutputS...

JAVA-产生唯一32位GUID

import java.net.*; import java.util.*; import java.security.*; import org.apache.log4j.Logger; /** * 產生唯一GUID */ public class RandomGUID extends Object { public String val...

JQuery EasyUI datagrid 批量编辑和提交

前台主要代码: <script type="text/javascript"> $(function() { var $dg = $("#dg"); $dg.datagrid({ url : "servlet/list", width : 700,...

使用RemObjects Pascal Script (转)

http://www.cnblogs.com/MaxWoods/p/3304954.html 摘自RemObjects Wiki 本文提供RemObjects Pascal Script的整体概要并演示如何创建一些简单的脚本. Pascal Script包括两个不同部分: 编译器 (uPSCompiler.pas) 运行时 (uPSRuntime.pas...

微信开发——使用微信接口(获取地理位置)

生成微信签名(只要访问微信的接口,都需要生成签名验证来进行config) a. 获取AccessToken //定义静态常量存放获取AccessToken的URL public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?gra...