用Excel C-API函数“xlfGetDocument”询问“最后使用的行/列”将返回“实际使用的范围”

我正在使用.NET库,Excel-DNA,将Excel的C-API暴露给C#代码。 使用这样的xlfGetDocument函数(我特别想要ints ):

 int rowLast = ((int)(double)XlCall.Excel(XlCall.xlfGetDocument, 10, sheetName) > 0) ? (int)(double)XlCall.Excel(XlCall.xlfGetDocument, 10, sheetName) - 1 : 0; int colLast = ((int)(double)XlCall.Excel(XlCall.xlfGetDocument, 12, sheetName) > 0) ? (int)(double)XlCall.Excel(XlCall.xlfGetDocument, 12, sheetName) - 1 : 0; 

返回给我一个rowLastrowFirst ,超出了我的数据范围。 根据史蒂夫·道尔顿(Steve Dalton)的书“在C / C ++中使用Excel插件开发的财务应用程序”,这个函数的'10'和'12'参数应该返回最后一个USED列/行。 但这种情况并非如此。

为什么是这样?

从获取上面的表单使用范围之后,我使用Excel-DNA获取实际内容:

 contentReference = new ExcelReference(0, rowLast, 0, colLast); contents = (object[,])contentReference.GetValue(); 

我怎样才能得到实际使用的范围,而不应用filter的内容(似乎这应该只是不必要的开销)?

由于Excel使用稀疏matrix存储scheme,因此它认为上次使用的行/列是包含数据或格式化(或包含数据或格式)的最后一个单元格的行和列。

如果你想要真正的最后使用的范围,你可能更好的使用COM接口做一个Range.Find *。