static void ImportTemplate(SPList list)
{
TaxonomySession taxonomySession = new TaxonomySession(list.ParentWeb.Site, updateCache: true);
// STEP 1: Load the TermSet objects for the SPField objects.
Dictionary <string, TermSetLookup> termSetsByInternalName = new Dictionary <string, TermSetLookup>(StringComparer.OrdinalIgnoreCase);
foreach (SPField field in list.Fields)
{
// Alternatively, the code could also support taxonomy fields that can take multiple values here.
if (field.TypeAsString != "TaxonomyFieldType")
{
continue;
}
TaxonomyField taxonomyField = field as TaxonomyField;
if (taxonomyField == null)
{
continue;
}
TermStore termStore = taxonomySession.TermStores[taxonomyField.SspId];
TermSet termSet = termStore.GetTermSet(taxonomyField.TermSetId);
termSetsByInternalName.Add(field.InternalName, new TermSetLookup(termSet));
}
// STEP 2: Load the Excel file.
Dictionary <string, ExcelRow> excelRowsByUrl = new Dictionary <string, ExcelRow>(StringComparer.OrdinalIgnoreCase);
// Parse the input file.
Log("Reading AutomatedTagging.csv...");
using (StreamReader streamReader = new StreamReader("AutomatedTagging.csv"))
{
if (!streamReader.ReadLine().Contains("Filename"))
{
throw new InvalidOperationException("Invalid file format; header is missing");
}
int lineNumber = 1;
for (; ;)
{
string line = streamReader.ReadLine();
++lineNumber;
if (line == null)
{
break;
}
string[] csvValues = ParseCsvLine(line);
if (csvValues == null)
{
throw new InvalidOperationException("[line " + lineNumber + "]: Syntax error");
}
if (csvValues.Length < 1)
{
continue;
}
ExcelRow excelRow = new ExcelRow(csvValues[0], lineNumber);
for (int i = 2; i + 1 < csvValues.Length;)
{
string key = csvValues[i++].Trim();
if (key == "")
{
break;
}
string value = csvValues[i++].Trim();
if (value == "")
{
break;
}
SPField field = list.Fields.GetFieldByInternalName(key);
TermSetLookup termSetLookup = termSetsByInternalName[key];
Guid termId = termSetLookup.GetTermId(value);
excelRow.Pairs.Add(new KeyValuePair <string, Guid>(field.InternalName, termId));
}
excelRowsByUrl.Add(excelRow.ListItemUrl, excelRow);
}
}
// STEP 3: Update the list items.
ContentIterator contentIterator = new ContentIterator();
contentIterator.ProcessListItems(list,
delegate(SPListItem listItem)
{
ExcelRow excelRow;
if (!excelRowsByUrl.TryGetValue(listItem.Url, out excelRow))
{
return;
}
excelRow.Processed = true;
bool updated = false;
foreach (KeyValuePair <string, Guid> pair in excelRow.Pairs)
{
TaxonomyField taxonomyField = (TaxonomyField)listItem.Fields.GetFieldByInternalName(pair.Key);
TaxonomyFieldValue taxonomyFieldValue = new TaxonomyFieldValue(taxonomyField);
taxonomyFieldValue.TermGuid = pair.Value.ToString();
TaxonomyFieldValue oldValue = listItem[taxonomyField.Id] as TaxonomyFieldValue;
if (oldValue == null || oldValue.TermGuid != taxonomyFieldValue.TermGuid)
{
taxonomyField.SetFieldValue(listItem, taxonomyFieldValue);
updated = true;
}
}
if (updated)
{
Log("Updating item: " + listItem.Url);
listItem.Update();
}
},
delegate(SPListItem listItem, Exception e)
{
Log("Error processing item " + listItem.Url
+ ": " + e.Message);
return(true);
}
);
// Were any items missed?
Log("");
List <ExcelRow> missedRows = excelRowsByUrl.Values.Where(row => !row.Processed).ToList();
if (missedRows.Count > 0)
{
Log("Failed to match these rows");
foreach (ExcelRow row in missedRows)
{
Log(" " + row.ListItemUrl);
}
}
}