Unity用NPOI创建Exect表,保存数据,和修改删除数据。以及打包后的坑——无法打开新创建的Exect表

先说坑花了一下午才找到解决方法解决,

在Unity编辑模式下点击物体创建对应的表,获取物体名字与在InputText填写的注释数据。然后保存。创建Exect表可以打开,打包PC后,点击物体创建的表,打不开文件破损

解决方法:到unity编辑器所在路径中去找这个路径
\Editor\Data\MonoBleedingEdge\lib\mono\unityaot 或者 unityjit 文件夹或者unityaot-win32
找到里边以”I18N“开头的这四个dll文件

 

在这里感谢大佬:LAIALAIA

解决方法思路原版链接:unity 使用EPPlus对Excel的创建、写入、读取操作 - 哒哒哒~~~ - 博客园 (cnblogs.com)

创建读取删除Execel

 // 初始化 Excel 文件
 

 // 初始化 Excel 文件
        public void InitializeExcelFile(string ExcelFileName)
        {
        // 获取应用的数据文件夹路径
        string dataPath = Application.streamingAssetsPath + "/Data";
        // 合并路径,得到完整的 Excel 文件路径
        excelFilePath = Path.Combine(dataPath, ExcelFileName + ".xls");
        // 创建一个文件信息对象来检查 Excel 文件是否存在
        FileInfo excelFile = new FileInfo(excelFilePath);
        // 隐藏输入框
        inputField.gameObject.SetActive(false);
        // 如果 Excel 文件不存在,创建一个新的 Excel 工作簿,并添加一个工作表
        if (!excelFile.Exists)
        {
            // 创建一个新的 Excel 工作簿对象
            workbook = new XSSFWorkbook();
            // 在工作簿中创建一个名为 "Comments" 的工作表
            sheet = (XSSFSheet)workbook.CreateSheet(ExcelFileName);
            // 在工作表的第一行(行索引为0)上创建一个新的行对象,并在该行中创建一个新的单元格对象(列索引为0)
            // 然后将 "Object Name" 这个字符串设置为单元格的值
            sheet.CreateRow(0).CreateCell(0).SetCellValue("Object Name");
            // 获取工作表的第一行(行索引为0),然后在该行中创建一个新的单元格对象(列索引为1)
            // 然后将 "Comment" 这个字符串设置为单元格的值
            sheet.GetRow(0).CreateCell(1).SetCellValue("Comment");
        }
        else
        {
            using (FileStream fs = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
            {
                workbook = new XSSFWorkbook(fs);
                sheet = (XSSFSheet)workbook.GetSheetAt(0);
            }
        }
    }

删除

   private void DeleteObjectFromExcel()
    {
        if (workbook == null || lastClickedObject == null)
        {
            Debug.LogError("Excel workbook is not initialized or no object clicked.");
            return;
        }

        string objectName = lastClickedObject.name;

        int rowIndex = FindRowIndexByObjectName(objectName);
        if (rowIndex >= 0)
        {
            // 删除选定的行
            sheet.RemoveRow(sheet.GetRow(rowIndex));

            // 清空 InputField 的文本内容
            inputField.text = "";

            for (int i = rowIndex + 1; i <= sheet.LastRowNum; i++)
            {
                IRow currentRow = sheet.GetRow(i);

                // 跳过已删除的行
                if (currentRow == null)
                {
                    continue;
                }

                IRow newRow = sheet.CreateRow(i - 1); // 创建一个新行
                for (int j = 0; j < currentRow.LastCellNum; j++)
                {
                    ICell currentCell = currentRow.GetCell(j);
                    ICell newCell = newRow.CreateCell(j); // 创建一个新单元格
                    if (currentCell != null)
                    {
                        newCell.SetCellValue(currentCell.ToString());
                    }
                }
            }

            // 清除最后一行
            sheet.RemoveRow(sheet.GetRow(sheet.LastRowNum));


            // 保存修改后的文件
            using (FileStream fs = new FileStream(excelFilePath, FileMode.Create, FileAccess.Write))
            {
                workbook.Write(fs);
            }
        }
    }

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

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

相关文章

jeecgboot-vue3 查询区 label 文字居左实现

以系统管理中的系统角色界面为例 操作步骤 1. 通过路由或者工具找到当前代码所在的文件 src/views/system/role/index.vue 2. 找到 useListPage 调用&#xff0c;fromConfig 对象加入 labelWidth 和 rowProps 属性 formConfig: {labelWidth: 65, // 设置所有的label宽rowPr…

RISC-V在快速发展的处理器生态系统中找到立足点

原文&#xff1a;RISC-V Finds Its Foothold in a Rapidly Evolving Processor Ecosystem 作者&#xff1a;Agam Shah 转载自&#xff1a;https://thenewstack.io/risc-v-finds-its-foothold-in-a-rapidly-evolving-processor-ecosystem/ 以下是正文 But the open source pr…

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

ui设计师个人年终工作总结2020最新范文5篇

ui设计师个人年终工作总结(一) 我于20年x育人x日成为公司的试用员工&#xff0c;安排在技术研发中心担任UI界面设计一职&#xff0c;现将我的工作情况分为三个阶段来总结如下汇报&#xff1a; 一、萌芽阶段 记得初次应聘时&#xff0c;我对公司的认识仅仅局限于行业之一&#x…

【Android】解决Lint found fatal errors while assembling a release target

报错信息&#xff1a; Android在debug模式下打包没有问题&#xff0c;但是在打包release版本时出现一下问题&#xff1a; 结果图 原因 我项目的原因是因为把正式、测试地址放到代码里了&#xff0c;忘记选中正式环境的地址&#xff0c;导致打正式包有问题&#xff1b;大家如果…

PLA: 语言驱动的开放词汇3D场景理解

论文&#xff1a;https://arxiv.org/abs/2211.16312 GitHub - CVMI-Lab/PLA: (CVPR 2023) PLA: Language-Driven Open-Vocabulary 3D Scene Understanding代码&#xff1a;GitHub - CVMI-Lab/PLA: (CVPR 2023) PLA: Language-Driven Open-Vocabulary 3D Scene Understanding 摘…

component:()=>import(“@/views/Home.vue“) 报错,ts说没有找到类型声明文件

1 没有写.vue文件的类型声明&#xff0c;要在env.d.ts文件中写.vue的类型声明文件 2 ts.config.josn的incluede字段中&#xff0c;没有把.d.ts文件的路径写对。 如果没写对&#xff0c;就会在项目启动的时候&#xff0c;找不到.d.ts文件。找不到类型声明文件

什么是数据结构

目录 什么是数据结构 线性表 顺序表 链表 栈和队列 树存储结构 图存储结构 什么是数据结构 数据结构&#xff0c;直白地理解&#xff0c;就是研究数据的存储方式。 我们知道&#xff0c;数据存储只有一个目的&#xff0c;即为了方便后期对数据的再利用&#xff0c;就如…

Spark SQL优化:NOT IN子查询优化解决

背景 有如下的数据查询场景。 SELECT a,b,c,d,e,f FROM xxx.BBBB WHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} AND predict_type not IN ( SELECT distinct a FROM xxx.AAAAAWHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} ) 分析 通过查看SQL语句的执行计划基本…

gitlab合并新项目和分支切换

一、新建项目 1、创建空白项目 2、先创建一个群组 3、编写群组信息 4、创建群组完成以后新建项目 ​​​​​​​ 二、将代码推送到gitlab 1、初始化 git init 2、关联gitlab地址 # 比如:http://192.168.139.128:7070/cloud/obwt_cloud.git git remote add origin <你…

AIGC绘画:kaggle部署stable diffusion项目绘画

文章目录 kaggle介绍项目部署edit my copy链接显示 结果展示 kaggle介绍 Kaggle成立于2010年&#xff0c;是一个进行数据发掘和预测竞赛的在线平台。从公司的角度来讲&#xff0c;可以提供一些数据&#xff0c;进而提出一个实际需要解决的问题&#xff1b;从参赛者的角度来讲&…

【STM32】FreeRTOS互斥量学习

互斥量&#xff08;Mutex&#xff09; 互斥量又称互斥信号量&#xff08;本质也是一种信号量&#xff0c;不具备传递数据功能&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性…

Streamlit 讲解专栏(九):深入探索布局和容器

文章目录 1 前言2 st.sidebar - 在侧边栏增添交互元素2.1 将交互元素添加至侧边栏2.2 示例&#xff1a;在侧边栏添加选择框和单选按钮2.3 特殊元素的注意事项 3 st.columns - 并排布局多元素容器3.1 插入并排布局的容器3.2 嵌套限制 4 st.tabs - 以选项卡形式布局多元素容器4.1…

【IDEA报错:Cause: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在】

报错内容如下&#xff1a; 2023-08-17 11:17:16.274 ERROR [egrant-biz,e44d96001eb5f212,e44d96001eb5f212,true] 29700 --- [ XNIO-1 task-2] c.i.c.l.c.RestExceptionController : 服务器异常org.springframework.jdbc.BadSqlGrammarException: ### Error queryin…

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】

wpf iconfont 外部图标引入&#xff0c;无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式&#xff0c;注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"&#xe7ae;…

基于php动漫周边电商购物网站系统

动漫周边电商网站系统&#xff0c;是基于php毕业设计&#xff0c;mysql数据库进行开发&#xff0c;本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;用户查看商品分类&#xff0c;商品列表&#xff0c;查看动漫周边商品详情&#xff0c;加入购…

网络通信原理TCP的四次断开连接(第四十九课)

FIN:发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 序列号为X ACK :确认号 。 …

【脚踢数据结构】队列(顺序和链式)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

接口测试工具——Postman测试工具 Swagger接口测试+SpringBoot整合 JMeter高并发测试工具

目录 Postman测试工具接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参数3.添加取样器4.设置参数&#xff1a;协议&#xff0c;ip&#xff0c;端口…

【JUC】线程池ThreadPoolTaskExecutor与面试题解读

1、ThreadPoolTaskExecutor 创建线程池 从它的创建和使用说起&#xff0c;创建和使用的代码如下&#xff1a; 创建&#xff1a; ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize…
最新文章