Что вам нужно сделать, это сохранить файл Excel в CSV-файл (избегая подхода openXML, который сделает вещи более сложными, чем они). Тогда в C# можно использовать System.IO.File, чтобы прочитать файл и цикл по каждой строке
string[] _fileData = System.IO.File.ReadAllLines(_filePath);
_fileData будет многомерный массив, для строк и столбцов.
Заполнение поля поиска, вы можете использовать CSOM для достижения этого. Смотрите этот пример кода, я скопированный из: https://karinebosch.wordpress.com/2015/05/11/setting-the-value-of-a-lookup-field-using-csom/
CamlQuery camlQueryForItem = new CamlQuery();
camlQueryForItem.ViewXml = string.Format(@"<View>
<Query>
<Where>
<Eq>
<FieldRef Name='{0}'/>
<Value Type='{1}'>{2}</Value>
</Eq>
</Where>
</Query>
</View>", lookupFieldName, lookupFieldType, value);
listItemCollection listItems = list.GetItems(camlQueryForItem);
clientContext.Load(listItems, items => items.Include
(listItem => listItem["ID"],
listItem => listItem[lookupFieldName]));
clientContext.ExecuteQuery();
if (listItems != null)
{
ListItem item = listItems[0];
lookupValue = new FieldLookupValue();
lookupValue.LookupId = Int.Parse(item["ID"].ToString());
Таким образом, вы сначала получаете ListItem через запрос CAML, а затем установите значение через объект FieldLookupValue
Удачи!