Unity 读Excel,读取xlsx文件解决方案
Unity读取表格数据
效果:

思路:
Unity可以解析Json,但是读取Excel需要插件的帮助,那就把这个功能分离开,读表插件就只管读表转Json,Unity就只管Json解析,中间需要一个存储空间,使用ScriptableObject数据类是个不错的选择。
缺点也很明显,我们只能在Unity编辑器模式下使用这个工具,也就是无法在打包后读取Excel,不过我们再也不用担心读表插件出问题了,因为打包后根本用不到读表插件。
实现步骤:
- 步骤一:Excel数据转换成Json数据
- 步骤二:将数据存储到ScriptableObject持久类中
- 步骤三:Unity读取ScriptableObject类
Excel数据转换成Json数据
因为只考虑在Unity编辑器模式使用,所以直接写一个编辑器窗口就行了

主要功能概述
- 用户界面(EditorWindow):提供一个界面让用户选择 Excel 文件,并进行相应的操作,如选择是否生成 C# 类文件、开始转换等。
- 文件处理:用户可以拖拽文件或文件夹到指定区域,程序会识别路径并加载 Excel 文件列表。
- 转换操作:Excel 文件被读取,转换为 JSON 数据,并保存到指定路径。
- 打开编辑窗口
[MenuItem("Tools/ExcelToJson")]
public static void ShowWindow()
{ExcelToUnityWindow window = GetWindow<ExcelToUnityWindow>("Excel 转 Json 工具");window.minSize = new Vector2(400 , 300);
}
这段代码创建了一个编辑器窗口,当用户点击 Unity 编辑器菜单中的 “Tools/ExcelToJson” 时,会弹出 ExcelToUnityWindow 窗口。
- 初始化并加载 JsonFileData
private void OnEnable()
{csOutputPath = Path.Combine(Application.dataPath , "Tool/ExcelTool/ConfigData");jsonFileCollector = Resources.Load<JsonFileData>("JsonFileCollector");if (jsonFileCollector == null)Debug.LogError("未找到 JsonFileCollector 实例,请确保已创建该资产文件!");RefreshFileList();
}
OnEnable 方法会在编辑器窗口启用时调用,它会加载 JsonFileCollector 实例,这个实例用于管理 JSON 数据。
- 文件夹路径选择与拖拽支持
private void HandleDragAndDrop(Rect dropArea)
{Event evt = Event.current;if (evt.type == EventType.DragUpdated || evt.type == EventType.DragPerform){if (dropArea.Contains(evt.mousePosition)){DragAndDrop.visualMode = DragAndDropVisualMode.Copy;if (evt.type == EventType.DragPerform){DragAndDrop.AcceptDrag();if (DragAndDrop.paths.Length > 0){string draggedPath = DragAndDrop.paths[0];if (File.Exists(draggedPath) && draggedPath.EndsWith(".xlsx")){folderPath = Path.GetDirectoryName(draggedPath);}else if (Directory.Exists(draggedPath)){folderPath = draggedPath;}RefreshFileList();}evt.Use();}}}
}
这个方法实现了拖拽功能,用户可以将文件或文件夹拖拽到指定区域,程序会检测并更新路径。
- 转换文件的核心操作
private void ConvertExcelFiles()
{foreach (string filePath in selectedExcelFiles){ParseFile(filePath , createCS , csOutputPath);}EditorUtility.DisplayDialog("完成" , "所有 Excel 文件已成功转换!" , "确定");
}
ConvertExcelFiles() 方法会遍历用户选择的 Excel 文件,并调用 ParseFile() 方法来处理每一个文件。这个方法的核心功能是将 Excel 文件转换为 JSON 格式。
- Excel 文件解析与 JSON 转换
private static string ParseFile(string path , bool createCS , string csOutputPath)
{if (!path.EndsWith("xlsx")) return null;string tableName = "";string cfgName = "";Excel excel = null;try{(Excel a, string b) temp = ExcelHelper.LoadExcel(path);excel = temp.a;cfgName = temp.b;StringBuilder sb = new StringBuilder();JsonWriter writer = new JsonWriter(sb);writer.WriteObjectStart();foreach (ExcelTable table in excel.Tables){tableName = table.TableName;if (tableName.StartsWith("#")) continue;if (createCS){try{Debug.Log($"生成 C# 类文件:{csOutputPath}");ExcelDeserializer deserializer = new ExcelDeserializer{FieldNameLine = 1,FieldTypeLine = 2,FieldValueLine = 3,IgnoreSymbol = "#",ModelPath = $"{Application.dataPath}/Tool/ExcelTool/Editor/Excel/ExcelToUnity/DataItem.txt"};deserializer.GenerateCS(table, cfgName, csOutputPath); // 生成 C# 文件}catch (System.Exception ex){Debug.LogError($"生成 C# 类文件时出错: {ex.Message}");return null;}}writer.WritePropertyName("Config");writer.WriteArrayStart();for (int i = 4; i <= table.NumberOfRows; i++){string idStr = table.GetValue(i, 1)?.ToString();if (string.IsNullOrEmpty(idStr)) break;writer.WriteObjectStart();for (int j = 1; j <= table.NumberOfColumns; j++){string propName = table.GetValue(1, j)?.ToString()?.Replace("*", "");string propType = table.GetValue(2, j)?.ToString();if (string.IsNullOrEmpty(propName) || propName.StartsWith("#")) continue;writer.WritePropertyName(propName);string value = table.GetValue(i, j)?.ToString();if (propType == "int"){writer.Write(int.TryParse(value, out int intValue) ? intValue : 0);}else if (propType == "bool"){writer.Write(value == "1" || value.ToLower() == "true");}else if (propType == "float"){writer.Write(float.TryParse(value, out float floatValue) ? floatValue : 0);}else{writer.Write(value);}}writer.WriteObjectEnd();}writer.WriteArrayEnd();}writer.WriteObjectEnd();string outputDir = Path.Combine(Application.streamingAssetsPath, "DataFiles");if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir);string outputPath = Path.Combine(outputDir, Path.GetFileNameWithoutExtension(path) + ".json");File.WriteAllText(outputPath, sb.ToString());Debug.Log("转换成功!路径:" + outputPath);return sb.ToString();}catch (System.Exception ex){Debug.LogError($"转换文件 {path} 时出错: {ex.Message}");return null;}
}
这是处理 Excel 转 JSON 的关键方法。主要流程如下:
- 加载 Excel 文件:使用 ExcelHelper.LoadExcel() 方法加载 Excel 文件。
- 遍历表格:对于每个表格,程序会遍历表格中的行和列,将数据转换成适当类型(int, bool, float, string)。
- 生成 JSON:利用 JsonWriter 将表格中的数据按格式写入 JSON 格式。
- 保存文件:生成的 JSON 数据被保存到 DataFiles 文件夹中。
将数据存储到ScriptableObject持久类中。
准备存储Json数据
[System.Serializable]public class JsonData{[HideInInspector]public string FileName;public string Parent;public string Title;public JsonData(string fileName , string parent , string title){FileName = fileName;Parent = parent;Title = title;}}[System.Serializable]public class ConfigData{public string configName;public int propertyCount;public string data;public ConfigData(string configName , int propertyCount){this.configName = configName;this.propertyCount = propertyCount;}}[Header("JSON 文件信息列表")][Tooltip("每个 JSON 文件的 Json数据")]public List<ConfigData> jsonDataList = new List<ConfigData>();[Tooltip("每个 JSON 文件的 Parent 和 Title 字段")]public List<JsonData> jsonPropertyList = new List<JsonData>();
首先遍历目标路径,查找所有 JSON 文件并解析其内容
public void RefreshJsonFileList()
{jsonDataList.Clear();jsonPropertyList.Clear(); // 清空列表if (!Directory.Exists(dataFilesPath)){Debug.LogError($"目标路径不存在: {dataFilesPath}");return;}string[] files = Directory.GetFiles(dataFilesPath, "*.json");if (files.Length == 0){Debug.LogWarning("未找到任何 JSON 文件.");}foreach (var file in files){string fileName = Path.GetFileNameWithoutExtension(file);int propertyCount = GetJsonFilePropertyCount(file);jsonDataList.Add(new ConfigData(fileName, propertyCount));ReadJsonFile(file, fileName);}Debug.Log($"找到 {jsonDataList.Count} 个 JSON 文件.");
}
- Directory.GetFiles 查找文件夹中的 .json 文件。
- GetJsonFilePropertyCount 获取每个文件中 Config 数组中第一个对象的属性数量。
- ReadJsonFile 解析 JSON 文件,提取 Parent 和 Title 信息。
读取 JSON 文件内容
public void ReadJsonFile(string file, string fileName)
{string jsonContent = File.ReadAllText(file);JObject jsonObject = null;try{jsonObject = JObject.Parse(jsonContent);}catch (System.Exception ex){Debug.LogError($"解析文件失败: {file}, 错误: {ex.Message}");return;}JArray configArray = jsonObject["Config"] as JArray;if (configArray != null){foreach (var configItem in configArray){string parent = configItem["Parent"]?.ToString();string title = configItem["Title"]?.ToString();if (!string.IsNullOrEmpty(parent) && !string.IsNullOrEmpty(title)){jsonPropertyList.Add(new JsonData(fileName, parent, title));}}}
}
- 使用 File.ReadAllText 读取文件内容。
- 通过 JObject.Parse 解析 JSON 字符串。
- 查找 Config 数组中的每个元素,提取 Parent 和 Title,并将其与文件名一起保存为 JsonData 对象。
获取 JSON 文件的属性数量,方便分类
int GetJsonFilePropertyCount(string file)
{string jsonContent = File.ReadAllText(file);JObject jsonObject = null;try{jsonObject = JObject.Parse(jsonContent);}catch (System.Exception ex){Debug.LogError($"解析文件失败: {file}, 错误: {ex.Message}");return 0;}JArray configArray = jsonObject["Config"] as JArray;if (configArray == null || configArray.Count == 0){Debug.LogWarning($"文件 {file} 中没有找到有效的 'Config' 数组。");return 0;}return configArray[0].Children<JProperty>().Count();
}
- 读取 JSON 文件并解析为 JObject。
- 获取 Config 数组的第一个元素,并统计其属性数量。
加载和保存 JSON 数据
- 加载 JSON 数据,GetJsonData() 和 LoadConfig() 方法批量加载 JSON 数据:
public void GetJsonData()
{
#if UNITY_EDITORcfgProgress = 0;string filepath = ConfigManager.GetStreamingAssetsPath();foreach (var item in jsonDataList){string configPath = $"DataFiles/{item.configName}.json";LoadConfig(item, configPath, filepath, jsonDataList.Count);}
#endif
}void LoadConfig(ConfigData configData, string configPath, string filepath, int Count, Action OnConfigLoaded = null)
{
#if UNITY_EDITORstring filePath = Path.Combine(filepath, configPath);try{if (File.Exists(filePath)){string fileContent = File.ReadAllText(filePath);configData.data = fileContent;cfgProgress++;if (cfgProgress == Count){OnConfigLoaded?.Invoke();}}else{Debug.LogError($"文件不存在: {filePath}");}}catch (Exception ex){Debug.LogError($"加载配置表时发生错误: {ex.Message}");}
#endif
}
- 保存实例
public void SaveInstance()
{
#if UNITY_EDITOREditorUtility.SetDirty(this); // 标记为已修改AssetDatabase.SaveAssets(); // 保存所有修改AssetDatabase.Refresh(); // 刷新数据库Debug.Log("JsonFileCollector 实例已保存.");
#endif
}
做一个编辑器面板用于手动读取保存数据
[CustomEditor(typeof(JsonFileData))]
public class JsonFileCollectorEditor : Editor
{public override void OnInspectorGUI(){JsonFileData collector = (JsonFileData)target;DrawDefaultInspector();if (GUILayout.Button("刷新文件列表", GUILayout.Height(30))){collector.RefreshJsonFileList();collector.GetJsonData();collector.SaveInstance();}GUILayout.Space(10);if (collector.jsonDataList.Count == 0){GUILayout.Label("未找到 JSON 文件.");}}
}
OK,大概这样子

Unity读取ScriptableObject类
解析 JSON 数据
加载完 JSON 文件后,你通常需要将字符串类型的 JSON 数据转换成实际的 C# 对象。这个过程通常依赖于第三方库(如 Newtonsoft.Json 或 LitJson)来解析。
可以通过 JsonMapper.ToObject 方法(来自 LitJson 库)将 JSON 字符串转换为指定类型的对象。
public List<T> GetConfigRoot<T>(){foreach (var item in jsonDataList){if (item.configName == typeof(T).Name){ConfigRoot<T> configRoot = JsonMapper.ToObject<ConfigRoot<T>>(item.data); // 解析 JSON 数据为对象return configRoot.Config;}}return null;}public List<T> GetConfigRoot<T>(string name){foreach (var item in jsonDataList){if (item.configName == name){ConfigRoot<T> configRoot = JsonMapper.ToObject<ConfigRoot<T>>(item.data);return configRoot.Config;}}return null;}
通过上述步骤,Unity 使用存储好的 JSON 数据的流程如下:
- 存储 JSON 数据:通过 ScriptableObject(如 JsonFileData)将 JSON 文件的数据存储在 ConfigData.data 字段中。
- 加载 JSON 数据:通过 GetJsonData() 和 LoadConfig() 方法从磁盘读取 JSON 文件内容,并存储到内存中。
- 解析 JSON 数据:使用第三方库(如 LitJson)将 JSON 字符串转换为 C# 对象,通常通过 JsonMapper.ToObject() 方法进行。
- 使用数据:将解析后的数据应用到游戏逻辑中,如配置角色、武器、敌人等游戏元素。
通过这种方式,你能够在 Unity 中灵活地管理和使用 JSON 配置数据。
如何使用
一般来说需要提供一个数据类,一个表的名称就可以拿到里面的数据
例如:
JsonFileData.GetConfigRoot<数据类>(文件名)
不过如果有多张表,相同的结构该怎么办?
我们可以使用之前存储好的表名来遍历里面的数据,使用属性数量来过滤出我们使用的数据
属性数量8:

属性数量6:

过滤出数据:
foreach (var item in JsonFileData.jsonDataList)
{if (item.propertyCount==6){foreach (var config in JsonFileData.GetConfigRoot<Config_Default>(item.configName)){Config_Default Default = config;string info = "";info += "ID:" + Default.ID;info += ",父节点:" + Default.Parent;info += ",标题:" + Default.Title;info += ",内容:" + Default.Content;info += ",图片路径:" + Default.SpritePath;info += ",视频路径:" + Default.VideoPath;Debug.Log(info);}}else{foreach (var config in ConfigHelper.GetConfigInfo<Config_Answer>(item.configName)){Config_Answer Default = config;string info = "";info += "ID:" + Default.ID;info += ",父节点:" + Default.Parent;info += ",标题:" + Default.Title;info += ",内容:" + Default.OptionA;info += "," + Default.OptionB;info += "," + Default.OptionC;info += "," + Default.OptionD;info += ",答案:" + Default.CorrectAnswer;Debug.Log(info);}}
}
使用属性数量过滤不是一个好的选择,各位可以各显神通,看看如何解决这个问题。
Demo下载链接👉 读表工具
相关文章:
Unity 读Excel,读取xlsx文件解决方案
Unity读取表格数据 效果: 思路: Unity可以解析Json,但是读取Excel需要插件的帮助,那就把这个功能分离开,读表插件就只管读表转Json,Unity就只管Json解析,中间需要一个存储空间,使用…...
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
全文链接:https://tecdat.cn/?p38667 摘要:在母婴暴露于空气污染对儿童健康影响的研究中,常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型(DLNM)是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...
【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(信息管理服务一体化平台)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、事预则立,规划沟通管理二、提升支持,管理沟通三、观察偏差,监督沟通论文 2022年2月,我公司承建某省退役军人信息管理服务一体化平台项目,由于本人具有较丰富的项目管理经验,同时也是一名退伍军人…...
物联网工厂可视化监控平台:为智能制造打造的可视化大屏
01行业背景 随着技术的不断进步,物联网(IoT)已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器,实现数据的实时收集、传输和分析,为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…...
3、redis的高可用
主从复制 主从复制:这是redis高可用的基础。哨兵模式和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从,从节点只能读不能写。read only。 不能做高可用的切换ÿ…...
数据结构--顺序表(详解)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…...
Day62 图论part11
Floyd 算法精讲 Floyd 算法代码很简单,但真正理解起原理 还是需要花点功夫,大家在看代码的时候,会发现 Floyd 的代码很简单,甚至看一眼就背下来了,但我为了讲清楚原理,本篇还是花了大篇幅来讲解。 代码随想…...
git clone 超时
git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...
WPF编程excel表格操作
WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用,操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…...
Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项
栈和队列理论基础 抽象认识 栈是先进后出(FIFO),队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框,取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...
【Devops】什么是Devops?(Development+Operations)和运维的区别?
DevOps(Development Operations)是一种将开发(Development)和运维(Operations)团队结合在一起的文化和实践,目的是通过自动化、协作和持续反馈来加快软件的开发、部署和运维的周期,…...
基于NodeMCU的物联网电灯控制系统设计
最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程:用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计(…...
Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
在嵌入式开发中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于与外设(如 EEPROM、传感器、显示屏等)进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器,它提供 2Kbit…...
Linux应用软件编程-多任务处理(线程)
线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...
VITUREMEIG | AR眼镜 算力增程
根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示,美国市场AR/VR总出货量增长10.3%。其中,成立于2021年的VITURE增长速度令人惊艳,同比暴涨452.6%,成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…...
Jenkins管理多版本python环境
场景:项目有用到python3.8和3.9,python环境直接安装在jenkins容器内。 1、进入jenkins容器 docker exec -it jenkins /bin/bash 2、安装前置编译环境 # 提前安装,以便接下来的配置操作 apt-get -y install gcc automake autoconf libtool ma…...
Flutter富文本实现学习
Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件,而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能,比如在富文本…...
如何解决 OpenAI API 连接问题:降级 urllib3 版本
如何解决 OpenAI API 连接问题:降级 urllib3 版本 在使用 OpenAI API 时,很多开发者可能会遇到连接问题,特别是在使用 Python 代码与 OpenAI 进行交互时。常见的错误包括 ProxyError、SSLError 和 MaxRetryError,它们通常表示在通…...
【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free
C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...
论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试
大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
