unity读写本地excel_2024.4.22

news2024/11/15 5:08:44

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OfficeOpenXml;
using System.IO;
using Excel;
using System.Data;
using System;
/// <summary>
/// https://blog.csdn.net/Xz616/article/details/128893023
/// Unity3D操作数据之Excel表操作(创建、读取、写入、修改)
/// 北斗课题 VR 设备统计功能开发——每次程序打开关闭记录对应时间到本地电子表格
/// 列:打开年,月,日,时间,关闭年,月,日,时间
/// </summary>
public class ExcelOperation : MonoBehaviour
{
    // [SerializeField]
    string strExcelSavePath = "";
    [SerializeField]
    string strFilename = "北斗VR设备统计.xlsx";
    // Start is called before the first frame update
    void Start()
    {
        //strExcelSavePath = Application.streamingAssetsPath;

    }
    /// <summary>
    /// 增
    /// Application.dataPath   :           E:/UnityProject_V2020.3.47f3c1/BDProject/Assets
    /// Application.streamingAssetsPath    :/UnityProject_V2020.3.47f3c1/BDProject/Assets/StreamingAssets
    /// </summary>
    public void CreatExcel()
    {
        //文件地址
        FileInfo newFile = new FileInfo(strExcelSavePath + "/test.xlsx");
        //如果文件存在删除重建
        if (newFile.Exists)
        {
            newFile.Delete();
            newFile = new FileInfo(strExcelSavePath + "/test.xlsx");
        }

        //数据操作//如果只想创建文件不写入表头,数据操作步骤可以省略
        using (ExcelPackage package = new ExcelPackage(newFile))
        {
            //初次创建增加数据操作(重点在于这条操作语句不同)
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("test");

            //添加对应列名
            worksheet.Cells[1, 1].Value = "列名1";
            worksheet.Cells[1, 2].Value = "列名2";
            worksheet.Cells[1, 3].Value = "列名3";

            //保存
            package.Save();
            print("创建成功");
        }
    }
    /// <summary>
    /// 存
    /// </summary>
    public void WriteExcel()
    {
        //文件地址
        FileInfo newFile = new FileInfo(strExcelSavePath + "/test.xlsx");
        //数据操作
        using (ExcelPackage package = new ExcelPackage(newFile))
        {
            //增加数据操作(重点在于这条操作语句与初次创建添加数据不同)
            ExcelWorksheet worksheet = package.Workbook.Worksheets["test"];

            //添加第二行数据
            worksheet.Cells[2, 1].Value = "名称1";
            worksheet.Cells[2, 2].Value = "价格1";
            worksheet.Cells[2, 3].Value = "销量1";

            //添加第三行数据
            worksheet.Cells[3, 1].Value = "名称2";
            worksheet.Cells[3, 2].Value = "价格2";
            worksheet.Cells[4, 3].Value = "销量2";

            //保存
            package.Save();
            print("写入数据成功");
        }
    }
    /// <summary>
    /// 已知已有行数,添加一行新数据,供外部调用
    /// dt为开始时间
    /// </summary>
    public void AddStartTimeToExcel()
    {
        if (!isSaveExcel)
        { //文件地址
            FileInfo newFile = new FileInfo(strExcelSavePath + "/" + strFilename);
            //数据操作
            using (ExcelPackage package = new ExcelPackage(newFile))
            {
                //增加数据操作(重点在于这条操作语句与初次创建添加数据不同)
                ExcelWorksheet worksheet = package.Workbook.Worksheets["设备统计"];

                //添加第curRows(原行数当现索引用)行数据  Cells[x,y]//x,y都是从1开始数的
                curRows++;
                worksheet.Cells[curRows, 1].Value = (curRows - 1).ToString();
                worksheet.Cells[curRows, 2].Value = DateTime.Now.Year;
                worksheet.Cells[curRows, 3].Value = DateTime.Now.Month;
                worksheet.Cells[curRows, 4].Value = DateTime.Now.Day;
                worksheet.Cells[curRows, 5].Value = DateTime.Now.ToString("HH:mm:ss");

                //保存
                package.Save();
                isSaveExcel = true;
                print("写入开始时间到excel");
            }
        }
    }
    /// <summary>
    /// 给系统一登录新增的那一行数据的最后一列新增内容——存储结束时间
    /// </summary>
    public void AddEndTimeToExcel()
    {
        if (isSaveExcel)
        { //文件地址
            FileInfo newFile = new FileInfo(strExcelSavePath + "/" + strFilename);
            //数据操作
            using (ExcelPackage package = new ExcelPackage(newFile))
            {
                //增加数据操作(重点在于这条操作语句与初次创建添加数据不同)
                ExcelWorksheet worksheet = package.Workbook.Worksheets["设备统计"];

                //添加第curRows(原行数当现索引用)行数据  Cells[x,y]//x,y都是从1开始数的
                // curRows = curRows++;
                // worksheet.Cells[curRows, 1].Value = (curRows - 1).ToString();
                worksheet.Cells[curRows, 6].Value = DateTime.Now.Year;
                worksheet.Cells[curRows, 7].Value = DateTime.Now.Month;
                worksheet.Cells[curRows, 8].Value = DateTime.Now.Day;
                worksheet.Cells[curRows, 9].Value = DateTime.Now.ToString("HH:mm:ss");

                //保存
                package.Save();
                isSaveExcel = false;
                print("写入结束时间到excel");
            }
        }
    }
    /*/// <summary>
    /// 删改 from csdn
    /// </summary>
    public void ChangeExcel()
    {
        //文件地址
        FileInfo newFile = new FileInfo(strExcelSavePath + "/test.xlsx");

        //数据操作
        using (ExcelPackage package = new ExcelPackage(newFile))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets["test"];

            //追加
            worksheet.Cells[4, 1].Value = "名称3";
            worksheet.Cells[4, 2].Value = "价格3";
            worksheet.Cells[4, 3].Value = "销量3";

            //删除某一列(参数:列的序号)
            worksheet.DeleteColumn(1);
            //删除某一行(参数:行的序号)
            worksheet.DeleteRow(1);

            //修改(和添加一样)
            worksheet.Cells[4, 1].Value = "修改名称";
            worksheet.Cells[4, 2].Value = "修改价格";
            worksheet.Cells[4, 3].Value = "修改销量";


            //保存
            package.Save();

            print("删改数据成功");
        }
    }*/
    /// <summary>
    /// 第一次存开始时间的时候不变此值,存结束时间的时候变
    /// </summary>
    bool isSaveExcel = false;
    /// <summary>
    /// 系统刚打开查询表格看看表格中总行数,也就是即将添加的行的索引
    /// </summary>
    int curRows = 0;
    /// <summary>
    /// 系统刚打开查询表格看看表格中总行数,也就是即将添加的行的索引
    /// </summary>
    int curColumns = 0;
    /* /// <summary>
     /// 查 from csdn
     /// </summary>
     public void ReadExecel()
     {
         //加载文件
         FileStream fileStream = File.Open(strExcelSavePath + "/test.xlsx", FileMode.Open, FileAccess.Read);
         IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
         DataSet result = excelDataReader.AsDataSet();

         // 获取表格有多少列
         int columns = result.Tables[0].Columns.Count;
         // 获取表格有多少行 
         int rows = curRows = result.Tables[0].Rows.Count;
         Debug.Log("共有:" + columns + "列 " + rows + "行");

         //第一行为表头,不读取。没有表头从0开始(获取数据)
         for (int i = 0; i < rows; i++)
         {
             for (int j = 0; j < columns; j++)
             {
                 // 获取表格中指定行指定列的数据 
                 string value = result.Tables[0].Rows[i][j].ToString();
                 Debug.Log(value);
             }
         }
         fileStream.Close();

         print("查询数据成功");
     }*/
    /// <summary>
    /// 读取本地excel,为了填充变量 curRows,获取当前行数
    /// </summary>
    /// <param name="fileName">含文件后缀:北斗VR设备统计.xlsx</param>
    public void ReadExecel()
    {
        //加载文件
        FileStream fileStream = File.Open(strExcelSavePath + "/" + strFilename, FileMode.Open, FileAccess.Read);
        IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
        DataSet result = excelDataReader.AsDataSet();

        // 获取表格有多少列
        int columns = curColumns = result.Tables[0].Columns.Count;
        // 获取表格有多少行 
        int rows = curRows = result.Tables[0].Rows.Count;
        Debug.Log("共有:" + columns + "列 " + rows + "行");

        /* //第一行为表头,不读取。没有表头从0开始(获取数据)
         for (int i = 0; i < rows; i++)
         {
             for (int j = 0; j < columns; j++)
             {
                 // 获取表格中指定行指定列的数据 
                 string value = result.Tables[0].Rows[i][j].ToString();
                 Debug.Log(value);
             }
         }*/
        fileStream.Close();
        //print("查询数据成功,行数:" + curRows);
    }
    // Update is called once per frame
    void Update()
    {
        /*if (Input.GetKeyUp(KeyCode.U))
        {
            print(Application.streamingAssetsPath);

            CreatExcel();
        }
        if (Input.GetKeyUp(KeyCode.I))
        {
            WriteExcel();
        }*/
        /*if (Input.GetKeyUp(KeyCode.O))
        {
            ReadExecel();
            AddStartTimeToExcel();
        }
        if (Input.GetKeyUp(KeyCode.P))
        {
            AddEndTimeToExcel();
        }*/
    }
    /// <summary>
    /// DontDestroyOnLoad(GameObject);
    //让此物体在场景销毁的时候不进行销毁,但是有几点需要注意
    //再次返回到此物体所在场景的时候,这个脚本所在的物体也会进行初始化,执行Awake(),Start()方法,所以要设计成单例的:
    //注意看注释
    /// </summary>

    private static ExcelOperation _instance;   // 单例
    public ExcelOperation GameManagerInstance
    {
        get { return _instance; }
    }
    void Awake()
    {
        if (_instance != null)
        {
            //这里一定要是销毁this.gameObject
            Destroy(this.gameObject);
            return;
        }
        //这句话只执行一次,第二次上面return了
        _instance = this;
        strExcelSavePath = Application.streamingAssetsPath;
        ReadExecel();
        AddStartTimeToExcel();
        DontDestroyOnLoad(gameObject);
    }

    private void OnApplicationQuit()
    {
        AddEndTimeToExcel();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1616144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【入门篇】本章包括创建云项目、数据库的使用、云存储管理、云函数的基本使用、实战举例(小程序之云函数开发入门到使用发布上线实操)

云函数 云函数相当于服务器接口的概念,它并属于小程序端代码。它是以函数的形式运行后端代码来响应事件以及调用其他服务。运行环境是Node.js。 一、基创建云函数项目 打开微信开发者工具: 打开微信开发者工具,并登录你的微信开发者账号。 创建项目: 如果还没有创建项目,你…

给字符串添加加粗标签(AC自动机+Python)

可以暴力解决&#xff0c;但是为了锻炼一下ac自动机的编程&#xff0c;我们使用ac自动机。 ac自动机主要维护两个列表&#xff0c;一个列表ch&#xff0c;ch[f][idx]表示从父节点f向idx这个方向走&#xff0c;走到的节点。另一个列表nex&#xff0c;nex[i]表示节点i回跳边的节…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

BFS解决FloodFill算法:(Leetcode:200. 岛屿数量)

题目链接&#xff1a;200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 本题由于没有给出开始搜索的位置&#xff0c;所以每一个位置都要进行一次广度优先搜索 另外为了不修改原数组数据&#xff0c;需要设置一个bool类型的二维数组vis来判断某个位置是否被搜索过 cl…

负载均衡的原理及算法

一、定义 负载均衡&#xff08;Load Balancing&#xff09;是一种计算机网络和服务器管理技术&#xff0c;旨在分配网络流量、请求或工作负载到多个服务器或资源&#xff0c;以确保这些服务器能够高效、均匀地处理负载&#xff0c;并且能够提供更高的性能、可用性和可扩展性。…

【链表】Leetcode 两两交换链表中的结点

题目讲解 24. 两两交换链表中的节点 算法讲解 只需要模拟这个过程就行了&#xff0c;但是需要注意空指针的问题&#xff0c;特别是nnext指针 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), ne…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

IntelliJ IDEA - Lombok supports: OpenJDK javac, ECJ

问题描述 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ 解决方案 在 IDEA 设置中 File -> Settings 中找到配置如下&#xff1…

医学影像增强:空间域方法与频域方法等

医学影像图像增强是一项关键技术,旨在改善图像质量,以便更好地进行疾病诊断和评估。增强方法通常分为两大类:空间域方法和频域方法。 一、 空间域方法 空间域方法涉及直接对医学影像的像素值进行操作,以提高图像的视觉质量。以下是一些常用的空间域方法: 对比度调整:通过…

【Web】2022DASCTF MAY 出题人挑战赛 题解(全)

目录 Power Cookie 魔法浏览器 getme hackme fxxkgo ezcms Power Cookie 点击login in by guest后响应头给set了一个admin0的cookie 魔法浏览器 看到魔法UA 直接在console输出即可 改UA&#xff0c;拿到flag getme 右键查看源码 抓包看到响应头&#xff0c;Apache版本…

文旅IP孵化打造抖音宣传推广运营策划方案

【干货资料持续更新&#xff0c;以防走丢】 文旅IP孵化打造抖音宣传推广运营策划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 文旅IP抖音运营方案 1. 项目背景与目标 - 背景&#xff1a…

uniapp IOS上架AppStore因打开相机、相册提示不明确被拒

被拒原因&#xff1a; 提示说红框标识的权限说明不够明确&#xff0c;否则用户不知道问什么要访问这个权限。 解决方案&#xff1a; 只需要我们再次打包ios的时候在manifest.json文件里&#xff0c;所用到权限的地方重新填写一下使用说明&#xff0c;再次打包提交审核即可。

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接&#xff1a; Download the latest package 第二步操作方式&#xff1a;打开包并按照说明操作即可安装 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew in…

【Spring进阶系列丨最终篇】一文详解Spring中的事务控制

0、说明 本篇文章是【Spring进阶系列】专栏的最后一篇文章&#xff0c;至此&#xff0c;我们对Spring的学习就告一段落&#xff0c;接下来我会持续更新【SpringSpringMVCMyBatis整合】专栏&#xff0c;欢迎免费订阅&#xff01; 文章目录 0、说明 一、Spring事务控制1、事务的环…

集创赛Robei杯——Robei八角板7020简介

官方介绍 若贝八角板是一款FPGA开发板&#xff0c;可以用于系统设计与教育教学、竞赛、IC验证、系统控制、挖矿、云计算等用途&#xff0c;板子整体呈现正八角形&#xff0c;尺寸非常小&#xff0c;68x68mm&#xff0c;手掌心大小。虽然板子很小&#xff0c;但是功能齐全&#…

数据结构(邓俊辉)学习笔记——向量vector_01_接口与实现

文章目录 0.意图1、概述2 从数组到向量3 向量ADT接口4 Vector 模板类5 构造与析构5.1默认构造方法5.2基于复制的构造方法5.3 析构方法 0.意图 一方面是将工作学习中零星的知识点串起来&#xff0c;另一方面向量是其他数据类型的基础&#xff0c;比如栈队列等&#xff0c;所以基…

五种服务异步通信(MQ)-详解、代码案例

简介&#xff1a;本篇文章主要是介绍了常用的异步通信原理&#xff0c;主要是RabbitMQ技术 目录 1、初始MQ&#xff08;异步通讯&#xff09; 1.1 同步通讯 1.2 异步通讯 1.3 MQ常见框架 2、RabbitMQ快速入门 2.1 RabbitMQ概述和安装 2.2 常见消息模型 2.3 快速入门 3、…

【华为 ICT HCIA eNSP 习题汇总】——题目集18

1、SSH默认工作使用的TCP端口号是&#xff08;&#xff09;。 A、20 B、21 C、22 D、23 考点&#xff1a;①传输层 ②应用层 解析&#xff1a;&#xff08;C&#xff09; SSH为建立在应用层和传输层上的安全协议&#xff0c;是对TCP/IP协议的传输层以上的SSH会话流程进行加密的…

数字时代的社交王者:探索Facebook的社交帝国

引言&#xff1a;社交媒体的霸主 在数字化浪潮席卷全球的当下&#xff0c;社交媒体已然成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook则是这个领域的不二之选。作为全球最大的社交网络&#xff0c;Facebook不仅拥有庞大的用户群体&#xff0c;更在技术创新、社会…

System Dashboard for Mac:强大的系统监控与管理工具

System Dashboard for Mac是一款专为苹果电脑设计的系统监控与管理工具&#xff0c;以其直观易用的界面和全面的功能&#xff0c;深受用户喜爱。 System Dashboard for Mac v1.10.11激活版下载 这款软件能够实时监测系统的重要参数&#xff0c;包括CPU使用率、内存利用率、硬盘…