c# net core Excel 文件导出 iOS语言包
我一个iOS项目有多语言需求,然后甲方提供了8国的语言包Excel文件。一个文件几百行。后面还会停 的修改调整。于是就有了如下的脚本:
脚本大概分为五个步骤:
1 static void startRead() { 2 Console.WriteLine("请输入Excel文件路径:"); 3 var strUrlExcel = readLineMsg().TrimEnd(); 4 Console.WriteLine("请输入Excel语言包keyID的title值:"); 5 var strKeyId = readLineMsg(); 6 Console.WriteLine("请输入Excel语言包指定语言的title值:"); 7 var strKeyLanguage = readLineMsg(); 8 9 Console.WriteLine("请输入iOS语言包文件路径:"); 10 var strLocalizablePath = readLineMsg().TrimEnd(); 11 12 13 // 获取Excel 14 ISheet sheet = readExcel(strUrlExcel); 15 if (sheet == null) 16 { 17 Console.WriteLine("Excel 文件读取失败,请重试"); 18 return; 19 } 20 // 获取Sheet KeyValue语言包的数据 21 var list = readSheet(sheet, strKeyId, strKeyLanguage); 22 23 // 获取语言包文件 24 var strLanguageContent = readLanguageFile(strLocalizablePath); 25 26 // 设置语言包Value值 27 var content = setLanguageContent(strLanguageContent, list); 28 29 // 保存语言包文件 30 saveLanguageFile(strLocalizablePath, content); 31 // 已完成 32 Console.WriteLine("转换完成。 谢谢使用! \r\n按任意键继续使用:Enter Key"); 33 34 Console.ReadLine(); 35 // 重复以上步骤 36 startRead(); 37 }
![点击并拖拽以移动](https://img2022.cnblogs.com/blog/424517/202209/424517-20220917185008072-1603942457.gif)
一、获取Excel 文件的Sheet
static ISheet readExcel(string excelPath) { if (!File.Exists(excelPath)) { return null; } using (var stream = new FileStream(excelPath, FileMode.Open)) { stream.Position = 0; var pathExtension = Path.GetExtension(excelPath); if (pathExtension == ".xlsx") { XSSFWorkbook workbook = new XSSFWorkbook(stream); // .xlsx ISheet sheet = workbook.GetSheetAt(0); return sheet; } else if (pathExtension == ".xls") { HSSFWorkbook workbook = new HSSFWorkbook(stream); // .xls ISheet sheet = workbook.GetSheetAt(0); return sheet; } } return null; }
![点击并拖拽以移动](https://img2022.cnblogs.com/blog/424517/202209/424517-20220917185008072-1603942457.gif)
二、根据Sheet 获取当前的Rows Cells ,并获取值内容存储。
入参:
keyId 为Excel 的第一行的名称-(一般应用于iOS语言包的Key值的列的第一行)
value 为Excel 的准备转换语言的列的第一行。
如题Excel 格式如下,并想转换中文时,则keyId = keyId, value = 中文
iosKey 中文 英文 繁体 stringsName 姓名 Name 姓名 stringsDes 说明 Notes xxxx
static List<modelKeyValue> readSheet(ISheet sheet, string keyId, string value) { List<modelKeyValue> list = new List<modelKeyValue>(); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; var cellKeyIdIndex = headerRow.Cells.FindIndex(x => x.ToString() == keyId); var cellKeyValueIndex = headerRow.Cells.FindIndex(x => x.ToString() == value); if (cellKeyIdIndex < 0 || cellKeyValueIndex < 0) { Console.WriteLine("Excel keyId 或 语言Value 的title值错误,请重新开始转换流程"); return null; } // 开始获取每一行的数据 for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); if (row == null) continue; var strKey = row.Cells[cellKeyIdIndex].ToString(); if (cellKeyValueIndex > row.Cells.Count -1) { continue; } var strValue = row.Cells[cellKeyValueIndex].ToString(); if (string.IsNullOrWhiteSpace(strValue)) continue; modelKeyValue dict = new modelKeyValue { strKey = strKey, strValue = strValue }; list.Add(dict); } return list; }
![点击并拖拽以移动](https://img2022.cnblogs.com/blog/424517/202209/424517-20220917185008072-1603942457.gif)
三、根据路径读取iOS的语言包文件:后缀名.strings
/// <summary> /// 读取iOS语言包文件内容 /// </summary> /// <param name="strLanguagePath"></param> /// <returns></returns> static string readLanguageFile(string strLanguagePath) { if (!File.Exists(strLanguagePath)) { return ""; } //文本读取器 using (TextReader reader = new StreamReader(strLanguagePath, System.Text.Encoding.UTF8)) { var strLocalizableStr = ""; //一次性读完 strLocalizableStr = reader.ReadToEnd(); return strLocalizableStr; } }
![点击并拖拽以移动](https://img2022.cnblogs.com/blog/424517/202209/424517-20220917185008072-1603942457.gif)
四、修改键值对的语言包字符串。
/// <summary> /// 设置iOS语言包文件值 /// </summary> /// <param name="content"></param> /// <param name="list"></param> static string setLanguageContent(string content, List<modelKeyValue> list) { List<modelLanguageKeyValueStr> listModel = new List<modelLanguageKeyValueStr>(); var languageList = content.Split("\";"); foreach (var strLanguage in languageList) { var model = new modelLanguageKeyValueStr(); model.strLanguage = strLanguage; var keyValue = strLanguage.Split("="); if (keyValue.Length != 2) { // 如果有多个 = 等号存在 // 后面再写 continue; } model.strKey = keyValue[0].Trim(); model.strValue = keyValue[1].TrimStart(); listModel.Add(model); } foreach (var dict in list) { var model = listModel.Find(x =>{ return x.strKey == $"\"{dict.strKey}\""; }); /// 如果已存在Key ,则替换 if (model != null) { var oldStrValue = $"{model.strValue}"; var newStrValue = $"\"{dict.strValue}"; var newStrReplace = model.strLanguage.Replace(oldStrValue, newStrValue); content = content.Replace(model.strLanguage, newStrReplace); } else { /// 否则新增 content += $"\n\"{dict.strKey}\" = \"{dict.strValue}\";"; } } return content; }
![点击并拖拽以移动](https://img2022.cnblogs.com/blog/424517/202209/424517-20220917185008072-1603942457.gif)
五、保存修改后的语言包字符串 content 到指定的strings文件即可:
static void saveLanguageFile(string filePath, string content) { if (File.Exists(filePath)) { File.Delete(filePath); } //文本读取器 using (FileStream fs = new FileStream(filePath, FileMode.CreateNew)) { //【2】保存内容到txt StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); sw.WriteLine(content); sw.Flush(); sw.Close(); } }
![点击并拖拽以移动](https://img2022.cnblogs.com/blog/424517/202209/424517-20220917185008072-1603942457.gif)
项目整体也没多少代码,技术点倾向于 Excel 的Rows Cells 的处理 和 转换后的字符串的整体编辑问题。感兴趣的话可以私信我免费赠送源码。