public List<CodeFile> ApplyFixToCodeAnalysisDocument(string filePath, List<Type> types, string productName = "Core")
        {
            DataSet ds = new DataSet();
            ds.ReadFromExcel(filePath);
            List<ClassMetaData> classMeta = new List<ClassMetaData>();
            List<ClassMetaData> aseemblyData = new List<ClassMetaData>();
            List<PropertyMetaData> propMeta = new List<PropertyMetaData>();

            if (types != null && types.Any())
                aseemblyData = ProcessAssembly(types);

            if (ds.Tables[0].Rows.Count > 0 && ds.Tables[1].Rows.Count > 0)
            {
                foreach (DataRow rs in ds.Tables[0].Rows)
                {
                    if (!string.IsNullOrEmpty(rs["Name"].ToString()))
                        classMeta.Add(new ClassMetaData()
                        {
                            Name = rs["Name"].ToString(),
                            Guid = rs["Guid"].ToString(),
                            TableDataDescription = rs["TableDataDescription"].ToString(),
                            TableDataName = rs["TableDataName"].ToString()
                        });
                }

                foreach (DataRow rs in ds.Tables[1].Rows)
                {
                    if (!string.IsNullOrEmpty(rs["ClassName"].ToString()))
                        propMeta.Add(new PropertyMetaData()
                        {
                            Name = rs["Name"].ToString(),
                            Guid = rs["Guid"].ToString(),
                            Description = rs["Description"].ToString(),
                            ClassName = rs["ClassName"].ToString(),
                            Type = rs["Type"].ToString(),
                            IsDataMember = rs["IsDataMember"].ToString().Equals("1") ? true : false,
                            PrimaryOrCompositeKey = rs["PrimaryOrCompositeKey"].ToString().Equals("1") ? true : false,
                            Required = rs["Required"].ToString().Equals("1") ? true : false
                        });
                }
            }
            var files = new List<CodeFile>();
            var svcObj = new ServiceObject(productName, CodeFileType.ServiceObject);

            classMeta.ForEach(c =>
            {
                c.PropertyMetaData = propMeta.FindAll(p => p.ClassName == c.Name);
                var aC = aseemblyData.Find(ax => ax.Name == c.Name);
                List<PropertyMetaData> exceptMeta = null;
                if (aC != null)
                {
                    exceptMeta = (from c1 in aC.PropertyMetaData
                                  join c2 in c.PropertyMetaData on c1.Name equals c2.Name into gt
                                  from sub in gt.DefaultIfEmpty()
                                  where sub == null
                                  select c1).ToList();
                    if (exceptMeta.Count > 0)
                    {
                        c.PropertyMetaData.AddRange(exceptMeta);
                    }
                }
                var schema = new InformationSchema();
                schema.Target = schema.TargetName = c.Name;
                schema.TableDataDescription = c.TableDataDescription;
                schema.TableDataName = c.TableDataName;
                schema.TargetGuid = c.Guid;
                schema.MetaData = c.PropertyMetaData.Select(p => p.GetMetaData()).ToList();
                files.Add(svcObj.Build(schema));
            });
            string path = @"C:\temp\";
            files.ForEach(f =>
            {
                //if (f.Type == CodeFileType.RepositoryObject || f.Type == CodeFileType.ServiceObject || f.Type == CodeFileType.IManager)
                f.Content = f.Content.Replace("$PRODUCTNAME$", productName).FormatWhiteSpaces();
                //else
                //    f.Content = f.Content.Replace("$PRODUCTNAME$", productName);

                Utils.Util.Write2File(path, f.Content, f.Name);
            });
            Process.Start(new ProcessStartInfo(path));
            return files;
        }