unity读写本地excel_2024.4.22

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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM垃圾收集器--分代收集器

垃圾收集器主要分为两大类&#xff1a;分区收集器和分代收集器。分代收集器的代表是CMS&#xff0c;分区收集器的代表是G1和和ZGC。 分代收集器 CMS CMS收集器是第一个关注GC停顿时间&#xff08;stw时间)的收集器&#xff0c;采用“标记-清除”算法&#xff0c;之前的垃圾收…

《动手学深度学习(Pytorch版)》Task01:初识深度学习——4.22打卡

深度学习介绍 AI地图 自然语言处理&#xff1a;起源于符号学&#xff0c;如机器翻译&#xff0c;人在几秒钟能反应过来&#xff0c;属于感知问题计算机视觉&#xff1a;图片由像素组成&#xff0c;难以用符号学解释&#xff0c;在图片中进行推理&#xff0c;大部分用概率模型或…

Nginx+Lua+OpenResty(详解及使用)

一、 Nginx简介 Nginx是一个高性能的Web服务器和反向代理的软件。 Web服务器&#xff1a;就是运行我们web服务的容器&#xff0c;提供web功能&#xff0c;还有tomcat也提供类似的功能。 代理是软件架构和网络设计中&#xff0c;非常重要的一个概念。 二、Nginx的反向代理&…

Scrapy爬虫框架入门(豆瓣电影Top 250)

文章目录 Scrapy 官网Scrapy 文档GithubScrapy 简介项目结构爬虫实现XPath 教程创建 Scrapy 项目配置用户代理网页 dom 元素 IP 代理池IP代理池作用配置IP代理池申请IP代理池 Scrapy 官网 https://scrapy.org/ Scrapy 文档 https://docs.scrapy.org/en/latest/ Github htt…

Opencv_2_ 图像色彩空间转换

ColorInvert.h 内容如下&#xff1a; #pragma once #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void colorSpaceInvert(Mat&image); }; ColorInvert.cpp…

构建云原生湖仓:Apache Iceberg与Amoro的结合实践

随着大数据技术的快速发展&#xff0c;企业对数据的处理和分析需求日益增长。传统的数据仓库已逐渐无法满足现代业务对数据多样性和实时性的要求&#xff0c;这促使了数据湖和数据仓库的融合&#xff0c;即湖仓一体架构的诞生。在云原生技术的推动下&#xff0c;构建云原生湖仓…

数据库服务类--Redis--未授权访问终端Getshell

免责声明:本文仅做技术交流与学习. 目录 前提条件: windows上开启redis服务: Linux上创建&开启redis服务: 操作: 1-连接靶机redis 2-写入webshell 3-访问后门 redis--->webshell Redis未授权访问漏洞复现与利用 - 知乎 (zhihu.com) 前提条件: 端口开放(6379) 目录…

[LeetCode]—— 226——翻转二叉树

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a…

标题Selenium IDE 常见错误笔记

Selenium IDE 常见错误笔记 错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反…

modelsim波形高度异常,值为X

一、问题 波形高度异常&#xff0c;忽高忽低&#xff0c;正常波形高电平和低电平是统一高度的 timescale 1ns/1nsmodule key_test_tb();//parameter define parameter CLK_PERIOD 20; parameter CNT_MAX 25d25; //仅用于仿真,对应 500nsreg sys_clk; //周期 20ns reg d; wir…

Spark 中的分桶分化

Spark 中的分桶分化 Bucketing是 Spark 和 Hive 中用于优化任务性能的一种技术。在分桶桶&#xff08;集群列&#xff09;中确定数据分区并防止数据混洗。根据一个或多个分桶列的值&#xff0c;将数据分配给预定义数量的桶。 分桶有两个主要好处&#xff1a; 改进的查询性能&…

【存储】cosbench对象存储测试工具

目录 简略说明 原理 用法 详细说明 简介 用法 一 安装 二 简单验证 三 编写配置文件 四 提交配置文件下IO 五 测试结果查看 结果概览 查看详情 每秒钟的io情况查看 工作负载配置 参数配置&#xff08;controller和driver&#xff09; 查看错误的方法和错误记录 查看错误的方法 …

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

123.Mit6.S081-实验1-Xv6 and Unix utilities

今天我们来进行Mit6.S081实验一的内容。 实验任务 一、启动xv6(难度&#xff1a;Easy) 获取实验室的xv6源代码并切换到util分支。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git checkout util Branch util …

xshell的基本命令

1. 创建虚拟环境: conda create -n 虚拟环境名称 python3.7 2. 激活进入虚拟环境 conda activate 虚拟环境名称 3. 退出虚拟环境 conda deactivate 4. 查看所有虚拟环境 conda env list 5. 卸载环境 conda remove -n 虚拟环境名称 --all 6. 执行py文件: python3.py文…

微软刚开源就删库的WizardLM-2:MT-Bench 榜单评测超越GPT-4,7B追平Qwen1.5-32B

前言 微软最近发布的WizardLM-2大型语言模型因其先进的技术规格和短暂的开源后突然撤回&#xff0c;引起了科技界的广泛关注。WizardLM-2包括三个不同规模的模型&#xff0c;分别是8x22B、70B和7B&#xff0c;均展现了在多语言处理、复杂对话、推理和代理任务上的卓越能力。 H…

如何用PHP语言实现远程语音播报

如何用PHP语言实现远程语音播报呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现语音播报。通过发送文本信息&#xff0c;来实现远程语音播报、语音提醒、语音警报等。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1…

IDEA代码重构

重构 重构的目的&#xff1a; 提高代码的可读性、可维护性、可扩展性和性能。 重命名元素 重命名类 当我们进行重命名操作的时候可以看到第六行存在一个R(rename)&#xff0c;点击后就会弹出所偶有引用&#xff0c;这样可以避免我们在修改后存在遗漏引用处未修改。 我们可以通过…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统…

YoloV9改进策略:下采样改进|自研下采样模块(独家改进)|疯狂涨点|附结构图

文章目录 摘要自研下采样模块及其变种第一种改进方法 YoloV9官方测试结果改进方法测试结果总结 摘要 本文介绍我自研的下采样模块。本次改进的下采样模块是一种通用的改进方法&#xff0c;你可以用分类任务的主干网络中&#xff0c;也可以用在分割和超分的任务中。已经有粉丝用…