zoukankan      html  css  js  c++  java
  • unity中读写二进制文件

    都半年没写博客了,自从上个项目开始,感觉时间好紧迫。在这感慨下[自从用了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。客户端还需规划规划。下次再来补这个方式的注意事项以及优缺点。困的不行了^_^

  • 相关阅读:
    sql 有条件计数
    easyui combox 手动添加项
    只有设置了 name 属性的表单元素才能在提交表单时传递它们的值
    除湿方法
    android 页面跳转,数据回传
    android studio 乱码
    android studio 工具
    gridlaylout 简单布局
    android 开发 简单的页面布局
    android sdk
  • 原文地址:https://www.cnblogs.com/sling/p/4364448.html
Copyright © 2011-2022 走看看