本人微信公衆號:微軟動態CRM專家羅勇 ,回覆281或者20181116可方便獲取本文,同時能夠在第一間獲得我發佈的最新博文信息,follow me!個人網站是 www.luoyong.me 。微信
有時候我想將系統中的實體信息導出來,如果多語言,一個實體會有多個顯示名稱,有時候對應起來不方便,我便寫了個程序導出來,實例是導出簡體中文和英文的顯示名稱,架構名稱,XrmtoolsBox也能夠導出,不過導出時候是實體的邏輯名稱,架構名稱有時候更有用,架構名稱轉成邏輯名稱方便,全小寫就好了。很少說了,上代碼,主要參考官方的 RetrieveAllEntitiesRequest Class 官方實例更加詳細,導出的是XML文件,我這裏轉成Excel,你們用這個更多點。架構
1 using Microsoft.Crm.Sdk.Messages; 2 using Microsoft.Xrm.Sdk; 3 using Microsoft.Xrm.Sdk.Client; 4 using Microsoft.Xrm.Sdk.Messages; 5 using Microsoft.Xrm.Sdk.Metadata; 6 using Microsoft.Xrm.Sdk.Query; 7 using System; 8 using System.Configuration; 9 using System.Linq; 10 using System.ServiceModel.Description; 11 using Excel = Microsoft.Office.Interop.Excel; 12 13 namespace ExportEntityMetadata 14 { 15 class Program 16 { 17 static void Main(string[] args) 18 { 19 IServiceManagement<IOrganizationService> orgServiceMgr = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(ConfigurationManager.AppSettings["orgUrl"])); 20 AuthenticationCredentials orgAuCredentials = new AuthenticationCredentials(); 21 orgAuCredentials.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["userName"]; 22 orgAuCredentials.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["passWord"]; 23 using (OrganizationServiceProxy orgSvc = GetProxy<IOrganizationService, OrganizationServiceProxy>(orgServiceMgr, orgAuCredentials)) 24 { 25 WhoAmIRequest whoReq = new WhoAmIRequest(); 26 WhoAmIResponse whoRep = orgSvc.Execute(whoReq) as WhoAmIResponse; 27 var userEntity = orgSvc.Retrieve("systemuser", whoRep.UserId, new ColumnSet("fullname")); 28 Console.WriteLine(string.Format("登陸組織{0}成功,歡迎{1},繼續操做請輸入y!", ConfigurationManager.AppSettings["orgUrl"], userEntity.GetAttributeValue<string>("fullname"))); 29 var input = Console.ReadLine().ToString().ToUpper(); 30 if (input == "Y") 31 { 32 Console.WriteLine(string.Format("程序開始處理 - {0}", DateTime.Now.ToString())); 33 RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest() 34 { 35 EntityFilters = EntityFilters.Entity, 36 RetrieveAsIfPublished = true 37 }; 38 RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)orgSvc.Execute(request); 39 var excelApp = new Excel.Application(); 40 excelApp.Visible = false; 41 Excel.Workbook metadataWorkbook = excelApp.Workbooks.Add(); 42 Excel.Worksheet rolesWorksheet = (Excel.Worksheet)excelApp.ActiveSheet; 43 rolesWorksheet.Name = "實體信息"; 44 int row = 1; 45 rolesWorksheet.Cells[1, 1] = "實體架構名稱"; 46 rolesWorksheet.Cells[1, 2] = "全部者類型"; 47 rolesWorksheet.Cells[1, 3] = "是否活動實體"; 48 rolesWorksheet.Cells[1, 4] = "實體顯示名稱(中文)"; 49 rolesWorksheet.Cells[1, 5] = "實體顯示名稱(英文)"; 50 rolesWorksheet.Cells[1, 6] = "實體說明"; 51 rolesWorksheet.Rows[1].Font.Bold = true;//字體加粗 52 row++; 53 54 foreach (EntityMetadata currentEntity in response.EntityMetadata) 55 { 56 rolesWorksheet.Cells[row, 1] = currentEntity.SchemaName; 57 rolesWorksheet.Cells[row, 2] = currentEntity.OwnershipType.Value.ToString(); 58 rolesWorksheet.Cells[row, 3] = currentEntity.IsActivity.Value.ToString(); 59 rolesWorksheet.Cells[row, 4] = currentEntity.DisplayName.LocalizedLabels.Where(a => a.LanguageCode == 2052).Count() >= 1 ? currentEntity.DisplayName.LocalizedLabels.Where(a => a.LanguageCode == 2052).FirstOrDefault().Label : string.Empty; 60 rolesWorksheet.Cells[row, 5] = currentEntity.DisplayName.LocalizedLabels.Where(a => a.LanguageCode == 1033).Count() >= 1 ? currentEntity.DisplayName.LocalizedLabels.Where(a => a.LanguageCode == 1033).FirstOrDefault().Label : string.Empty; 61 rolesWorksheet.Cells[row, 6] = currentEntity.Description.LocalizedLabels.Where(a => a.LanguageCode == 2052).Count() >= 1 ? currentEntity.Description.LocalizedLabels.Where(a => a.LanguageCode == 2052).FirstOrDefault().Label : string.Empty; ; 62 row++; 63 Console.WriteLine(string.Format("第{0}行處理完畢 - {1}", row - 1, DateTime.Now.ToString())); 64 } 65 rolesWorksheet.Columns[1].AutoFit();//自動列寬 66 rolesWorksheet.Columns[2].AutoFit();//自動列寬 67 rolesWorksheet.Columns[3].AutoFit();//自動列寬 68 rolesWorksheet.Columns[4].AutoFit();//自動列寬 69 rolesWorksheet.Columns[5].AutoFit();//自動列寬 70 rolesWorksheet.Columns[6].AutoFit();//自動列寬 71 metadataWorkbook.SaveAs(Filename: @"D:\CRMMetadata.xlsx", FileFormat: Excel.XlFileFormat.xlWorkbookDefault); 72 metadataWorkbook.Close(); 73 excelApp.Quit(); 74 } 75 } 76 Console.Write("程序執行完畢!"); 77 Console.ReadKey(); 78 } 79 80 private static TProxy GetProxy<TService, TProxy>( 81 IServiceManagement<TService> serviceManagement, 82 AuthenticationCredentials authCredentials) 83 where TService : class 84 where TProxy : ServiceProxy<TService> 85 { 86 Type classType = typeof(TProxy); 87 88 if (serviceManagement.AuthenticationType != 89 AuthenticationProviderType.ActiveDirectory) 90 { 91 AuthenticationCredentials tokenCredentials = 92 serviceManagement.Authenticate(authCredentials); 93 return (TProxy)classType 94 .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(SecurityTokenResponse) }) 95 .Invoke(new object[] { serviceManagement, tokenCredentials.SecurityTokenResponse }); 96 } 97 return (TProxy)classType 98 .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(ClientCredentials) }) 99 .Invoke(new object[] { serviceManagement, authCredentials.ClientCredentials }); 100 } 101 } 102 }