我刚开始学习C#并使用Visual Studio编写程序。通过互联网和我的C#书进行了大量的搜索...并询问其他有经验的程序员......没有回答以下问题:add()
方法中的参数/参数“true”是什么意思如下代码行:
var excel = new microsoft.office.interop.excel.application();
var workbook = excel.workbooks.add(true**);
add()
参数通常在括号中没有任何内容,或者可能是1或2表示要打开的工作簿数量......但是“是”?感谢
答案 0 :(得分:1)
以下是C#VSTO Workbooks.Add(...)
的文档:https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.add.aspx,以下是VBA版本的文档:https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbooks-add-method-excel
Office的VSTO COM自动化API肯定需要为C#人机工程学做一些工作。问题是该方法接受COM Variant
值(.NET中为System.Object
)参数值,这意味着它将接受您抛出的任何内容并在内部处理它任何编译时类型的安全性。这是一个糟糕的API设计,相反它应该有类型的重载(“重载”是具有相同名称但强类型参数的不同方法/函数)。但是现在我没有抱怨它:D
进一步混淆的事情,从Boolean
true
值到COM Variant
对象的转换完全是在幕后完成的。但首先,让我们考虑记录的有效参数值:
可选对象。确定如何创建新工作簿。如果此参数是指定现有Microsoft Excel文件名称的字符串,则使用指定文件作为模板创建新工作簿。如果此参数是常量,则新工作簿包含指定类型的单个工作表。可以是以下XlWBATemplate常量之一:xlWBATChart,xlWBATExcel4IntlMacroSheet,xlWBATExcel4MacroSheet或xlWBATWorksheet。如果省略此参数,Microsoft Excel将创建一个包含多个空白工作表的新工作簿(工作表的数量由SheetsInNewWorkbook属性设置)。
......这需要考虑很多!
我们可以推导出重载的内容,然后单独记录它们:
workbook.Add()
- 由于参数是可选的,这意味着您可以不带任何参数调用它。效果是创建一个包含大量空白工作表的新工作簿(其中数字来自SheetsInNewWorkbook
)。workbook.Add( String templateFileName )
- 如果参数是字符串,则将其视为要使用的模板文件的文件名。显然,这不是一个Boolean
值的编组,因此在您的情况下不会发生这种情况。workbook.Add( Int32 constant )
- 文档使用术语“常量”,我认为这实际上意味着Int32
值。它只接受XlWBATemplate
中定义的值https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlwbatemplate-enumeration-excel - 这些值为-4109
,4
,3
和-4167
。< / LI>
文档没有说明如果参数值不是那些会发生什么。它似乎在你的情况下工作的事实表明作为包含bool的COM Variant
传递的值,它被简单地忽略。我不相信运行时会将Boolean
封送到Int32
,给定Variant
支持布尔值,即使它被封送到Int32
,那么你也会可能会出现参数错误,因为1
中未定义XlWBATemplate
。
解决方案:将Workbooks.Add( true )
更改为Workbooks.Add()
,然后查看行为是否有任何变化。如果没有,那就保持变化;否则你在Excel COM API中遇到了一些未记录的行为,你应该在代码注释中记录它(并告诉我们!)