因項目所需,採用WORD模板作為報表系統的一部分,需要使用C#操作WORD文檔,大部分的操作都是填充表格,難度也不是很大。但是有一份報表很特殊,WORD裡面需要包含ComboBox、CheckBox控制項,如下所示:
這裡關鍵的技術難題是找到OLE控制項,然後設定其某個屬性值,GOOGLE了半天,終於找到如下的代碼:
private static object FindControl(string name, Word._Document document)
{
try
{
foreach (Word.InlineShape shape in document.InlineShapes)
{
if (shape.Type ==Word.WdInlineShapeType.wdInlineShapeOLEControlObject)
{
object oleControl = shape.OLEFormat.Object;
Type oleControlType = oleControl.GetType();
string oleControlName = (string)oleControlType.InvokeMember("Name",
System.Reflection.BindingFlags.GetProperty,null, oleControl, null);
if (String.Compare(oleControlName, name, true,System.Globalization.CultureInfo.InvariantCulture) == 0)
{
return oleControl;
}
}
}
foreach (Word.Shape shape in document.Shapes)
{
if (shape.Type ==Microsoft.Office.Core.MsoShapeType.msoOLEControlObject)
{
object oleControl = shape.OLEFormat.Object;
Type oleControlType = oleControl.GetType();
string oleControlName = (string)oleControlType.InvokeMember("Name",
System.Reflection.BindingFlags.GetProperty,null, oleControl, null);
if (String.Compare(oleControlName, name, true,System.Globalization.CultureInfo.InvariantCulture) == 0)
{
return oleControl;
}
}
}
}
catch
{
// Returns null if the control is not found.
}
return null;
}
找到OLE控制項後,經過嘗試,發現設定其屬性時,應該如下調用:
oleControlType.InvokeMember("Value", System.Reflection.BindingFlags.SetProperty, null, oleControl, new object[] { "True" });