Exemple #1
0
        /// <summary>
        /// Iterated through spreadsheet and imports items to Global navigation list.
        /// </summary>
        /// <returns></returns>
        private static ImportResult ImportSubmissionItemsFromSpreadSheet(FileInfo file, ClientContext ctx)
        {
            _logs = new List <LogItem>();
            using (var package = new ExcelPackage(file))
            {
                if (!file.Name.EndsWith(".xlsx"))
                {
                    return(ImportResult.IncorrectFileFormat);
                }

                var ws = package.Workbook.Worksheets[1];
                if (ws == null)
                {
                    return(ImportResult.IncorrectFileFormat);
                }

                if (!IsSpreadsheetValid(ws))
                {
                    return(ImportResult.IncorrectFileFormat);
                }

                var dt = GetDataTableFromSpreadsheet(file);
                if (dt == null || dt.Rows.Count == 0)
                {
                    return(ImportResult.None);
                }
                Log($"Start Time: {DateTime.Now}");
                _logs.Add(new LogItem(LogCategory.RowCount, dt.Rows.Count));

                TaxonomySession taxonomySession = TaxonomySession.GetTaxonomySession(ctx);
                ctx.Load(taxonomySession, ts => ts.TermStores);
                ctx.ExecuteQuery();
                var termStore = taxonomySession.GetDefaultSiteCollectionTermStore();

                /*ctx.Load(termStore,
                *            store => store.Groups.Include(group => group.TermSets));
                *  ctx.ExecuteQuery();
                *
                *  ctx.Load(termStore.Groups);
                *  ctx.ExecuteQuery();*/

                TermGroup termGroup = termStore.GetSiteCollectionGroup(ctx.Site, false);
                ctx.Load(termGroup);
                ctx.Load(termGroup.TermSets);
                ctx.ExecuteQuery();
                foreach (var termSet in termGroup.TermSets)
                {
                    var allTerms = termSet.GetAllTerms();
                    ctx.Load(allTerms);
                    ctx.ExecuteQuery();
                    termsetDictionary.Add(termSet.Name, allTerms);
                }
                var lists = WorksheetToListMap.GroupBy(x => x.ListName);
                foreach (var list in lists)
                {
                    var listName = list.Key;
                    if (string.IsNullOrEmpty(listName))
                    {
                        continue;
                    }

                    var columnNames = WorksheetToListMap.Where(x => x.ListName == listName).Select(x => x.ListColumnName);
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (i <= 1)
                        {
                            continue;
                        }

                        var row = dt.Rows[i];
                        try
                        {
                            ImportRow(ctx, termGroup, listName, row, columnNames.ToArray(), i, ref _logs);
                        }
                        catch (Exception ex)
                        {
                            //if (Debugger.IsAttached) Debugger.Break();
                            _logs.Add(new LogItem(LogCategory.Exceptions, ex.Message));
                        }
                    }
                }
            }
            _logs.Add(new LogItem(LogCategory.DoneMessage, "Done"));
            WriteToLog(_logs);
            Log($"End Time: {DateTime.Now}");
            return(ImportResult.None);
        }
Exemple #2
0
        private static void ImportRow(ClientContext ctx, TermGroup termGroup, string listName, DataRow row, string[] columnNames, int rowIndex, ref List <LogItem> logs)
        {
            var web = ctx.Web;

            ctx.Load(web);
            ctx.ExecuteQuery();

            ctx.Load(web.Lists);
            ctx.ExecuteQuery();
            var list = web.Lists.FirstOrDefault(r => Regex.IsMatch(r.Title, listName, RegexOptions.IgnoreCase | RegexOptions.Compiled));

            ctx.Load(list);

            var fields = list.Fields;

            ctx.Load(fields);
            ctx.ExecuteQuery();

            var data = new List <DataFieldItem>();

            foreach (var name in columnNames)
            {
                if (WorksheetToListMap.FirstOrDefault(x => x.ListName == listName && x.ListColumnName == name).Ignore)
                {
                    continue;
                }

                var field          = fields.FirstOrDefault(x => x.InternalName == name);
                var mappedProperty = WorksheetToListMap.FirstOrDefault(x => x.ListName == listName && x.ListColumnName == name);
                var value          = row[mappedProperty.ColumnCode].ToString().Trim();
                if (string.IsNullOrEmpty(value))
                {
                    continue;
                }

                switch (field.TypeAsString)
                {
                case "TaxonomyFieldTypeMulti":
                {
                    // log if term isnt found
                    var excelTerms = value.Split(new char[] { ',', ';' });
                    var f          = field as TaxonomyField;
                    var terms      = new List <string>();

                    for (int i = 0; i < excelTerms.Length; i++)
                    {
                        if (string.IsNullOrEmpty(excelTerms[i]))
                        {
                            continue;
                        }
                        Term term = null;
                        try
                        {
                            term = GetTermByLabel(termGroup, excelTerms[i], mappedProperty.TermSetName);
                        }
                        catch
                        {
                            if (!logs.Exists(x => x.Category == LogCategory.MissingTerm && x.LogValue.ToString() == excelTerms[i].ToString()))
                            {
                                logs.Add(new LogItem(LogCategory.MissingTerm, value, name, rowIndex));
                            }
                        }

                        /*
                         * if (term == null)
                         * {
                         *  if (!logs.Exists(x => x.Category == LogCategory.MissingTerm && x.LogValue.ToString() == value.ToString()))
                         *      logs.Add(new LogItem(LogCategory.MissingTerm, value, name, rowIndex));
                         *  continue;
                         * }
                         */
                        if (term != null)
                        {
                            terms.Add($"-1;#{excelTerms[i]}|{term.Id}");
                        }
                    }
                    var termString = string.Join(";#", terms.ToArray());
                    if (!string.IsNullOrEmpty(termString))
                    {
                        var o = new DataFieldItem {
                            Name       = name,
                            SPField    = field,
                            FieldValue = termString
                        };
                        data.Add(o);
                    }
                }
                break;

                case "TaxonomyFieldType":
                {
                    // log if term isnt found
                    var f = field as TaxonomyField;
                    //var term = GetTermByLabel(ctx, value, mappedProperty.TermGroup, mappedProperty.TermSetName);
                    var term = GetTermByLabel(termGroup, value, mappedProperty.TermSetName);

                    if (term == null)
                    {
                        if (!logs.Exists(x => x.Category == LogCategory.MissingTerm && x.LogValue.ToString() == value.ToString()))
                        {
                            logs.Add(new LogItem(LogCategory.MissingTerm, value, name, rowIndex));
                        }
                        break;
                    }
                    TaxonomyFieldValue taxValue = new TaxonomyFieldValue();
                    taxValue.TermGuid = term.Id.ToString();
                    taxValue.Label    = term.Name;
                    taxValue.WssId    = -1;

                    data.Add(new DataFieldItem
                        {
                            Name       = name,
                            SPField    = field,
                            FieldValue = term
                        });
                }
                break;

                case "User":
                    var user = ctx.Web.SiteUsers.GetByEmail(value);
                    ctx.Load(user);
                    try { ctx.ExecuteQuery(); }
                    catch
                    {
                        if (!logs.Exists(x => x.Category == LogCategory.UserNotFound && x.LogValue.ToString() == value.ToString()))
                        {
                            logs.Add(new LogItem(LogCategory.UserNotFound, value, name, rowIndex));
                        }
                        continue;
                    }

                    var userValue = new FieldUserValue();
                    userValue.LookupId = user.Id;
                    data.Add(new DataFieldItem
                    {
                        Name       = name,
                        SPField    = field,
                        FieldValue = userValue
                    });
                    break;

                case "DateTime":
                    DateTime d;
                    if (DateTime.TryParse(value, out d))
                    {
                        data.Add(new DataFieldItem
                        {
                            Name       = name,
                            SPField    = field,
                            FieldValue = d.ToShortDateString()
                        });
                    }
                    else
                    {
                        continue;
                    }
                    break;

                case "Boolean":
                    data.Add(new DataFieldItem
                    {
                        Name       = name,
                        SPField    = field,
                        FieldValue = (value == "Yes" ? true : false)
                    });
                    break;

                default:
                    data.Add(new DataFieldItem
                    {
                        Name       = name,
                        SPField    = field,
                        FieldValue = value
                    });
                    break;
                }
            }

            var itemCreateInfo = new ListItemCreationInformation();
            var newItem        = list.AddItem(itemCreateInfo);

            foreach (var d in data)
            {
                var field = d.SPField;
                switch (field.TypeAsString)
                {
                case "TaxonomyFieldTypeMulti":
                {
                    var f = field as TaxonomyField;
                    f.SetFieldValueByValueCollection(newItem, new TaxonomyFieldValueCollection(ctx, d.FieldValue.ToString(), f));
                }
                break;

                case "TaxonomyFieldType":
                {
                    var f = field as TaxonomyField;
                    f.SetFieldValueByValue(newItem, d.FieldValue as TaxonomyFieldValue);
                }
                break;

                case "User":
                    newItem[field.InternalName] = d.FieldValue;
                    break;

                case "DateTime":
                    newItem[field.InternalName] = d.FieldValue;
                    break;

                case "Boolean":
                    newItem[field.InternalName] = d.FieldValue;
                    break;

                default:
                    newItem[field.InternalName] = d.FieldValue;
                    break;
                }
            }
            newItem["CEN_ClinicalReviewPhase"] = "Complete";
            newItem["CEN_ProgressStatus"]      = "Final";

            newItem.Update();

            try { ctx.ExecuteQuery(); }
            catch (Exception ex)
            {
                //if (Debugger.IsAttached) Debugger.Break();
                logs.Add(new LogItem(LogCategory.Exceptions, newItem.Id, newItem["Title"].ToString(), rowIndex));
            }
        }