public MergeResult MergeDoc(int ID, int UserID, MergeOption Options) { var projInfo = _DBContext.ProjectEntity.Find(ID); MergeResult result = null; if (projInfo.Phase == 1) { result = MergeDoc_KY(ID, UserID, Options); } else { result = MergeDoc_CS(ID, UserID, Options); } // 更新每个专业的状态为已经合并过 var specils = _DBContext.ProjectSpecialtyEntity.Where(s => s.ProjectID == ID); foreach (var s in specils) { s.IsMerge = false; _DBContext.Entry(s).State = System.Data.Entity.EntityState.Modified; } _DBContext.SaveChanges(); return(result); }
/// <summary> /// 区域检查 /// </summary> /// <param name="doc"></param> /// <param name="areaName"></param> public void CheckArea(Document doc, string areaName, string regAreas, MergeResult result) { result.ContainsArea = doc.Range.Text.Contains(areaName); Regex regex = new Regex(regAreas); var matchs = regex.Matches(doc.Range.Text); if (matchs.Count > 0) { result.OtherAreas = new Dictionary <string, int>(); foreach (Match m in matchs) { if (result.OtherAreas.ContainsKey(m.Value)) { result.OtherAreas[m.Value]++; } else { result.OtherAreas.Add(m.Value, 1); } } } }
/// <summary> /// 禁用内容检查 /// </summary> /// <param name="doc"></param> /// <param name="disableWord"></param> /// <param name="result"></param> public void CheckDisableContent(Document doc, string disableWord, MergeResult result) { if (string.IsNullOrEmpty(disableWord)) { return; } var disableWordRegStr = string.Format("({0})", disableWord.Replace(",", ")|(")); Regex regex = new Regex(disableWordRegStr); var matchs = regex.Matches(doc.Range.Text); if (matchs.Count > 0) { result.DisableWordMatchs = new List <string>(); foreach (Match m in matchs) { result.DisableWordMatchs.Add(m.Value); } } }
private MergeResult MergeDoc_CS(int ID, int UserID, MergeOption Options) { var result = new MergeResult() { IsSuccess = true, ParaIndexCheck = new List <string>() }; var projInfo = _DBContext.ProjectEntity.Find(ID); var areas = _IEnum.GetEnumInfo("System4", "region").Items; var areaName = areas.FirstOrDefault(a => a.Key == projInfo.Area.ToString()).Text; var otherAreaNames = areas.Where(a => a.Key != projInfo.Area.ToString()).Select(a => a.Text); var regAreas = string.Format("({0})", string.Join(")|(", otherAreaNames)); var ids = _DB.GetQuery(c => c.ProjectID == ID).Select(c => c.ID); var files = _IObjectAttachService.GetAttachFiles("ProjectCover", ID); var cover = files.Count() > 0 ? files.First() : null; files = _IObjectAttachService.GetAttachFiles("ProjectAttachLs", ID); var attachLs = files.Count() > 0 ? files.First() : null; files = _IObjectAttachService.GetAttachFiles("ProjectAttach", ID); var attach = files.Count() > 0 ? files.First() : null; var attachs = _IObjectAttachService.GetAttachFiles("MergeProjectDoc", ids.ToList()); if (attachs.Count == 0) { result.IsSuccess = false; result.ErrorMessage = "项目没有专业文档,无法合并"; return(result); } var allNode = new Dictionary <string, List <DocNode> >(); var _WordMergeService = new WordMergeService(Options); foreach (var a in attachs) { _WordMergeService.SetDocNode(new Document(a.Path), allNode); } // 创建新的空白文档 var doc = new Document(); _WordMergeService.SetDocStyle(doc); doc.RemoveAllChildren(); var section = _WordMergeService.CreateSection(doc); doc.Sections.Add(section); // 按照章节号对段落排序 var items = allNode.OrderBy(d => double.Parse(d.Key.Replace("_", ""))); int index1 = 1, index2 = 0, index3 = 0, index4 = 0; // 将排序好的节点插入新的文档中 foreach (var item in items) { foreach (var node in item.Value) { Node dstNode = doc.ImportNode(node.Node, true, ImportFormatMode.UseDestinationStyles); if (dstNode.NodeType == NodeType.Paragraph) { var para = dstNode as Paragraph; #region 章节序号检查、重设样式 if (para.ParagraphFormat.StyleIdentifier == StyleIdentifier.Heading1) { // 清除原先格式,重新设置样式 para.ParagraphFormat.ClearFormatting(); para.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1; if (item.Key.Contains("_")) { result.ParaIndexCheck.Add(string.Format("一级标题序号重复,标题:{0}", para.Range.Text)); } else if (int.Parse(item.Key) != index1) { result.ParaIndexCheck.Add(string.Format("一级标题序号错误,标题:{0}", para.Range.Text)); index1 = int.Parse(item.Key) + 1; } else { index1++; } index2 = index3 = index4 = 1; } else if (para.ParagraphFormat.StyleIdentifier == StyleIdentifier.Heading2) { // 清除原先格式,重新设置样式 para.ParagraphFormat.ClearFormatting(); para.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading2; var index = item.Key.Split('.')[1]; if (item.Key.Contains("_")) { result.ParaIndexCheck.Add(string.Format("二级标题序号重复,标题:{0}", para.Range.Text)); } else if (int.Parse(index) != index2) { result.ParaIndexCheck.Add(string.Format("二级标题序号错误,标题:{0}", para.Range.Text)); index2 = int.Parse(index) + 1; } else { index2++; } index3 = index4 = 1; } else { if (node.IsListNode) { para.ListFormat.ListLevel.StartAt = node.ListValue; para.ListLabel.Font.Bold = false; para.ListLabel.Font.Size = 14; } else { // 清除原先格式,重新设置样式 para.ParagraphFormat.ClearFormatting(); para.ParagraphFormat.StyleIdentifier = StyleIdentifier.Normal; var text = para.Range.Text.TrimStart(); var m3 = _WordMergeService.ParaReg3.Match(text); var m4 = _WordMergeService.ParaReg4.Match(text); if (m4.Success) { var index = m4.Value.Split('.')[3]; if (int.Parse(index) != index4) { result.ParaIndexCheck.Add(string.Format("四级标题序号错误,标题:{0}", para.Range.Text)); index4 = int.Parse(index) + 1; } else { index4++; } } else if (m3.Success) { var index = m3.Value.Split('.')[2]; if (int.Parse(index) != index3) { result.ParaIndexCheck.Add(string.Format("三级标题序号错误,标题:{0}", para.Range.Text)); index3 = int.Parse(index) + 1; } else { index3++; } index4 = 1; } } } #endregion _WordMergeService.SetChapter(item.Key.Replace("_", ""), para); _WordMergeService.SetParaStyle(para); } section.Body.AppendChild(dstNode); } } if (attach != null) { _WordMergeService.AppendAttachDoc(doc, new Document(attach.Path)); } // 地区检查 _WordMergeService.CheckArea(doc, areaName, regAreas, result); // 禁用内容检查 _WordMergeService.CheckDisableContent(doc, projInfo.DisableWord, result); _WordMergeService.SetTable(doc); _WordMergeService.SetImage(doc); _WordMergeService.SetPageNumber(doc); if (attachLs != null) { _WordMergeService.AppendDoc(doc, new Document(attachLs.Path)); } _WordMergeService.CreateList(doc); var filePath = getFilePath(); if (cover != null) { var docCover = new Document(cover.Path); docCover.AppendDocument(doc, ImportFormatMode.UseDestinationStyles); docCover.Save(filePath); } else { doc.Save(filePath); } FileStream fs = new FileStream(filePath, FileMode.Open); var md5Str = Md5.GetMd5Hash(fs); var newAttach = new SysAttachFileEntity() { Md5 = md5Str, Extension = ".docx", FileDate = DateTime.Now, Name = "合并文档.docx", Path = filePath, Size = fs.Length, Type = (int)EnumAttachType.World, UploadDate = DateTime.Now, UploadUser = UserID }; fs.Close(); _IFileService.Add(newAttach); _IObjectAttachService.Add(new ObjectAttachEntity() { AttachID = newAttach.ID, ObjectID = ID, ObjectKey = "MergeProjectDocResult" }); result.Attach = newAttach; return(result); }