После большого количества царапин на голове я получил следующее только для выпадающих списков .У меня также есть похожее, но не идентичное решение для RadioButtons, но я не пробовал установить флажки.
Это не стало проще, если Interop возвратил System.Object, где можно ожидать массив (Отладчик VS говорит мне, что технически это System.Object[*]
- но что бы это ни было, я не могу разобрать его как массив), или массив ControlFormat.List[]
индексируется 1.ура!
Приведенный ниже код предполагает открытую книгу и имя целевого dropDown
Worksheet worksheet = (Worksheet)workbook.Worksheets[worksheetName];
var control = worksheet.Shapes.Item(dropdownName).ControlFormat;
var vl = GetDropdownList(control);
var targetIndex = IndexOfMatch(targetValue, vl);
control.Value = targetIndex;
// control.List returns a System.Object that may indeed be an array, but it's hard to parse in that format
// let's loop through it, explicitly casting as we go
private List<string> GetDropdownList(ControlFormat control)
{
var newList = new List<string>();
// haw! the Excel control-list is one-indexed! And the last item is equal to the count-index.
for (int i = 1; i <= control.ListCount; i++)
{
newList.Add((string)control.List[i]);
}
return newList;
}
private int IndexOfMatch(string targetValue, List<string> vals)
{
int indexMatch = vals.IndexOf(targetValue);
// the Excel target is 1-indexed, so increase by one
return ++indexMatch;
}
Я бы предпочел сделать это в OpenXmlSDK - но d ****Буду ли я понять, как это сделать.Я могу найти DataValidation, прикрепленный к ячейке, проанализировать рабочий лист и ячейки, на которые он указывает, получить их значения SharedString из SharedStringTable - но, что бы я ни делал, я не могу записать какие-либо данные обратно.Feh.
Exel : Из сердца ада я нанослю удар тебе.