/// <summary>
 /// Attempts to write an object to a range of cells defined by the various output-related state values
 /// of this ProjectInvocationRule.
 /// </summary>
 /// <remarks>
 /// If the object is enumerable, its enumerated values are written.
 /// </remarks>
 /// <exception cref="System.InvalidOperationException">The UsesOutput property value is false.</exception>
 public void WriteOutputData(object data)
 {
     if (!UsesOutput) {
         throw new InvalidOperationException();
     }
     var v = new CellRangeValidator(OutputCellRange, m_nrProvider);
     Excel.Worksheet ws = GetSheetByKey(m_outputSheetKey);
     Excel.Range r = v.GetRange(ws);
     IEnumerable e = data as IEnumerable;
     if (e == null || e is string) {
         ws.Cells[r.Row, r.Column] = data;
     }
     else {
         Helper.SetRangeValues(e.Cast<object>(), r, OutputRangeOrder);
     }
 }
 /// <summary>
 /// Returns a value indicating whether this ProjectInvocationRule is in a valid state.
 /// </summary>
 private bool DetermineValidity()
 {
     if (UsesInput) {
         Excel.Worksheet ws = GetSheetByKey(m_inputSheetKey);
         if (ws == null) {
             return false;
         }
         var v = new CellRangeValidator(InputCellRange, m_nrProvider);
         if (!v.IsValid) {
             return false;
         }
     }
     if (UsesOutput) {
         Excel.Worksheet ws = GetSheetByKey(m_outputSheetKey);
         if (ws == null) {
             return false;
         }
         var v = new CellRangeValidator(OutputCellRange, m_nrProvider);
         if (!v.IsValid) {
             return false;
         }
     }
     if (!PathIsValid(ProjectPath)) {
         return false;
     }
     return true;
 }
 /// <summary>
 /// Reads a collection of values from cells in the input range of the selected input data worksheet, 
 /// sequenced in accordance with the input range ordering value.
 /// </summary>
 /// <returns>A collection of cell values.</returns>
 /// <exception cref="System.InvalidOperationException">Either the UsesInput property value is 
 /// false or this ProjectInvocationRule is not in a valid state.</exception>
 public IEnumerable<object> ReadInputData()
 {
     if (!UsesInput || !IsValid) {
         throw new InvalidOperationException();
     }
     var v = new CellRangeValidator(InputCellRange, m_nrProvider);
     Excel.Worksheet ws = GetSheetByKey(m_inputSheetKey);
     Excel.Range r = v.GetRange(ws);
     return Helper.GetRangeValues(r, InputRangeOrder);
 }