/// <summary> /// 保存 /// </summary> /// <param name="theList"></param> /// <returns></returns> private static bool WriteExcel(I18NItems theList) { foreach (var lang in AppConfig.I18NLanguages) { var excelPath = string.Format("{0}/I18N/{1}.xlsx", AppConfig.SettingSourcePath, lang); var changedFile = false; ExcelFile excelFile; try { excelFile = new ExcelFile(excelPath); } catch (IOException e) { Debug.LogError("无法打开Excel,是否正在编辑: " + excelPath + " " + e.Message); return(false); } // 把表中的值缓存起来! 方便查询是否已经存在过了! var id2RowMap = new Dictionary <string, int>(); var excelRowCount = excelFile.GetRowsCount(); for (int row = 3; row < excelRowCount; row++) // 跳过前3行 { var key = excelFile.GetString("Id", row); id2RowMap[key] = row; } var rowCount = excelFile.GetRowsCount(); // 存在的不动,不存在的添加 HashSet <string> useList = new HashSet <string>(); // 用来缓存处理过的,后面把旧的标记出来方便后面删 foreach (var kv in theList.Items) { var newKey = kv.Key; var srcsList = kv.Value; // 来源,几个字符串来源 int existRow; if (!id2RowMap.TryGetValue(newKey, out existRow)) { existRow = rowCount++; excelFile.SetRow("Id", existRow, newKey); changedFile = true; } // 来源列, 覆盖上去 //var sourcesStr = excelFile.GetString("CommentSrcFile", existRow); //var existStrsList = CTool.Split<string>(sourcesStr, '|'); //var unionStrs = existStrsList.Union(srcsList); var srcStr = string.Join("|", srcsList.ToArray()); var srcStrInExcel = excelFile.GetString("CommentSrcFile", existRow); if (srcStr != srcStrInExcel) { excelFile.SetRow("CommentSrcFile", existRow, srcStr); changedFile = true; } // 已存在,不处理,添加到列表,后面检测没用的 useList.Add(newKey); } // useList 和 theList做差集,找出没用的! if (id2RowMap.Count > useList.Count) { var exceptList = id2RowMap.Keys.Except(useList); //var exceptList2 = useList.Except(id2RowMap.Keys); //var exCount = exceptList.Count(); foreach (var exceptStr in exceptList) { var exceptRow = id2RowMap[exceptStr]; Log.Info("多出来的: {0}, 旧的,所在行 {1}, 删除!", exceptStr, exceptRow); //excelFile.SetRowGrey(exceptRow); excelFile.ClearRow(exceptRow); changedFile = true; } } if (changedFile) // 有修改的才保存 { excelFile.Save(); } Log.Info("Write Excel: {0}", excelPath); } return(true); }