Как мне прочитать значения выпадающих или флажков Excel из c # или vb.net? - PullRequest
3 голосов
/ 14 сентября 2010

Я использую Microsoft.Office.Interop.Excel для чтения значений ячеек листа, но не могу найти информацию, которая показывает, как читать выпадающие списки, флажки и кнопки выбора.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 сентября 2010

Очевидно, что прямой доступ к коллекции DropDowns verboten . Обходной путь - получить доступ к свойству Validation ячейки, содержащей раскрывающийся список, получить его формулу и затем проанализировать местоположение списка.

Excel.Range dropDownCell = (Excel.Range)ws.get_Range("A1", "A1"); //cell containing dropdown
string formulaRange = dropDownCell.Validation.Formula1;
string[] splitFormulaRange = formulaRange.Substring(1,formulaRange.Length-1).Split(':');

Excel.Range valRange = (Excel.Range)ws.get_Range(splitFormulaRange[0], splitFormulaRange[1]);
for (int nRows = 1; nRows <= valRange.Rows.Count; nRows++) {
    for (int nCols = 1; nCols <= valRange.Columns.Count; nCols++) {
         Excel.Range aCell = (Excel.Range)valRange.Cells[nRows, nCols];
     System.Console.WriteLine(aCell.Value2);
    }
}
1 голос
/ 15 декабря 2011

После большого количества царапин на голове я получил следующее только для выпадающих списков .У меня также есть похожее, но не идентичное решение для 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 : Из сердца ада я нанослю удар тебе.

0 голосов
/ 15 сентября 2010
string selectedText = myDropDown.get_List(myDropDown.ListIndex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...