我正在使用Microsoft.Office.Interop.Excel来读取工作表单元格的值,但是我无法找到显示如何阅读下拉列表,复选框和选项按钮的信息。
谢谢!
答案 0 :(得分:2)
显然直接访问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 :(得分:1)
经过大量的讨论之后,我得到了以下工作仅用于下拉。我也有一个类似但不完全相同的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中执行此操作 - 但如果我能弄清楚如何操作,请更好。我可以找到附加到单元格的DataValidation,解析它指向的工作表和单元格,从SharedStringTable获取它们的SharedString值 - 但无论我做什么,我都无法写回任何数据。 FEH。
Exel :从地狱的心里,我刺伤了你。
答案 2 :(得分:0)
string selectedText = myDropDown.get_List(myDropDown.ListIndex);